爬虫蜘蛛Scrapy内置下载中间件详细分析DOWNLOADER_MIDDLEWARES(58)python Scrapy教程1.51以上版本
此页面描述了Scrapy附带的所有下载中间件组件。有关如何使用它们以及如何编写自己的下载程序中间件的信息,请参阅下载程序中间件使用指南。
有关默认启用的组件列表(及其订单),请参阅 DOWNLOADER_MIDDLEWARES_BASE
设置。
DefaultHeadersMiddleware
- class
scrapy.downloadermiddlewares.defaultheaders.
DefaultHeadersMiddleware
- 此中间件设置设置中指定的所有默认请求标头
DEFAULT_REQUEST_HEADERS
。
DownloadTimeoutMiddleware
- class
scrapy.downloadermiddlewares.downloadtimeout.
DownloadTimeoutMiddleware
- 此中间件为
DOWNLOAD_TIMEOUT
设置或download_timeout
spider属性中指定的请求设置下载超时 。
注意
您还可以使用download_timeout
Request.meta键设置每个请求的下载超时 ; 即使禁用DownloadTimeoutMiddleware,也支持此功能。
HttpAuthMiddleware
- class
scrapy.downloadermiddlewares.httpauth.
HttpAuthMiddleware
- 此中间件使用基本访问身份验证(也称为HTTP身份验证)对从某些蜘蛛生成的所有请求进行身份验证。
要从某些蜘蛛启用HTTP身份验证,请设置这些蜘蛛的
http_user
和http_pass
属性。例:
from scrapy.spiders import CrawlSpider class SomeIntranetSiteSpider(CrawlSpider): http_user = 'someuser' http_pass = 'somepass' name = 'intranet.example.com' # .. rest of the spider code omitted ...
HttpCacheMiddleware
- class
scrapy.downloadermiddlewares.httpcache.
HttpCacheMiddleware
- 此中间件为所有HTTP请求和响应提供低级缓存。它必须与缓存存储后端以及缓存策略结合使用。
Scrapy附带三个HTTP缓存存储后端:
- 文件系统存储后端(默认)
- DBM存储后端
- LevelDB存储后端
您可以使用该
HTTPCACHE_STORAGE
设置更改HTTP缓存存储后端。或者您也可以实现自己的存储后端。Scrapy附带两个HTTP缓存策略:
- RFC2616政策
- 虚拟政策(默认)
您可以使用该
HTTPCACHE_POLICY
设置更改HTTP缓存策略。或者您也可以实施自己的政策。您还可以使用
dont_cache
元键等于True来避免在每个策略上缓存响应。
虚拟政策(默认)
此策略不了解任何HTTP Cache-Control指令。每个请求及其相应的响应都被缓存。当再次看到相同的请求时,将返回响应,而不从Internet传输任何内容。
Dummy策略对于更快地测试蜘蛛非常有用(无需每次都等待下载),并且当Internet连接不可用时,可以离线尝试蜘蛛。我们的目标是能够“重播”蜘蛛来看,正是因为它跑前。
要使用此政策,请设置:
HTTPCACHE_POLICY
至scrapy.extensions.httpcache.DummyPolicy
RFC2616策略
此策略提供符合RFC2616的HTTP缓存,即具有HTTP缓存控制感知,旨在生产并用于连续运行,以避免下载未修改的数据(以节省带宽和加速爬网)。
实施的内容:
-
不要尝试使用no-store cache-control指令集存储响应/请求
-
如果为新响应设置了no-cache cache-control指令,则不要从缓存提供响应
-
从max-age cache-control指令计算新鲜度生命周期
-
从Expires响应头计算新鲜度生命周期
-
从Last-Modified响应头开始计算新鲜度生命周期(Firefox使用的启发式)
-
从Age响应标头计算当前年龄
-
从Date标头计算当前年龄
-
根据Last-Modified响应头重新验证过时响应
-
根据ETag响应头重新验证过时响应
-
为任何收到的响应设置日期标题
-
支持请求中的max-stale cache-control指令
这允许蜘蛛配置完整的RFC2616缓存策略,但避免在逐个请求的基础上重新验证,同时保持符合HTTP规范。
例:
添加Cache-Control:max-stale = 600到Request标头,以接受超过其到期时间不超过600秒的响应。
另见:RFC2616,14.9.3
缺什么:
- Pragma:无缓存支持https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1
- 不同的标题支持https://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6
- 更新或删除后失效https://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.10
- ……可能还有其他..
要使用此政策,请设置:
HTTPCACHE_POLICY
至scrapy.extensions.httpcache.RFC2616Policy
文件系统存储后端(默认)
文件系统存储后端可用于HTTP缓存中间件。
要使用此存储后端,请设置:
HTTPCACHE_STORAGE
至scrapy.extensions.httpcache.FilesystemCacheStorage
每个请求/响应对都存储在包含以下文件的不同目录中:
目录名称来自请求指纹(请参阅参考资料 scrapy.utils.request.fingerprint
),并且使用一个级别的子目录来避免在同一目录中创建太多文件(这在许多文件系统中效率低下)。示例目录可以是:
/path/to/cache/dir/example.com/72/72811f648e718090f041317756c03adb0ada46c7
DBM存储后端
版本0.13中的新功能。
一个DBM存储后端也可用于HTTP缓存中间件。
默认情况下,它使用anydbm模块,但您可以使用该HTTPCACHE_DBM_MODULE
设置更改它 。
要使用此存储后端,请设置:
HTTPCACHE_STORAGE
至scrapy.extensions.httpcache.DbmCacheStorage
LevelDB存储后端
版本0.23中的新功能。
一个性LevelDB存储后端也可用于HTTP缓存中间件。
建议不要将此后端用于开发,因为只有一个进程可以同时访问LevelDB数据库,因此您无法运行爬网并为同一个蜘蛛并行打开scrapy shell。
要使用此存储后端:
HTTPCache中间件设置
的HttpCacheMiddleware
可以通过以下设置来配置:
HTTPCACHE_EXPIRATION_SECS
默认: 0
缓存请求的到期时间,以秒为单位。
超过此时间的缓存请求将被重新下载。如果为零,则缓存的请求将永不过期。
在版本0.11中更改:在0.11之前,零表示缓存的请求始终到期。
HTTPCACHE_DIR
默认: 'httpcache'
用于存储(低级)HTTP缓存的目录。如果为空,则将禁用HTTP缓存。如果给出相对路径,则相对于项目数据dir。有关详细信息,请参阅:Scrapy项目的默认结构。
HTTPCACHE_IGNORE_HTTP_CODES
版本0.10中的新功能。
默认: []
不要使用这些HTTP代码缓存响应。
HTTPCACHE_IGNORE_MISSING
默认: False
如果启用,将忽略未在缓存中找到的请求而不是下载。
HTTPCACHE_IGNORE_SCHEMES
版本0.10中的新功能。
默认: ['file']
不要使用这些URI方案缓存响应。
HTTPCACHE_STORAGE
默认: 'scrapy.extensions.httpcache.FilesystemCacheStorage'
实现缓存存储后端的类。
HTTPCACHE_DBM_MODULE
版本0.13中的新功能。
默认: 'anydbm'
要在DBM存储后端中使用的数据库模块。此设置特定于DBM后端。
HTTPCACHE_POLICY
版本0.18中的新功能。
默认: 'scrapy.extensions.httpcache.DummyPolicy'
实现缓存策略的类。
HTTPCACHE_GZIP
版本1.0中的新功能。
默认: False
如果启用,将使用gzip压缩所有缓存的数据。此设置特定于Filesystem后端。
HTTPCACHE_ALWAYS_STORE
版本1.1中的新功能。
默认: False
如果启用,将无条件地缓存页面。
蜘蛛可能希望在缓存中提供所有响应,以便将来与Cache-Control:max-stale一起使用。DummyPolicy缓存所有响应,但从不重新验证它们,有时需要更细微的策略。
此设置仍然遵循Cache-Control:响应中的no-store指令。如果您不想这样做,请在您提供给缓存中间件的响应中的Cache-Control标头中过滤no-store。
HTTPCACHE_IGNORE_RESPONSE_CACHE_CONTROLS
版本1.1中的新功能。
默认: []
要忽略的响应中的Cache-Control指令列表。
站点通常设置“无存储”,“无缓存”,“必须重新验证”等,但如果它遵守这些指令,蜘蛛可以生成的流量会感到不安。这允许有选择地忽略已知对正在被爬网的站点不重要的Cache-Control指令。
我们假设蜘蛛不会在请求中发出Cache-Control指令,除非它实际需要它们,因此不会过滤请求中的指令。
HttpCompressionMiddleware
- class
scrapy.downloadermiddlewares.httpcompression.
HttpCompressionMiddleware
- 该中间件允许从网站发送/接收压缩(gzip,deflate)流量。
如果安装了brotlipy,此中间件还支持解码brotli压缩响应。
HttpProxyMiddleware
版本0.8中的新功能。
- class
scrapy.downloadermiddlewares.httpproxy.
HttpProxyMiddleware
- 此中间件通过设置对象的
proxy
元值来设置用于请求的HTTP代理Request
。与Python标准库模块urllib和urllib2一样,它遵循以下环境变量:
http_proxy
https_proxy
no_proxy
您还可以将
proxy
每个请求的元键设置为类似http://some_proxy_server:port
或的值http://username:password@some_proxy_server:port
。请记住,此值将优先于http_proxy
/https_proxy
environment变量,并且还将忽略no_proxy
环境变量。
RedirectMiddleware
- class
scrapy.downloadermiddlewares.redirect.
RedirectMiddleware
- 该中间件根据响应状态处理请求的重定向。
可以在redirect_urls
Request.meta
密钥中找到请求经过的URL(在重定向时)。
该RedirectMiddleware
可通过以下设置进行配置(详情参见设置文档):
REDIRECT_ENABLED
REDIRECT_MAX_TIMES
如果Request.meta
将dont_redirect
键设置为True,则此中间件将忽略该请求。
如果要在spider中处理一些重定向状态代码,可以在handle_httpstatus_list
spider属性中指定这些代码。
例如,如果您希望重定向中间件忽略301和302响应(并将它们传递给您的蜘蛛),您可以这样做:
class MySpider(CrawlSpider):
handle_httpstatus_list = [301, 302]
所述handle_httpstatus_list
的键Request.meta
也可以被用于指定的响应代码,以允许在每个请求基础。您还可以设置meta键 handle_httpstatus_all
来True
,如果你想以允许请求的任何响应代码。
RedirectMiddleware设置
REDIRECT_MAX_TIMES
默认: 20
单个请求将遵循的最大重定向数。
MetaRefreshMiddleware
- class
scrapy.downloadermiddlewares.redirect.
MetaRefreshMiddleware
- 此中间件基于元刷新html标记处理请求的重定向。
该MetaRefreshMiddleware
可通过以下设置进行配置(详情参见设置文档):
METAREFRESH_ENABLED
METAREFRESH_MAXDELAY
该中间件服从REDIRECT_MAX_TIMES
设置,dont_redirect
并redirect_urls
按照描述请求元密钥RedirectMiddleware
RetryMiddleware
- class
scrapy.downloadermiddlewares.retry.
RetryMiddleware
- 一种中间件,用于重试可能由临时问题(如连接超时或HTTP 500错误)引起的失败请求。
一旦蜘蛛完成了对所有常规(非失败)页面的爬行,在抓取过程中收集失败的页面并在结束时重新安排。一旦没有更多的失败页面重试,该中间件就会发送一个信号(retry_complete),因此其他扩展可以连接到该信号。
该RetryMiddleware
可通过以下设置进行配置(详情参见设置文档):
RETRY_ENABLED
RETRY_TIMES
RETRY_HTTP_CODES
如果Request.meta
将dont_retry
键设置为True,则此中间件将忽略该请求。
重试中间件设置
RETRY_ENABLED
版本0.13中的新功能。
默认: True
是否启用重试中间件。
RETRY_TIMES
默认: 2
除第一次下载外,最多重试次数。
每个请求也可以使用max_retry_times
属性指定最大重试次数 Request.meta
。初始化时,max_retry_times
元键优先于RETRY_TIMES
设置。
RETRY_HTTP_CODES
默认: [500, 502, 503, 504, 408]
要重试的HTTP响应代码。始终重试其他错误(DNS查找问题,连接丢失等)。
在某些情况下,您可能希望添加400,RETRY_HTTP_CODES
因为它是用于指示服务器过载的公共代码。默认情况下不包括它,因为HTTP规范说明了这一点。
RobotsTxtMiddleware
- class
scrapy.downloadermiddlewares.robotstxt.
RobotsTxtMiddleware
- 此中间件过滤掉robots.txt排除标准禁止的请求。
要确保Scrapy尊重robots.txt,请确保已启用中间件并启用该
ROBOTSTXT_OBEY
设置。
如果Request.meta
将 dont_obey_robotstxt
密钥设置为True,则即使ROBOTSTXT_OBEY
启用了该中间件,该请求也将被忽略 。
DownloaderStats
- class
scrapy.downloadermiddlewares.stats.
DownloaderStats
- 中间件,用于存储通过它的所有请求,响应和异常的统计信息。
要使用此中间件,您必须启用该
DOWNLOADER
_STATS
设置。
UserAgentMiddleware
- class
scrapy.downloadermiddlewares.useragent.
UserAgentMiddleware
- 允许蜘蛛覆盖默认用户代理的中间件。
为了使蜘蛛覆盖默认用户代理, 必须设置其user_agent属性。
AjaxCrawlMiddleware
- class
scrapy.downloadermiddlewares.ajaxcrawl.
AjaxCrawlMiddleware
- 基于元片段html标记找到“AJAX可抓取”页面变体的中间件。有关 详细信息,请参阅https://developers.google.com/webmasters/ajax-crawling/docs/getting-started。
注意
'http://example.com/!#foo=bar'
即使没有这个中间件,Scrapy也会为URL找到“AJAX可抓取”页面 。当URL不包含时,AjaxCrawlMiddleware是必需的'!#'
。这通常是“索引”或“主要”网站页面的情况。
AjaxCrawlMiddleware设置
AJAXCRAWL_ENABLED
版本0.21中的新功能。
默认: False
是否启用AjaxCrawlMiddleware。您可能希望为广泛爬网启用它。
评论被关闭。