🛠️ Python 爬虫实战教学:豆瓣电影 Top250 同步与异步实战手册
前言: 在爬虫领域,效率即生命。当我们需要采集数万条数据时,单线程同步爬取的等待时间是无法接受的。本文将通过实战代码,带你从最基础的同步逻辑演进到极致并发的协程方案。
🛠️ 一、 核心工具栈
本案例的核心逻辑构建在以下几个实用主义优先的库之上:
- 数据采集:
requests(同步标准替代方案)/aiohttp(异步高性能库) - 数据解析:
lxml.etree→ 用 XPath 直接定位 DOM,效率远超正则 - 存储优化:
DataRecorder→ 支持多线程/进程安全写入,自动处理 Excel 锁和表头 - 逻辑补全:
itertools.zip_longest→ 解决短评缺失导致的数据偏移问题
🧠 二、 任务拆分核心逻辑
并发编程不能直接套同步的 for 循环——必须把任务“原子化”成独立可调度单元:
- 同步流程:
请求页→解析页→写入文件打包成一大块,全程阻塞等待 - 并发/异步流程:只把「请求并解析返回一页数据」做成原子,由调度器(线程池/事件循环)统一分发
🚀 三、 全方案代码实战
前置准备:一键配置环境
直接复制下面的命令,安装所有必需依赖:
1. 同步爬取:爬虫入门基石
逻辑线性清晰,但全程卡 I/O,适合理解完整流程
2. 多线程方案:兼容旧库的首选
通过 ThreadPoolExecutor 快速提速,资源占用比多进程低,完美兼容 requests
3. 协程方案:单线程极致吞吐量
需使用异步 HTTP 库 aiohttp,资源消耗最低,并发能力最强
📊 四、 选型与优化建议
1. 方案选型指南
2. 避坑优化建议
- 控制并发数:豆瓣有请求频率限制,建议
max_workers/协程数控制在 5-10 - 批量写磁盘:不要在
for循环里逐页调用recorder.record(),最后统一写可降低 90%+ 的磁盘I/O - 复用会话:同步用
requests.Session(),异步用aiohttp.ClientSession(),复用 TCP 连接可提效 30% 左右

