使用Python构建一个简单的Web爬虫
在现代的互联网环境中,数据变得越来越重要。无论是进行市场分析、研究趋势还是自动化信息收集,网络爬虫(Web Crawler) 都是一个非常有用的工具。本文将带你一步步使用 Python 构建一个基础但功能完整的 Web 爬虫,并讲解其中的关键技术。
我们将使用以下库:
requests
:用于发起 HTTP 请求。BeautifulSoup
:用于解析 HTML 内容。csv
:将爬取的数据保存为 CSV 文件。time
:控制请求频率,避免对服务器造成过大压力。环境准备
首先确保你已经安装了 Python(建议版本为 3.8 及以上)。接下来安装所需的第三方库:
pip install requests beautifulsoup4
爬虫原理简介
Web 爬虫的基本工作流程如下:
发送 HTTP 请求获取网页内容;解析 HTML 或 JSON 数据;提取所需信息;存储或展示提取的信息;遵守网站的 robots.txt 和设置合理的请求间隔以避免被封禁。项目目标
我们将在本项目中爬取 https://books.toscrape.com/ 这个专门用于练习爬虫的网站,提取每本书的书名、价格和评分,并将结果保存到 CSV 文件中。
代码实现
1. 导入必要的模块
import requestsfrom bs4 import BeautifulSoupimport csvimport time
2. 定义爬取函数
def fetch_books(url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0 Safari/537.36' } response = requests.get(url, headers=headers) if response.status_code != 200: print(f"Failed to fetch {url}") return [] soup = BeautifulSoup(response.text, 'html.parser') books = [] for item in soup.select('.product_pod'): title = item.select_one('h3 a')['title'] price = item.select_one('.price_color').text rating_class = item.select_one('p')['class'][1] # 获取星级类名,如 "Three" rating = convert_rating(rating_class) books.append({ 'title': title, 'price': price, 'rating': rating }) return books
3. 将星级转换为数字
def convert_rating(rating_str): ratings = { 'One': 1, 'Two': 2, 'Three': 3, 'Four': 4, 'Five': 5 } return ratings.get(rating_str, 0)
4. 主函数与分页处理
def scrape_all_pages(base_url): all_books = [] page_num = 1 while True: url = f"{base_url}catalogue/page-{page_num}.html" print(f"Scraping page {page_num}: {url}") books = fetch_books(url) if not books: print("No more pages found.") break all_books.extend(books) time.sleep(1) # 延迟1秒,防止过快请求 page_num += 1 return all_books
5. 保存数据到 CSV 文件
def save_to_csv(data, filename='books.csv'): with open(filename, mode='w', newline='', encoding='utf-8') as file: writer = csv.DictWriter(file, fieldnames=['title', 'price', 'rating']) writer.writeheader() writer.writerows(data) print(f"Saved {len(data)} books to {filename}")
6. 启动爬虫程序
if __name__ == '__main__': base_url = 'https://books.toscrape.com/' books_data = scrape_all_pages(base_url) save_to_csv(books_data)
运行结果示例
运行上述脚本后,会在当前目录下生成一个名为 books.csv
的文件,内容如下:
title | price | rating |
---|---|---|
A Light in the Attic | £51.77 | 3 |
Fifty Shades of Grey | £52.15 | 1 |
The Great Gatsby | £13.99 | 4 |
... | ... | ... |
注意事项与优化建议
1. 遵守网站规则
在爬取任何网站之前,请务必查看其 robots.txt
文件,例如:https://books.toscrape.com/robots.txt,遵守其允许的路径和频率限制。
2. 异常处理增强
目前代码中没有加入详细的异常捕获机制,实际应用中应考虑加入 try-except
块来处理连接失败、超时等问题。
3. 使用代理和 User-Agent 池
为了更稳定地进行大规模抓取,可以引入随机 User-Agent 和 IP 代理池。
4. 多线程或异步爬虫
如果需要提高效率,可以使用 concurrent.futures
实现多线程爬取,或者使用 aiohttp
+ asyncio
实现异步非阻塞式爬虫。
总结
通过本文的学习,你已经掌握了一个简单但完整的 Web 爬虫的构建过程。我们使用了 Python 中的 requests
和 BeautifulSoup
来获取并解析网页数据,并将其存储为结构化的 CSV 文件。
爬虫是通往数据驱动世界的一扇大门,而 Python 是打开这扇门的绝佳钥匙。希望你能在此基础上继续深入学习,比如探索 Scrapy 框架、Selenium 自动化测试等高级主题。
如果你有兴趣进一步了解如何使用 Scrapy 框架来重构这个爬虫,欢迎留言或关注后续文章!
完整源码地址:你可以将上述所有代码段组合成一个
.py
文件即可运行。
如需导出 PDF 或 Markdown 格式,请告诉我,我可以为你整理。