Scrapy 下载中间件 详解

何为下载中间件

下载器中间件是 Scrapy的请求/响应处理的类。这是一个轻量级的低级系统,用于全局更改Scrapy的请求和响应。

使用

要激活下载程序中间件组件,请将其添加到 DOWNLOADER_MIDDLEWARES设置中,这是一个dict,其键为中间件类路径,其值为中间件顺序(权重)

# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
   'lagouApp.middlewares.LagouappDownloaderMiddleware': 543,
}

将该DOWNLOADER_MIDDLEWARES设置与DOWNLOADER_MIDDLEWARES_BASEScrapy 中定义的设置合并 (而不是被覆盖),然后按顺序进行排序,以获取启用的中间件的最终排序列表,请求会按照小到大执行,响应会按照大到小执行,其各个中间件权重大小的决定,可参照DOWNLOADER_MIDDLEWARES_BASE设置。

如果要禁某个中间件 把它设置为 None 就好。
mark

内置下载中间件

CookiesMiddleware

属于 scrapy.downloadermiddlewares.cookies.CookiesMiddleware

使用此中间件,可以处理需要cookie的站点,例如使用会话的站点。它会跟踪Web服务器发送的cookie,并像网络浏览器一样,将其发送回后续请求(来自该蜘蛛)。

注意 meta.get(‘cookiejar’) 不是“粘性”的您需要在后续请求中继续传递它

def parse_page(self, response):
    # do some processing
    return scrapy.Request(
                            "https://bigdataboy.cn",
                            meta={
                                'cookiejar':response.meta['cookiejar']
                            },
                            callback=self.parse_other_page
                        )

相关设置

COOKIES_ENABLED

默认启用 cookies
# Disable cookies (enabled by default)  是否启用 cookies 
# COOKIES_ENABLED = True

COOKIES_DEBUG

如果启用,Scrapy将记录请求中发送的所有cookie(即Cookie 标头)和响应中接收的所有cookie(即Set-Cookie标头)。

COOKIES_DEBUG = False

开启效果

2020-01-14 20:20:26 [scrapy.downloadermiddlewares.cookies] DEBUG: Received cookies from: <200 https://bigdataboy.cn>
Set-Cookie: JSESSIONID=ABAAABAAAEEAAII73F8A39DC3BF1352400CBB34ABA2AB47; Path=/; HttpOnly

Set-Cookie: SEARCH_ID=11c20adceed742cd9ed906fe2e0c47ad; Version=1; Max-Age=86400; Expires=Wed, 15-Jan-2020 12:20:28 GMT; Path=/

Set-Cookie: user_trace_token=20200114202028-23b9b484-6bec-4761-a4ec-4a08c2bae9e9; Max-Age=31536000; Path=/; Domain=.lagou.com;

2020-01-14 20:20:26 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://bigdataboy.cn> (referer: None)

UserAgentMiddleware

属于 scrapy.downloadermiddlewares.useragent.UserAgentMiddleware 类

允许蜘蛛覆盖默认用户代理的中间件。

为了使Spider可以覆盖默认用户代理,user_agent 必须设置其属性。

DefaultHeadersMiddleware

属于 scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware

该中间件会把setting中指定的所有默认请求标头加入

HttpProxyMiddleware

属于 scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware 类

该中间件通过设置 Request.meta 的 proxy 值来 设置代理池 和 设置 Request.headers里的认证头部 (Proxy-Authorization)

DownloadTimeoutMiddleware

属于 scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware 类

该中间件会获取 DOWNLOAD_TIMEOUT 的值给 蜘蛛设置下载的超时时间 。

还可以给每个 Request.meta 设置 download_timeout 属性,单独设置超时时间。

HttpAuthMiddleware

属于 scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware 类

该中间件使用基本访问身份验证(也称为HTTP身份验证)对从某些蜘蛛生成的所有请求进行身份验证。

要启用某些蜘蛛网的HTTP身份验证,请设置这些蜘蛛网的http_userhttp_pass属性。

from scrapy.spiders import CrawlSpider

class SomeIntranetSiteSpider(CrawlSpider):

    http_user = 'someuser'
    http_pass = 'somepass'
    name = 'bigdataboy.cn'

    # .. rest of the spider code omitted ...

HttpCacheMiddleware

属于 scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware 类

该中间件为所有HTTP请求和响应提供了低级缓存。它必须与缓存存储后端以及缓存策略结合使用

HttpCompressionMiddleware

属于 scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware 类

该中间件允许从网站发送/接收压缩(gzip,deflate)流量。

如果安装了brotlipy,此中间件还支持解码brotli压缩的响应

相关设置

COMPRESSION_ENABLED

COMPRESSION_ENABLED = True

RedirectMiddleware

属于 scrapy.downloadermiddlewares.redirect.RedirectMiddleware 类

该中间件根据响应状态处理请求的重定向。

可以在 Request.metaredirect_urls 中找到请求通过的URL(在重定向时)。

还可以在 Request.metaredirect_reasons中找到 每个重定向的背后原因。例如:。[301, 302, 307, 'meta refresh']

相关设置

REDIRECT_ENABLED

# 启用 重定向中间件
REDIRECT_ENABLED = True

REDIRECT_MAX_TIMES

# 单个请求将遵循的最大重定向数。
REDIRECT_MAX_TIMES = 20

RetryMiddleware

属于 scrapy.downloadermiddlewares.retry.RetryMiddleware 类

中间件,用于重试失败的请求,这些请求可能是由临时问题(例如连接超时或HTTP 500错误)引起的。

蜘蛛完成对所有常规(非失败)页面的爬网之后,将在抓取过程中收集失败的页面,并在最后进行重新请求。

相关设置

RETRY_ENABLED

# 启用“重试”中间件。
RETRY_ENABLED = True

RETRY_TIMES

# 除了首次下载外,最大重试次数。
RETRY_TIMES = 2

RETRY_HTTP_CODES

# 重试哪个HTTP响应代码。
RETRY_HTTP_CODES = [500, 502, 503, 504, 522, 524, 408, 429]

DownloaderStats

属于 scrapy.downloadermiddlewares.stats.DownloaderStats 类

中间件,用于存储通过它的所有请求,响应和异常的统计信息。

要使用此中间件,必须启用该 DOWNLOADER_STATS = True (默认开启)。

AjaxCrawlMiddleware

属于 scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware 类

基于元片段html标签找到“ AJAX可抓取”页面变体的中间件。有关 更多信息,请参见 https://developers.google.com/webmasters/ajax-crawling/docs/getting-started。

发表评论 / Comment

用心评论~