Python爬虫实战:从零构建完整项目(数据采集+存储+异常处理)
爬虫不是简单的请求+解析,而是一个系统工程。本文将带你体验企业级爬虫开发的核心流程。
一、前言:为什么需要完整的爬虫项目?
作为初学者,你可能写过一些单文件的爬虫脚本,但当面对真实复杂的网络环境、海量数据存储需求及各种突发异常时,这些脚本往往脆弱不堪。真正的爬虫项目,是网络请求、数据解析、持久化存储和健壮性设计的交响乐。本次我们将综合运用Python核心技术,构建一个可投入生产环境的爬虫系统。
二、项目目标与技术栈
项目目标:爬取图书网站(以豆瓣读书为例)的书籍信息,包含:
- 书名
- 作者
- 评分
- 价格
- ISBN
- 简介
技术栈:
- 网络请求:
requests
(处理HTTP请求/响应) - 数据解析:
BeautifulSoup4
(HTML解析) - 数据存储:
SQLite3
(轻量级数据库) - 异常处理:Python内置异常机制 + 自定义重试
- 辅助工具:
logging
(日志记录),time
(速率控制)
三、环境搭建(新手友好)
# 创建虚拟环境(可选但推荐)
python -m venv spider-env
source spider-env/bin/activate # Linux/Mac
spider-env\Scripts\activate # Windows
# 安装核心库
pip install requests beautifulsoup4
📌 重要提示:真实项目中务必添加
requirements.txt
管理依赖!
四、分步构建爬虫系统
4.1 数据采集模块:与网络对话
核心任务:稳定获取目标网页内容
import requests
from fake_useragent import UserAgent # pip install fake-useragent
def fetch_page(url, retries=3):
"""
获取网页内容,含简单重试机制
:param url: 目标URL
:param retries: 最大重试次数
:return: HTML内容 (str) 或 None
"""
headers = {
'User-Agent': UserAgent().random} # 动态生成UA
for attempt in range(retries):
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status() # 自动抛出HTTP错误
return response.text
except (requests.exceptions.RequestException,
requests.exceptions.Timeout) as e:
print(f"请求失败 (尝试 {
attempt+1}/{
retries}): {
e}")
time.sleep(2 ** attempt) # 指数退避策略
return None
关键技术解析:
User-Agent
轮换:绕过基础反爬timeout
设置:防止请求阻塞raise_for_status()
:自动处理HTTP状态码(404, 500等)- 指数退避重试:网络波动时的自愈能力
4.2 数据解析模块:从混沌中提取信息
核心任务:精准抽取目标数据
from bs4 import BeautifulSoup
def parse_book_page(html)