一、学习路径总览
1.1 阶段划分
- 初级:理解HTTP、HTML与选择器;掌握requests与基础解析。
- 进阶:XPath与lxml、异步IO与并发、代理与限速、常见存储。
- 工程化:Scrapy框架、管道与中间件、去重与调度、监控与告警。
- 高级:动态渲染(Playwright/Selenium)、反爬策略、分布式调度与任务编排。
1.2 学习目标
- 能稳定抓取指定站点的结构化数据,并处理分页与列表-详情。
- 能在合规前提下处理登录、会话、限速与重试,提升成功率。
- 能进行数据清洗与入库,并实现增量更新与幂等。
- 能搭建监控与告警,评估采集质量与异常分布。
1.3 必备基础
- Python语法、虚拟环境与包管理(venv、pip/poetry)。
- HTTP协议、请求头、Cookie/Session、状态码与重定向。
- HTML/DOM、CSS选择器、XPath、正则与JSON处理。
- 字符编码与文件处理、简单数据库操作(SQLite/PostgreSQL)。
二、环境与工具
2.1 开发环境
- 选择稳定的Python版本与虚拟环境;分离项目依赖与系统环境。
- 使用
.env或配置文件管理密钥与配置,避免硬编码。
2.2 常用工具
- 浏览器开发者工具:Network、Elements用于接口识别与选择器定位。
- 抓包与代理:Mitmproxy/Charles,用于请求分析与签名排查。
- 日志与调试:结构化日志、断言与最小复现实验。
2.3 项目结构建议
spiders/采集策略与站点实现parsers/页面与响应解析器pipelines/数据清洗与存储逻辑storage/DB/CSV/对象存储与客户端common/工具库、限速、重试、规范化configs/配置与密钥管理
三、核心技能与练习
3.1 requests与重试
python
import time
import requests
def fetch(url, headers=None, retries=3, timeout=10):
h = headers or {"User-Agent": "Mozilla/5.0"}
for i in range(retries):
try:
r = requests.get(url, headers=h, timeout=timeout)
r.raise_for_status()
return r.text
except Exception:
time.sleep(2 ** i)
return None
3.2 HTML解析(BeautifulSoup)
python
from bs4 import BeautifulSoup
def parse_title(html):
soup = BeautifulSoup(html, "html.parser")
return soup.select_one("title").get_text(strip=True) if soup.select_one("title") else None
3.3 XPath定位(lxml)
python
from lxml import html as lxml_html
def parse_with_xpath(text):
doc = lxml_html.fromstring(text)
return doc.xpath("//h1/text()")
3.4 分页与列表-详情
python
import requests
from bs4 import BeautifulSoup
def crawl_pages(seed):
url = seed
results = []
while url:
r = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
soup = BeautifulSoup(r.text, "html.parser")
for a in soup.select(".item a.detail"):
results.append(a["href"])
nxt = soup.select_one("a.next")
url = nxt["href"] if nxt else None
return results
3.5 代理与限速
python
import time
import requests
proxies = {"http": "http://user:pass@host:port", "https": "http://user:pass@host:port"}
def get_with_rate(url, delay=1.2):
r = requests.get(url, headers={"User-Agent": "Mozilla/5.0"}, proxies=proxies, timeout=10)
time.sleep(delay)
return r.text
3.6 数据存储(CSV/SQLite)
python
import csv
def write_csv(path, rows):
with open(path, "w", newline="", encoding="utf-8") as f:
w = csv.writer(f)
w.writerow(["title", "url"])
for r in rows:
w.writerow([r["title"], r["url"]])
四、异步与并发
4.1 aiohttp并发抓取
python
import asyncio
import aiohttp
async def fetch(session, url):
async with session.get(url) as resp:
return await resp.text()
async def run(urls, max_concurrency=8):
sem = asyncio.Semaphore(max_concurrency)
async with aiohttp.ClientSession(headers={"User-Agent": "Mozilla/5.0"}) as session:
async def task(u):
async with sem:
return await fetch(session, u)
return await asyncio.gather(*[task(u) for u in urls])
4.2 限速与退避
- 使用信号量与队列控制并发,保障目标站点稳定性。
- 使用指数退避处理短期错误,避免雪崩与拥塞。
五、工程化:Scrapy
5.1 组件与概念
- Spider:生成请求并解析响应。
- Scheduler/Downloader:队列与下载控制,中间件可扩展。
- Item/Pipeline:数据结构与清洗入库。
- 去重与优先级:按URL规范化与深度控制抓取顺序。
5.2 关键配置
CONCURRENT_REQUESTS、DOWNLOAD_DELAY、AUTOTHROTTLE_ENABLED。- 代理与UA中间件、重试、超时与日志级别。
5.3 示例Spider
python
import scrapy
class ExampleSpider(scrapy.Spider):
name = "example"
start_urls = ["https://example.com"]
def parse(self, response):
yield {"title": response.css("title::text").get()}
for href in response.css("a::attr(href)").getall():
yield scrapy.Request(response.urljoin(href), callback=self.parse)
六、动态渲染与交互
6.1 Playwright示例
python
import asyncio
from playwright.async_api import async_playwright
async def render(url):
async with async_playwright() as p:
browser = await p.chromium.launch()
page = await browser.new_page()
await page.goto(url)
await page.wait_for_load_state("networkidle")
text = await page.text_content("title")
await browser.close()
return text
6.2 适用场景
- 强JS渲染、滚动加载、登录与交互驱动内容。
- 拦截无关资源与请求,关注必要接口以提升性能。
七、反爬与合规
7.1 基本原则
- 遵守robots.txt与服务条款,在允许范围内访问。
- 控制速率与并发,避免对目标造成压力。
- 谨慎处理个人数据与隐私,遵循合规要求。
7.2 常见策略与应对
- UA与Header校验、IP封锁、验证码与人机识别、JS混淆与指纹。
- 随机化访问路径与时间、优质代理、必要时使用渲染。
八、质量控制与监控
8.1 指标
- 采集量、成功率、错误分布、延迟、队列深度、代理有效率。
8.2 质量评估
- 字段完整率、数据去重率、增量差异与版本比对。
8.3 告警与自愈
- 阈值告警、自动重试与熔断、异常定位与回溯。
九、实战路线图(8周示例)
- 第1周:HTTP与requests;抓取静态页面与标题。
- 第2周:CSS选择器与XPath;完成列表-详情采集与分页。
- 第3周:代理与限速;数据入库(CSV/SQLite)。
- 第4周:异步IO与aiohttp;并发与背压控制。
- 第5周:Scrapy基础;Spider/Item/Pipeline与配置。
- 第6周:中间件、去重与增量;监控与日志。
- 第7周:Playwright动态渲染;处理滚动加载与接口分析。
- 第8周:合规与质量评估;小型项目验收与复盘。
十、常见问题清单
- 403/429:检查UA、来源、代理质量与速率,采用退避与限速。
- 编码异常:确认Charset与Content-Type,统一解析器与编码。
- 分页丢失:校验下一页选择器与边界条件,记录最后成功页。
- 登录态过期:维护会话与Cookie刷新机制,隔离认证信息。
- 结构变动:编写更稳健的选择器与回归测试,建立告警。
十一、学习资源
- 官方文档:Requests、BeautifulSoup、lxml、Scrapy、Playwright。
- 标准规范:HTTP/1.1、robots.txt与Sitemap。
- 实战项目与博客:选择开源爬虫项目进行源码学习与复现。
十二、进阶方向
- 分布式抓取与任务编排(Airflow、Celery)。
- 消息队列与数据管道(Kafka/Redis/MQ)。
- 数据治理与知识图谱构建。
结语 学习爬虫需要从协议与解析的基础出发,以稳健与合规为核心,逐步掌握并发与工程化能力,再扩展到动态渲染与分布式调度。通过小步快跑的项目练习与质量监控建设,形成可维护、可复用的采集体系。