使用 Python 实现一个简单的 Web 爬虫
在互联网时代,数据是最宝贵的资源之一。Web 爬虫(Web Crawler)是一种自动获取网页内容的程序,广泛应用于搜索引擎、数据分析、价格监控等领域。本文将介绍如何使用 Python 编写一个简单的 Web 爬虫,并展示其核心实现原理。
我们将使用 Python 中的 requests
和 BeautifulSoup
两个库来完成这个任务。如果你还没有安装这些库,可以通过以下命令安装:
pip install requests beautifulsoup4
Web 爬虫的基本工作原理
Web 爬虫的工作流程大致如下:
发起请求:向目标网站发送 HTTP 请求。接收响应:获取服务器返回的 HTML 页面内容。解析页面:提取感兴趣的数据。保存数据:将提取到的数据进行存储或进一步处理。我们将在下面的示例中逐步实现上述步骤。
构建爬虫项目结构
为了使代码结构清晰,我们可以创建一个基本的项目结构:
web_crawler/│├── crawler.py # 主程序文件├── requirements.txt # 依赖库列表└── output/ └── results.csv # 存储抓取结果
编写爬虫代码
3.1 导入必要的模块
import requestsfrom bs4 import BeautifulSoupimport csvimport time
requests
:用于发送网络请求。BeautifulSoup
:用于解析 HTML 文档。csv
:用于将数据保存为 CSV 文件。time
:用于设置请求间隔,避免频繁访问目标网站。3.2 发送请求并获取页面内容
def fetch_page(url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } try: response = requests.get(url, headers=headers, timeout=10) if response.status_code == 200: return response.text else: print(f"Failed to fetch page: {url}, status code: {response.status_code}") return None except Exception as e: print(f"Error fetching page: {e}") return None
此函数用于获取指定 URL 的 HTML 内容,并设置了 User-Agent 避免被识别为爬虫。
3.3 解析 HTML 并提取数据
假设我们要从一个书籍信息页面中提取书名和价格。HTML 结构如下(简化版):
<div class="book"> <h3>Python编程入门</h3> <span class="price">¥59.90</span></div><div class="book"> <h3>深入理解机器学习</h3> <span class="price">¥89.00</span></div>
对应的解析代码如下:
def parse_books(html): soup = BeautifulSoup(html, 'html.parser') books = [] for item in soup.find_all('div', class_='book'): title = item.find('h3').get_text(strip=True) price = item.find('span', class_='price').get_text(strip=True) books.append({ 'title': title, 'price': price }) return books
该函数会遍历所有包含书籍信息的 <div>
标签,并提取标题和价格。
3.4 保存数据到 CSV 文件
def save_to_csv(data, filename='output/results.csv'): with open(filename, mode='w', newline='', encoding='utf-8') as file: writer = csv.DictWriter(file, fieldnames=['title', 'price']) writer.writeheader() writer.writerows(data)
3.5 整合主函数逻辑
def main(): base_url = "https://example.com/books?page={}" all_books = [] for page in range(1, 4): # 抓取前3页 url = base_url.format(page) print(f"Fetching page: {url}") html = fetch_page(url) if html: books = parse_books(html) all_books.extend(books) time.sleep(2) # 设置延迟,避免触发反爬机制 if all_books: save_to_csv(all_books) print(f"成功抓取 {len(all_books)} 条书籍信息,并保存至 output/results.csv") else: print("未抓取到任何书籍信息。")if __name__ == '__main__': main()
这段代码实现了完整的爬取流程:循环抓取多页内容、解析每一页、合并所有书籍信息并保存到 CSV 文件中。
注意事项与优化建议
4.1 反爬机制应对策略
设置请求头(Headers):模拟浏览器访问。设置请求间隔(time.sleep):避免短时间内大量请求。使用代理 IP 池:防止 IP 被封禁。使用 Selenium 或 Playwright:模拟浏览器行为,绕过 JavaScript 渲染限制。4.2 数据清洗与异常处理
对提取字段做非空判断。使用正则表达式清理价格字段中的符号。添加日志记录功能以便调试。4.3 合法性说明
在实际部署爬虫之前,请确保你已阅读并遵守目标网站的 robots.txt 协议以及相关法律法规,尊重网站的爬取政策,避免对目标服务器造成压力。
总结
本文通过一个完整的示例介绍了如何使用 Python 编写一个基础的 Web 爬虫程序。我们使用了 requests
获取网页内容,用 BeautifulSoup
提取所需数据,并将其保存为 CSV 文件。虽然这是一个简单的实现,但它展示了爬虫开发的基本思路和技术栈。
随着需求的复杂化,你可以进一步扩展功能,例如支持异步请求(使用 aiohttp
)、分布式爬取(使用 Scrapy + Redis)、持久化存储(MySQL、MongoDB)等。希望这篇文章能为你开启 Web 爬虫技术的大门。
完整代码仓库地址(可选):[GitHub 示例链接]
如需进一步学习,推荐查看:
Requests 官方文档BeautifulSoup 官方文档Scrapy 框架