ASP源码
PHP源码
.NET源码
JSP源码
随着爬虫场景的不断升级,Scrapy 虽然成熟稳定,但在异步支持、WebSocket 和现代请求库等方面有一些局限。
scrapy_cffi 是在 Scrapy 风格基础上重构的异步爬虫框架,支持更现代的请求库、扩展机制和异步 DB/MQ 管理。
通过这篇教程,你可以快速创建自己的异步爬虫项目,并体验框架的核心特性。
Scrapy 本身虽然功能强大,但存在一些痛点:
重构目标:
curl_cffi 替代 twistedpip install scrapy_cffi
# 新建项目
scrapy-cffi startproject
cd
# 生成爬虫
scrapy-cffi genspider
"""
genspider 后可选参数:
-r 创建 redis 爬虫
-m 创建 rabbitmq 爬虫
-k 启用 kafka 日志队列
"""
# 运行爬虫
python runner.py
框架的配置基于 pydantic,支持类型校验和 IDE 自动补全。大部分简单请求参数(如并发数、延迟、重试、UA 等)开箱即用,下面是一些配置注意事项:
MAX_GLOBAL_CONCURRENT_TASKS
未配置可能触发 fd 上限,尤其是 Windows。
QUEUE_NAME
只在 run_spider 模式下有效;在 run_all_spiders 或分布式 WebSocket 爬虫下必须单独配置,否则会抢队列。
数据库/消息队列(Redis / RabbitMQ / Kafka)
只需配置 URL 和集群相关选项,框架会自动维护连接。
.env 与 settings.py
支持自动转换,部署更方便,不用担心配置冲突。
更多配置见 docs
框架完全异步,但爬虫层可以灵活编写:
yield 或直接 return 请求和数据项async def parse(self, response):
# 异步请求示例
yield HttpRequest(url="https://example.com")
yield Item(name="demo")
middlewares 改名为 interceptorsxpath/css/re 选择器bbpb 支持 Protobuf 编码与解码推荐项目结构:
/project
|
|- cpy_resources
| |- module1_dir
| | |- build_dir
| | | |- libmodule1.dll # Windows 编译的C扩展二进制文件
| | | |- libmodule1.so # Linux 编译的 C 扩展二进制文件
| | | |- libmodule1.dylib # macOS 编译的 C 扩展二进制文件
| | |
| | |- module1.pyi # 可选,用于 ide 代码提示
| | |- fallback.py # C 扩展加载失败后可以尝试加载的纯 python 实现
| | |- wrapper.py # 通过 ctypes 加载 C 扩展的核心实现
| |
| |- module2_dir
| |- ...
|
|- extensions
|- interceptors
|- items
|- pipelines
|- spiders
|- settings.py
|- runner.py
然后在配置 settings.py 中定义:
settings.CPY_EXTENSIONS.DIR = "cpy_extensions"
from scrapy_cffi.models import CPYExtension
settings.CPY_EXTENSIONS.RESOURCES = [
CPYExtension(module_name="module1_dir")
]
框架会将扩展程序注入全局(应当避免和某些模块重名),在任意代码中直接使用
import module1_dir
hooks 提供核心功能通过 CLI 可以直接生成可运行 demo 项目:
scrapy-cffi demo
"""
可选参数:
-r 创建 redis demo
-m 创建 rabbitmq demo
-k 启用 kafka 日志队列