不管做什么爬虫,最终架构往往都会朝 Scrapy 方向靠拢。但随着 Scrapy 框架的发展,一些底层功能已经不那么容易修改,尤其是:
- IDE 代码提示支持有限
- asyncio 异步支持较弱
即便在新版本 Scrapy 中,官方也在逐步迁移底层架构,但仍存在一定局限。对于曾经的 Twisted 异步请求库,底层扩展更是受限。
为什么重写 Scrapy
基于上述原因,我重写了 Scrapy 框架,目标是:
- 现代化请求库:使用
curl_cffi
- 支持协议:HTTP / WebSocket(QUIC 协议依赖底层请求库的未来实现)
- 保持 Scrapy 风格:依然熟悉 Scrapy 的项目结构和 API
为什么选择 curl_cffi
而非 Twisted
传统 Scrapy 架构模块化,爬虫、调度器和中间件是解耦的,但 下载器层依赖 Twisted:
- Scrapy 下载器通过 Twisted 执行异步请求
- 支持 TCP/UDP 协议,但 QUIC 协议在 Python 层难以实现
- 由于 Twisted 异步模型,底层请求库更换或现代化异步改造较困难
现代化爬虫则采用 请求库 + 调度解耦 的架构:
- 请求库独立,可以自由选择,如
curl_cffi:1.
基于 libcurl,性能快 2.支持 TLS 3.API 类似requests
,易用性高 - 调度独立,负责任务管理和异步调度
- 优点:方便替换请求库、灵活扩展协议
- 缺点:更依赖底层请求库的稳定性
相关文档在 github 的 docs/ 下配套。
安装:
pip install scrapy_cffi
快速构建:
# 新建项目
scrapy-cffi startproject <project_name>
cd <project_name>
# 生成爬虫
scrapy-cffi genspider <spider_name> <domain>
# 运行爬虫
python runner.py