【Scrapy】Scrapy 中间件等级设置规则


准我快乐地重饰演某段美丽故事主人

饰演你旧年共寻梦的恋人

再去做没流着情泪的伊人

假装再有从前演过的戏份

重饰演某段美丽故事主人

饰演你旧年共寻梦的恋人

你纵是未明白仍夜深一人

穿起你那无言毛衣当跟你接近

🎵 陈慧娴《傻女》


Scrapy 是一个功能强大的爬虫框架,通过使用中间件(middleware),用户可以自定义和扩展爬虫的行为。中间件提供了对请求和响应进行预处理和后处理的机制,使用户可以在不修改核心代码的情况下增强爬虫的功能。

在 Scrapy 中,中间件的执行顺序由它们的"等级"(priority)决定。了解和正确设置中间件的等级对于构建高效和可维护的爬虫至关重要。

什么是中间件?

中间件是 Scrapy 中的一种钩子,允许用户在处理请求和响应时执行自定义代码。中间件分为两类:

  • Downloader Middleware:处理下载器相关的请求和响应。
  • Spider Middleware:处理爬虫(spider)相关的输入和输出。

中间件的等级

中间件的等级决定了它们的执行顺序。Scrapy 使用一个整数值来表示中间件的等级,值越小,中间件越先执行。

  • 下载器中间件(Downloader Middleware)
    下载器中间件位于 Scrapy 的下载器和引擎之间。以下是一个示例配置:
python 复制代码
DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.CustomDownloaderMiddleware': 543,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 400,
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': 500,
}

在上述配置中:

复制代码
CustomDownloaderMiddleware 的等级为 543
UserAgentMiddleware 的等级为 400
RetryMiddleware 的等级为 500

执行顺序如下:

复制代码
UserAgentMiddleware(400)
RetryMiddleware(500)
CustomDownloaderMiddleware(543)

请求从引擎发出,先经过等级较低的中间件,最后到达下载器。响应从下载器返回时,先经过等级较高的中间件,最后到达引擎。

爬虫中间件(Spider Middleware)

爬虫中间件位于引擎和爬虫之间。以下是一个示例配置:

python 复制代码
SPIDER_MIDDLEWARES = {
    'myproject.middlewares.CustomSpiderMiddleware': 543,
    'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 50,
    'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': 500,
}

在上述配置中:

复制代码
CustomSpiderMiddleware 的等级为 543
HttpErrorMiddleware 的等级为 50
OffsiteMiddleware 的等级为 500

执行顺序如下:

复制代码
HttpErrorMiddleware(50)
OffsiteMiddleware(500)
CustomSpiderMiddleware(543)

请求从引擎发出,先经过等级较低的中间件,最后到达爬虫。响应从爬虫返回时,先经过等级较高的中间件,最后到达引擎。

如何设置中间件的等级

为了设置中间件的等级,需要在 Scrapy 的配置文件 settings.py 中定义相应的字典,指定中间件的路径和等级。例如:

python 复制代码
DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.CustomDownloaderMiddleware': 543,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 400,
}

SPIDER_MIDDLEWARES = {
    'myproject.middlewares.CustomSpiderMiddleware': 543,
    'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 50,
}

在这个例子中,我们定义了一个下载器中间件 CustomDownloaderMiddleware 和一个爬虫中间件 CustomSpiderMiddleware,并分别设置它们的等级为 543。

常见的中间件及其默认等级

Scrapy 提供了许多内置中间件,每个中间件都有默认的等级。以下是一些常见的下载器中间件及其默认等级:

复制代码
UserAgentMiddleware: 400
RetryMiddleware: 500
RedirectMiddleware: 600
CookiesMiddleware: 700

对于爬虫中间件,常见的有:

复制代码
HttpErrorMiddleware: 50
OffsiteMiddleware: 500
RefererMiddleware: 700

结论

中间件是 Scrapy 框架中一个强大的特性,通过正确设置中间件的等级,可以精细控制请求和响应的处理过程。理解和使用中间件的等级设置规则,有助于构建更加灵活和高效的爬虫系统。

相关推荐
失败又激情的man5 小时前
Scrapy进阶封装(第四阶段:中间件设置,动态UA,ip代理池)
爬虫·scrapy·中间件
亲爱的非洲野猪7 小时前
Kafka消息积压的多维度解决方案:超越简单扩容的完整策略
java·分布式·中间件·kafka
摘星编程17 小时前
深入理解责任链模式:从HTTP中间件到异常处理的实战应用
http·设计模式·中间件·责任链模式·实战应用
~山有木兮2 天前
LiteHub中间件之限流实现
网络·http·中间件
fo安方2 天前
运维的利器–监控–zabbix–第三步:配置zabbix–中间件–Tomcat–步骤+验证
运维·中间件·zabbix
Code季风3 天前
Gin 中间件详解与实践
学习·中间件·golang·go·gin
一只程序汪4 天前
【如何实现分布式压测中间件】
分布式·中间件
William一直在路上4 天前
主流分布式中间件及其选型
分布式·中间件
listhi52014 天前
深入浅出Node.js中间件机制
中间件·node.js