详解scrapy内置中间件的顺序

1. scrapy内置中间件的作用

scrapy内置中间件可以拦截scrapy请求和响应,实现一些自动化和优化的操作,如自动添加请求头、代理管理、重试机制和爬虫速度控制等。scrapy内置中间件的使用可以大大简化爬虫的开发,提高爬虫效率。

2. scrapy内置中间件的运行机制

scrapy内置中间件是按照优先级从高到低顺序执行的,每个中间件可以在请求被发送到下载器之前或之后以及响应返回到引擎之前或之后处理它们。在执行中,每个中间件接收到前一个中间件处理后的请求或响应,经过自己的处理后,再将结果传递到下一个中间件。如果中间件需要返回结果,则必须将结果返回给引擎或下一个中间件。

3. scrapy内置中间件的顺序

scrapy内置中间件的默认顺序如下所示:

SPIDER_MIDDLEWARES = {

'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 50,

'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': 500,

'scrapy.spidermiddlewares.referer.RefererMiddleware': 700,

'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware': 800,

'scrapy.spidermiddlewares.depth.DepthMiddleware': 900,

}

DOWNLOADER_MIDDLEWARES = {

'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100,

'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 300,

'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350,

'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 400,

'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,

'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': 580,

'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600,

'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700,

'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,

'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 800,

'scrapy.downloadermiddlewares.stats.DownloaderStats': 850,

'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 900,

}

3.1 下载器中间件的顺序

在下载器中间件中,重试中间件(RetryMiddleware)和代理中间件(HttpProxyMiddleware)的位置非常重要,这两个中间件的位置会直接影响代理的使用和请求的成功率。

如果代理中间件在重试中间件之前,则当请求失败时,代理中间件会立即根据代理配置的策略更换代理,然后发送新的请求进行重试。这种情况下,如果代理策略比较稳定,可以有效提高请求的成功率。

如果代理中间件在重试中间件之后,则会先对请求进行多次重试,如果所有重试都失败了,才会根据代理策略更换代理。这种情况下,如果代理策略比较稳定,可以减少代理的更换,提高请求成功率。

3.2 爬虫中间件的顺序

在爬虫中间件中,去重中间件(DupeFilterMiddleware)和调度中间件(SchedulerMiddleware)的位置非常重要,这两个中间件的位置会直接影响爬虫的去重和调度。

如果去重中间件在调度中间件之前,则所有的请求在进入调度器之前都会被去重中间件过滤掉,不会被重复请求。这种情况下,可以有效减少重复请求的次数。

如果去重中间件在调度中间件之后,则所有的请求都可以进入调度器,但是在从调度器取出请求时,会被去重中间件进行判断,判断是否需要重复请求。这种情况下,可以控制一定的请求量,在保证去重的基础上,增加一定的请求量。

4. 自定义中间件的使用

如果想要自定义中间件,只需要按照如下步骤操作:

1. 创建自定义中间件文件,继承相应的中间件类,重写对应的方法。

2. 在settings.py中添加中间件,在MIDDLEWARES_CONFIG中添加自定义中间件类路径和优先级。

具体实现代码如下:

# 自定义中间件

class CustomMiddleware(object):

def process_request(self, request, spider):

# 处理请求

pass

def process_response(self, request, response, spider):

# 处理响应

return response

# settings.py

DOWNLOADER_MIDDLEWARES = {

'myproject.middlewares.CustomMiddleware': 543,

}

这里指定了一个自定义的中间件类CustomMiddleware,并将其添加到DOWNLOADER_MIDDLEWARES中,指定优先级为543。

5. 小结

scrapy内置中间件的顺序对于爬虫的性能和效率具有非常重要的影响,需要根据实际需求进行调整。同时,如果需要自定义中间件,在添加时也可以指定优先级,以便更好地控制中间件的执行顺序。

后端开发标签