Scrapy – 下载器中间件
下载器中间件是Scrapy请求/响应处理的钩子框架。这是一个轻,低层次的系统,全球范围内改变斯拉皮的请求和响应。
激活下载器中间件¶
要激活下载器中间件组件,请将其添加到 DOWNLOADER_MIDDLEWARES 设置,这是一个dict,其键是中间件类路径,其值是中间件顺序。
举个例子:
DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.CustomDownloaderMiddleware': 543, }
这个 DOWNLOADER_MIDDLEWARES 设置与合并 DOWNLOADER_MIDDLEWARES_BASE 在scrappy中定义的设置(不打算被覆盖),然后按顺序排序,以获得已启用中间件的最终排序列表:第一个中间件更接近引擎,最后一个更接近下载程序。也就是说, process_request() 每个中间件的方法将以增加的中间件顺序(100、200、300…)调用,并且 process_response() 每个中间件的方法将按降序调用。
要决定分配给中间件的顺序,请参见 DOWNLOADER_MIDDLEWARES_BASE 根据要插入中间件的位置设置和选择一个值。顺序很重要,因为每个中间件执行不同的操作,并且您的中间件可能依赖于之前(或之后)应用的一些中间件。
如果要禁用内置中间件(定义于 DOWNLOADER_MIDDLEWARES_BASE 并在默认情况下启用)您必须在项目的 DOWNLOADER_MIDDLEWARES 设置和分配 None 作为其价值。例如,如果要禁用用户代理中间件:
DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.CustomDownloaderMiddleware': 543, 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, }
最后,请记住,某些中间商可能需要通过特定设置启用。有关更多信息,请参阅每个中间件文档。
编写自己的下载中间件¶
每个下载器中间件都是一个python类,它定义了下面定义的一个或多个方法。
主要入口点是 from_crawler 类方法,它接收 Crawler 实例。这个 Crawler 例如,对象允许您访问 settings .
-
class
scrapy.downloadermiddlewares.DownloaderMiddleware¶ -
注解
任何下载器中间件方法也可能返回延迟。
-
process_request(request, spider)¶ -
对于通过下载中间件的每个请求调用此方法。
process_request()应该是:返回None返回AResponse对象,返回Request对象,或提升IgnoreRequest.如果它回来
None,scrapy将继续处理此请求,执行所有其他中间软件,直到最后调用适当的下载器处理程序执行请求(及其下载的响应)。如果它返回
Response对象,Scrapy不用打电话了 any 其他process_request()或process_exception()方法或适当的下载函数;它将返回该响应。这个process_response()每次响应都会调用已安装中间件的方法。如果它返回
Request对象,Scrapy将停止调用进程请求方法并重新安排返回的请求。一旦执行新返回的请求,将对下载的响应调用适当的中间件链。如果它引发了
IgnoreRequest例外情况process_exception()将调用已安装的下载器中间件的方法。如果它们都不处理异常,则请求的errback函数 (Request.errback)。如果没有代码处理引发的异常,则忽略该异常,不记录该异常(与其他异常不同)。- 参数
-
-
request (
Requestobject) -- 正在处理的请求 -
spider (
Spiderobject) -- 此请求所针对的蜘蛛
-
-
process_response(request, response, spider)¶ -
process_response()应该是:返回Response对象,返回Request反对或提高IgnoreRequest例外。如果它返回
Response(可能是相同的给定响应,也可能是全新的响应),该响应将继续使用process_response()链中的下一个中间件。如果它返回
Request对象,中间件链将停止,返回的请求将被重新安排以便将来下载。这与从返回请求时的行为相同process_request().如果它引发了
IgnoreRequest异常,请求的errback函数 (Request.errback)。如果没有代码处理引发的异常,则忽略该异常,不记录该异常(与其他异常不同)。- 参数
-
-
request (is a
Requestobject) -- 发起响应的请求 -
response (
Responseobject) -- 正在处理的响应 -
spider (
Spiderobject) -- 此响应所针对的蜘蛛
-
-
process_exception(request, exception, spider)¶ -
Scrapy电话
process_exception()当下载处理程序或process_request()(从下载器中间件)引发异常(包括IgnoreRequest例外)process_exception()应该返回:或者None,AResponse对象,或Request对象。如果它回来
None,Scrapy将继续处理此异常,执行任何其他process_exception()安装的中间件的方法,直到没有中间件,默认的异常处理开始。如果它返回
Response对象process_response()已安装中间件的方法链已启动,Scrapy不需要调用任何其他方法。process_exception()中间件的方法。如果它返回
Request对象,将重新安排返回的请求以便将来下载。这将停止执行process_exception()中间件的方法与返回响应相同。- 参数
-
-
request (is a
Requestobject) -- 生成异常的请求 -
exception (an
Exceptionobject) -- 引发的异常 -
spider (
Spiderobject) -- 此请求所针对的蜘蛛
-
-
from_crawler(cls, crawler)¶ -
如果存在,则调用该类方法从
Crawler. 它必须返回中间件的新实例。爬虫对象提供对所有零碎核心组件(如设置和信号)的访问;它是中间件访问它们并将其功能连接到零碎的一种方式。- 参数
-
crawler (
Crawlerobject) -- 使用此中间件的爬虫程序
-
内置下载器中间件参考¶
本页介绍了所有随Scrapy一起提供的下载器中间件组件。有关如何使用它们以及如何编写自己的下载器中间件的信息,请参见 downloader middleware usage guide .
有关默认启用的组件列表(及其顺序),请参见 DOWNLOADER_MIDDLEWARES_BASE 设置。
CookiesMiddleware¶
-
class
scrapy.downloadermiddlewares.cookies.CookiesMiddleware[源代码]¶ -
此中间件支持使用需要cookie的站点,例如使用会话的站点。就像网络浏览器发送的cookies一样,它也会跟踪网络浏览器发出的请求。
警告
当非UTF8编码的字节序列传递给
Request, theCookiesMiddleware将记录一个警告。参考 高级自定义 自定义日志行为。
以下设置可用于配置cookie中间件:
-
COOKIES_ENABLED -
COOKIES_DEBUG
每个蜘蛛有多个cookie会话¶
通过使用 cookiejar 请求元键。默认情况下,它使用一个cookie jar(会话),但您可以通过一个标识符来使用不同的标识符。
例如::
for i, url in enumerate(urls): yield scrapy.Request(url, meta={'cookiejar': i}, callback=self.parse_page)
记住 cookiejar meta-key不是“粘性的”。您需要在随后的请求中继续传递它。例如::
def parse_page(self, response): # do some processing return scrapy.Request("http://www.example.com/otherpage", meta={'cookiejar': response.meta['cookiejar']}, callback=self.parse_other_page)
COOKIES_ENABLED¶
违约: True
是否启用cookie中间件。如果禁用,则不会向Web服务器发送cookie。
注意,尽管 COOKIES_ENABLED 设置中频 Request. Remeta: ['dont_merge_cookies'] <dont_merge_cookies>`评估结果为 True 请求cookies将 not 发送到Web服务器并在中接收cookie Response 将 not 与现有cookie合并。
有关详细信息,请参阅 cookies 参数在 Request .
COOKIES_DEBUG¶
违约: False
如果启用,Scrapy将记录发送到请求中的所有cookie(即。 Cookie 头)和响应中接收到的所有cookie(即。 Set-Cookie 标题)。
下面是一个使用 COOKIES_DEBUG 启用::
2011-04-06 14:35:10-0300 [scrapy.core.engine] INFO: Spider opened 2011-04-06 14:35:10-0300 [scrapy.downloadermiddlewares.cookies] DEBUG: Sending cookies to: <GET http://www.diningcity.com/netherlands/index.html> Cookie: clientlanguage_nl=en_EN 2011-04-06 14:35:14-0300 [scrapy.downloadermiddlewares.cookies] DEBUG: Received cookies from: <200 http://www.diningcity.com/netherlands/index.html> Set-Cookie: JSESSIONID=B~FA4DC0C496C8762AE4F1A620EAB34F38; Path=/ Set-Cookie: ip_isocode=US Set-Cookie: clientlanguage_nl=en_EN; Expires=Thu, 07-Apr-2011 21:21:34 GMT; Path=/ 2011-04-06 14:49:50-0300 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.diningcity.com/netherlands/index.html> (referer: None) [...]
DefaultHeadersMiddleware¶
-
class
scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware[源代码]¶ -
此中间件设置在
DEFAULT_REQUEST_HEADERS设置。
DownloadTimeoutMiddleware¶
-
class
scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware[源代码]¶ -
此中间件为中指定的请求设置下载超时
DOWNLOAD_TIMEOUT设置或download_timeout蜘蛛属性。
注解
您还可以使用设置每个请求的下载超时 download_timeout request.meta key;即使禁用downloadTimeoutMiddleware,也支持此功能。
HttpAuthMiddleware¶
-
class
scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware[源代码]¶ -
此中间件使用 Basic access authentication (又名。HTTP AUTH)。
要从某些spider启用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请求和响应提供低级缓存。它必须与缓存存储后端以及缓存策略相结合。
带有三个HTTP缓存存储后端的 Scrapy 船:
-
文件系统存储后端(默认)
-
DBM存储后端
您可以使用
HTTPCACHE_STORAGE设置。或者你也可以 implement your own storage backend.Scrapy附带两个HTTP缓存策略:
-
RCF2616政策
-
虚拟策略(默认)
可以使用更改HTTP缓存策略
HTTPCACHE_POLICY设置。或者您也可以实现自己的策略。您还可以避免在使用
dont_cache元密钥相等True. -
虚拟策略(默认)¶
-
class
scrapy.extensions.httpcache.DummyPolicy[源代码]¶ -
此策略不知道任何HTTP缓存控制指令。每个请求及其相应的响应都被缓存。当再次看到相同的请求时,将返回响应,而不从Internet传输任何内容。
虚拟策略对于更快地测试spider(而不必每次都等待下载)以及在无法连接到Internet时尝试离线使用spider非常有用。目标是能够“重播”蜘蛛的奔跑 和以前一样 .
RCF2616政策¶
-
class
scrapy.extensions.httpcache.RFC2616Policy[源代码]¶ -
此策略提供了一个符合RFC2616的HTTP缓存,即具有HTTP缓存控制意识,旨在生产,并在连续运行中使用,以避免下载未修改的数据(以节省带宽和加快爬行速度)。
实施的内容:
-
不要试图用存储响应/请求
no-store缓存控制指令集 -
如果
no-cache甚至为新响应设置了缓存控制指令 -
计算新鲜度寿命
max-age缓存控制指令 -
计算新鲜度寿命
Expires响应报头 -
计算新鲜度寿命
Last-Modified响应头(firefox使用的启发式方法) -
计算当前年龄
Age响应报头 -
计算当前年龄
Date页眉 -
基于以下内容重新验证过时响应
Last-Modified响应报头 -
基于以下内容重新验证过时响应
ETag响应报头 -
集合
Date接收到的任何响应的头丢失了它 -
支持
max-stale请求中的缓存控制指令
这允许spider使用完整的rfc2616缓存策略进行配置,但避免按请求进行重新验证,同时保持与HTTP规范一致。
例子:
添加
Cache-Control: max-stale=600请求头接受超过其过期时间不超过600秒的响应。另见:RFC2616,14.9.3
缺少什么:
-
Pragma: no-cache支持https://www.w3.org/protocols/rfc2616/rfc2616-sec14.html sec14.9.1 -
Vary头支持https://www.w3.org/protocols/rfc2616/rfc2616-sec13.html sec13.6 -
更新或删除后无效https://www.w3.org/protocols/rfc2616/rfc2616-sec13.html sec13.10
-
…可能还有其他……
-
文件系统存储后端(默认)¶
-
class
scrapy.extensions.httpcache.FilesystemCacheStorage[源代码]¶ -
文件系统存储后端可用于HTTP缓存中间件。
每个请求/响应对存储在包含以下文件的不同目录中:
-
request_body-普通请求主体 -
request_headers-请求头(原始HTTP格式) -
response_body-普通反应体 -
response_headers-请求头(原始HTTP格式) -
meta-python中这个缓存资源的一些元数据repr()格式(grep友好格式) -
pickled_meta-中的相同元数据meta但是为了更有效的反序列化而进行的pickled
目录名是根据请求指纹生成的(请参见
scrapy.utils.request.fingerprint一级子目录用于避免在同一目录中创建过多的文件(在许多文件系统中效率低下)。示例目录可以是:/path/to/cache/dir/example.com/72/72811f648e718090f041317756c03adb0ada46c7
-
DBM存储后端¶
-
class
scrapy.extensions.httpcache.DbmCacheStorage[源代码]¶ -
A DBM 存储后端也可用于HTTP缓存中间件。
默认情况下,它使用
dbm,但您可以用HTTPCACHE_DBM_MODULE设置。
编写自己的存储后端¶
您可以通过创建定义下面描述的方法的python类来实现缓存存储后端。
-
class
scrapy.extensions.httpcache.CacheStorage¶ -
-
open_spider(spider)¶ -
在打开蜘蛛进行爬行后调用此方法。它处理
open_spider信号。- 参数
-
spider (
Spiderobject) -- 已经打开的蜘蛛
-
close_spider(spider)¶ -
关闭spider后调用此方法。它处理
close_spider信号。- 参数
-
spider (
Spiderobject) -- 已关闭的蜘蛛
-
retrieve_response(spider, request)¶ -
如果缓存中存在,则返回响应,或者
None否则。- 参数
-
-
spider (
Spiderobject) -- 生成请求的蜘蛛 -
request (
Requestobject) -- 查找的缓存响应的请求
-
-
store_response(spider, request, response)¶ -
将给定的响应存储在缓存中。
- 参数
-
-
spider (
Spiderobject) -- 响应所针对的蜘蛛 -
request (
Requestobject) -- 蜘蛛生成的相应请求 -
response (
Responseobject) -- 存储在缓存中的响应
-
-
要使用存储后端,请设置:
-
HTTPCACHE_STORAGE到自定义存储类的python导入路径。
httpcache中间件设置¶
这个 HttpCacheMiddleware 可通过以下设置进行配置:
HTTPCACHE_ENABLED¶
违约: False
是否启用HTTP缓存。
HTTPCACHE_EXPIRATION_SECS¶
违约: 0
缓存请求的过期时间(秒)。
超过此时间的缓存请求将被重新下载。如果为零,则缓存请求将永不过期。
HTTPCACHE_DIR¶
违约: 'httpcache'
用于存储(低级)HTTP缓存的目录。如果为空,则将禁用HTTP缓存。如果给定了相对路径,则相对于项目数据目录。有关详细信息,请参阅: 报废项目的默认结构 .
HTTPCACHE_IGNORE_HTTP_CODES¶
违约: []
不要用这些HTTP代码缓存响应。
HTTPCACHE_IGNORE_MISSING¶
违约: False
如果启用,在缓存中找不到的请求将被忽略,而不是下载。
HTTPCACHE_IGNORE_SCHEMES¶
违约: ['file']
不要用这些URI方案缓存响应。
HTTPCACHE_STORAGE¶
违约: 'scrapy.extensions.httpcache.FilesystemCacheStorage'
实现缓存存储后端的类。
HTTPCACHE_DBM_MODULE¶
违约: 'dbm'
要在中使用的数据库模块 DBM storage backend . 此设置特定于DBM后端。
HTTPCACHE_POLICY¶
违约: 'scrapy.extensions.httpcache.DummyPolicy'
实现缓存策略的类。
HTTPCACHE_GZIP¶
违约: False
如果启用,将使用gzip压缩所有缓存数据。此设置特定于文件系统后端。
HTTPCACHE_ALWAYS_STORE¶
违约: False
如果启用,将无条件缓存页。
蜘蛛可能希望缓存中有所有可用的响应,以便将来与一起使用 Cache-Control: max-stale 例如。dummypolicy缓存所有响应,但从不重新验证它们,有时需要更细微的策略。
此设置仍然尊重 Cache-Control: no-store 回应中的指示。如果你不想要,过滤 no-store 在您提供给缓存中间件的响应中的缓存控制标头。
HTTPCACHE_IGNORE_RESPONSE_CACHE_CONTROLS¶
违约: []
要忽略的响应中的缓存控制指令列表。
网站通常会设置“无存储”、“无缓存”、“必须重新验证”等,但是如果蜘蛛真正遵守这些指令,它可能会产生流量,这会让网站感到不安。这允许有选择地忽略缓存控制指令,这些指令对于正在爬网的站点来说并不重要。
我们假设蜘蛛不会在请求中发出缓存控制指令,除非它确实需要它们,所以请求中的指令不会被过滤。
HttpCompressionMiddleware¶
-
class
scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware[源代码]¶ -
此中间件允许从网站发送/接收压缩(gzip、deflate)流量。
此中间件还支持解码 brotli-compressed 回答,提供 brotlipy 已安装。
httpcompression中间件设置¶
COMPRESSION_ENABLED¶
违约: True
是否启用压缩中间件。
HttpProxyMiddleware¶
-
class
scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware[源代码]¶ -
此中间件通过设置
proxy元价值Request物体。就像Python标准库模块一样
urllib.request,它遵循以下环境变量:-
http_proxy -
https_proxy -
no_proxy
您也可以设置meta键
proxyper-request, to a value likehttp://some_proxy_server:portorhttp://username:password@some_proxy_server:port. Keep in mind this value will take precedence overhttp_proxy/https_proxy环境变量,它也将忽略no_proxy环境变量。 -
RedirectMiddleware¶
-
class
scrapy.downloadermiddlewares.redirect.RedirectMiddleware[源代码]¶ -
此中间件根据响应状态处理请求的重定向。
请求通过的URL(在重定向时)可以在 redirect_urls Request.meta 关键。
每个重定向背后的原因 redirect_urls 可以在 redirect_reasons Request.meta 关键。例如: [301, 302, 307, 'meta refresh'] .
原因的格式取决于处理相应重定向的中间件。例如, RedirectMiddleware 以整数表示触发响应状态代码,而 MetaRefreshMiddleware 总是使用 'meta refresh' 字符串作为原因。
这个 RedirectMiddleware 可以通过以下设置进行配置(有关详细信息,请参阅设置文档):
-
REDIRECT_ENABLED -
REDIRECT_MAX_TIMES
如果 Request.meta 有 dont_redirect key设置为true,该中间件将忽略该请求。
如果要处理蜘蛛中的某些重定向状态代码,可以在 handle_httpstatus_list 蜘蛛属性。
例如,如果您希望重定向中间件忽略301和302响应(并将它们传递给您的spider),可以这样做:
class MySpider(CrawlSpider): handle_httpstatus_list = [301, 302]
这个 handle_httpstatus_list 关键 Request.meta 还可以用于指定每个请求允许哪些响应代码。您也可以设置meta键 handle_httpstatus_all 到 True 如果您想允许请求的任何响应代码。
重定向中间件设置¶
REDIRECT_ENABLED¶
违约: True
是否启用重定向中间件。
REDIRECT_MAX_TIMES¶
违约: 20
单个请求将遵循的最大重定向数。在这个最大值之后,请求的响应按原样返回。
MetaRefreshMiddleware¶
-
class
scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware[源代码]¶ -
此中间件处理基于meta-refresh html标记的请求重定向。
这个 MetaRefreshMiddleware 可以通过以下设置进行配置(有关详细信息,请参阅设置文档):
-
METAREFRESH_ENABLED -
METAREFRESH_IGNORE_TAGS -
METAREFRESH_MAXDELAY
这个中间件服从 REDIRECT_MAX_TIMES 设置, dont_redirect , redirect_urls 和 redirect_reasons 按说明请求元键 RedirectMiddleware
元刷新中间件设置¶
METAREFRESH_ENABLED¶
违约: True
是否启用元刷新中间件。
METAREFRESH_IGNORE_TAGS¶
违约: []
忽略这些标记中的元标记。
在 2.0 版更改: 默认值为 METAREFRESH_IGNORE_TAGS 从改变 ['script', 'noscript'] 到 [] .
METAREFRESH_MAXDELAY¶
违约: 100
重定向后的最大元刷新延迟(秒)。有些站点使用meta-refresh重定向到会话过期的页面,因此我们将自动重定向限制为最大延迟。
RetryMiddleware¶
-
class
scrapy.downloadermiddlewares.retry.RetryMiddleware¶ -
一种中间件,用于重试可能由临时问题(如连接超时或HTTP 500错误)引起的失败请求。
一旦爬行器完成对所有常规(非失败)页面的爬行,将在抓取过程中收集失败的页面,并在最后重新安排。
这个 RetryMiddleware 可以通过以下设置进行配置(有关详细信息,请参阅设置文档):
-
RETRY_ENABLED -
RETRY_TIMES -
RETRY_HTTP_CODES
如果 Request.meta 有 dont_retry key设置为true,该中间件将忽略该请求。
重试IDdleware设置¶
RETRY_ENABLED¶
违约: True
是否启用重试中间件。
RETRY_TIMES¶
违约: 2
除第一次下载外,还要重试的最大次数。
也可以使用指定每个请求的最大重试次数 max_retry_times 属性 Request.meta . 初始化时, max_retry_times 元键优先于 RETRY_TIMES 设置。
RETRY_HTTP_CODES¶
违约: [500, 502, 503, 504, 522, 524, 408, 429]
要重试的HTTP响应代码。总是重试其他错误(DNS查找问题、连接丢失等)。
在某些情况下,您可能希望将400添加到 RETRY_HTTP_CODES 因为它是用于指示服务器过载的常见代码。默认情况下不包括它,因为HTTP规范这么说。
RobotsTxtMiddleware¶
-
class
scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware¶ -
此中间件过滤掉robots.txt排除标准禁止的请求。
要确保scrapy尊重robots.txt,请确保启用中间件,并且
ROBOTSTXT_OBEY设置已启用。这个
ROBOTSTXT_USER_AGENT设置可用于指定用于在中进行匹配的用户代理字符串 robots.txt 文件。如果是的话None,随请求或USER_AGENT设置(按该顺序)将用于确定要在中使用的用户代理 robots.txt 文件。这个中间件必须与 robots.txt 解析器。
支持以下设备的废船 robots.txt 解析器:
-
Protego (默认)
-
RobotFileParser
-
Reppy
-
Robotexclusionrulesparser
你可以改变 robots.txt 具有
ROBOTSTXT_PARSER设置。或者你也可以 implement support for a new parser . -
如果 Request.meta 有 dont_obey_robotstxt 密钥设置为true,即使 ROBOTSTXT_OBEY 启用。
解析器在几个方面有所不同:
-
执行语言
-
支持的规范
-
支持通配符匹配
-
用法 length based rule :尤其是
Allow和Disallow指令,其中基于路径长度的最具体规则胜过不太具体(较短)的规则
不同解析器的性能比较可在 the following link .
Protego解析器¶
基于 Protego :
-
用Python实现
-
符合 Google's Robots.txt Specification
-
支持通配符匹配
-
使用基于长度的规则
Scrapy默认使用这个解析器。
RobotFileParser¶
基于 RobotFileParser :
-
是Python的内置 robots.txt 语法分析器
-
符合 Martijn Koster's 1996 draft specification
-
缺少对通配符匹配的支持
-
不使用基于长度的规则
它比protey 8.0之前的版本更快地兼容。
要使用此分析器,请设置:
-
ROBOTSTXT_PARSERtoscrapy.robotstxt.PythonRobotParser
Reppy解析器¶
基于 Reppy :
-
周围有一个Python包装 Robots Exclusion Protocol Parser for C++
-
符合 Martijn Koster's 1996 draft specification
-
支持通配符匹配
-
使用基于长度的规则
本机实现,提供比Protego更好的速度。
要使用此解析器:
-
安装 Reppy 通过运行
pip install reppy -
集合
ROBOTSTXT_PARSER设置为scrapy.robotstxt.ReppyRobotParser
RobotExclusionRuleSpaser¶
基于 Robotexclusionrulesparser :
-
用Python实现
-
符合 Martijn Koster's 1996 draft specification
-
支持通配符匹配
-
不使用基于长度的规则
要使用此解析器:
-
安装 Robotexclusionrulesparser 通过运行
pip install robotexclusionrulesparser -
集合
ROBOTSTXT_PARSER设置为scrapy.robotstxt.RerpRobotParser
实现对新解析器的支持¶
您可以实现对新的 robots.txt 通过对抽象基类进行子类化来分析程序 RobotParser 以及实现下述方法。
-
class
scrapy.robotstxt.RobotParser[源代码]¶ -
-
abstract
allowed(url, user_agent)[源代码]¶ -
返回
True如果user_agent允许爬行url,否则返回False.- 参数
-
-
url (str) -- 绝对网址
-
user_agent (str) -- 用户代理
-
-
abstract classmethod
from_crawler(crawler, robotstxt_body)[源代码]¶ -
分析 robots.txt 文件为字节。这必须是类方法。它必须返回解析器后端的新实例。
- 参数
-
-
crawler (
Crawlerinstance) -- 提出请求的爬虫 -
robotstxt_body (bytes) -- a的内容 robots.txt 文件。
-
-
abstract
DownloaderStats¶
-
class
scrapy.downloadermiddlewares.stats.DownloaderStats[源代码]¶ -
存储通过它的所有请求、响应和异常的统计信息的中间件。
要使用此中间件,必须启用
DOWNLOADER_STATS设置。
UserAgentMiddleware¶
-
class
scrapy.downloadermiddlewares.useragent.UserAgentMiddleware[源代码]¶ -
允许spider覆盖默认用户代理的中间件。
为了让spider重写默认的用户代理,其
user_agent必须设置属性。
AjaxCrawlMiddleware¶
-
class
scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware[源代码]¶ -
基于元片段html标记查找“AJAX可爬网”页面变体的中间件。看到了吗https://developers.google.com/search/docs/ajax-crawling/docs/getting-started了解更多信息。
注解
Scrapy查找“ajax可爬行”页面,查找类似
'http://example.com/!#foo=bar'即使没有这个中间件。当URL不包含时,需要AjaxCrawlMiddleware'!#'. 这通常是“索引”或“主要”网站页面的情况。
AjaxCrawl中间件设置¶
AJAXCRAWL_ENABLED¶
违约: False
是否启用AjaxCrawl中间件。您可能希望启用它 broad crawls .
httpproxymiddleware设置¶
HTTPPROXY_ENABLED¶
违约: True
是否启用 HttpProxyMiddleware .
HTTPPROXY_AUTH_ENCODING¶
违约: "latin-1"
上代理身份验证的默认编码 HttpProxyMiddleware .
激活下载器中间件¶
要激活下载器中间件组件,请将其添加到 DOWNLOADER_MIDDLEWARES 设置,这是一个dict,其键是中间件类路径,其值是中间件顺序。
举个例子:
DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.CustomDownloaderMiddleware': 543, }
这个 DOWNLOADER_MIDDLEWARES 设置与合并 DOWNLOADER_MIDDLEWARES_BASE 在scrappy中定义的设置(不打算被覆盖),然后按顺序排序,以获得已启用中间件的最终排序列表:第一个中间件更接近引擎,最后一个更接近下载程序。也就是说, process_request() 每个中间件的方法将以增加的中间件顺序(100、200、300…)调用,并且 process_response() 每个中间件的方法将按降序调用。
要决定分配给中间件的顺序,请参见 DOWNLOADER_MIDDLEWARES_BASE 根据要插入中间件的位置设置和选择一个值。顺序很重要,因为每个中间件执行不同的操作,并且您的中间件可能依赖于之前(或之后)应用的一些中间件。
如果要禁用内置中间件(定义于 DOWNLOADER_MIDDLEWARES_BASE 并在默认情况下启用)您必须在项目的 DOWNLOADER_MIDDLEWARES 设置和分配 None 作为其价值。例如,如果要禁用用户代理中间件:
DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.CustomDownloaderMiddleware': 543, 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, }
最后,请记住,某些中间商可能需要通过特定设置启用。有关更多信息,请参阅每个中间件文档。
编写自己的下载中间件¶
每个下载器中间件都是一个python类,它定义了下面定义的一个或多个方法。
主要入口点是 from_crawler 类方法,它接收 Crawler 实例。这个 Crawler 例如,对象允许您访问 settings .
-
class
scrapy.downloadermiddlewares.DownloaderMiddleware¶ -
注解
任何下载器中间件方法也可能返回延迟。
-
process_request(request, spider)¶ -
对于通过下载中间件的每个请求调用此方法。
process_request()应该是:返回None返回AResponse对象,返回Request对象,或提升IgnoreRequest.如果它回来
None,scrapy将继续处理此请求,执行所有其他中间软件,直到最后调用适当的下载器处理程序执行请求(及其下载的响应)。如果它返回
Response对象,Scrapy不用打电话了 any 其他process_request()或process_exception()方法或适当的下载函数;它将返回该响应。这个process_response()每次响应都会调用已安装中间件的方法。如果它返回
Request对象,Scrapy将停止调用进程请求方法并重新安排返回的请求。一旦执行新返回的请求,将对下载的响应调用适当的中间件链。如果它引发了
IgnoreRequest例外情况process_exception()将调用已安装的下载器中间件的方法。如果它们都不处理异常,则请求的errback函数 (Request.errback)。如果没有代码处理引发的异常,则忽略该异常,不记录该异常(与其他异常不同)。- 参数
-
-
request (
Requestobject) -- 正在处理的请求 -
spider (
Spiderobject) -- 此请求所针对的蜘蛛
-
-
process_response(request, response, spider)¶ -
process_response()应该是:返回Response对象,返回Request反对或提高IgnoreRequest例外。如果它返回
Response(可能是相同的给定响应,也可能是全新的响应),该响应将继续使用process_response()链中的下一个中间件。如果它返回
Request对象,中间件链将停止,返回的请求将被重新安排以便将来下载。这与从返回请求时的行为相同process_request().如果它引发了
IgnoreRequest异常,请求的errback函数 (Request.errback)。如果没有代码处理引发的异常,则忽略该异常,不记录该异常(与其他异常不同)。- 参数
-
-
request (is a
Requestobject) -- 发起响应的请求 -
response (
Responseobject) -- 正在处理的响应 -
spider (
Spiderobject) -- 此响应所针对的蜘蛛
-
-
process_exception(request, exception, spider)¶ -
Scrapy电话
process_exception()当下载处理程序或process_request()(从下载器中间件)引发异常(包括IgnoreRequest例外)process_exception()应该返回:或者None,AResponse对象,或Request对象。如果它回来
None,Scrapy将继续处理此异常,执行任何其他process_exception()安装的中间件的方法,直到没有中间件,默认的异常处理开始。如果它返回
Response对象process_response()已安装中间件的方法链已启动,Scrapy不需要调用任何其他方法。process_exception()中间件的方法。如果它返回
Request对象,将重新安排返回的请求以便将来下载。这将停止执行process_exception()中间件的方法与返回响应相同。- 参数
-
-
request (is a
Requestobject) -- 生成异常的请求 -
exception (an
Exceptionobject) -- 引发的异常 -
spider (
Spiderobject) -- 此请求所针对的蜘蛛
-
-
from_crawler(cls, crawler)¶ -
如果存在,则调用该类方法从
Crawler. 它必须返回中间件的新实例。爬虫对象提供对所有零碎核心组件(如设置和信号)的访问;它是中间件访问它们并将其功能连接到零碎的一种方式。- 参数
-
crawler (
Crawlerobject) -- 使用此中间件的爬虫程序
-
内置下载器中间件参考¶
本页介绍了所有随Scrapy一起提供的下载器中间件组件。有关如何使用它们以及如何编写自己的下载器中间件的信息,请参见 downloader middleware usage guide .
有关默认启用的组件列表(及其顺序),请参见 DOWNLOADER_MIDDLEWARES_BASE 设置。
CookiesMiddleware¶
-
class
scrapy.downloadermiddlewares.cookies.CookiesMiddleware[源代码]¶ -
此中间件支持使用需要cookie的站点,例如使用会话的站点。就像网络浏览器发送的cookies一样,它也会跟踪网络浏览器发出的请求。
警告
当非UTF8编码的字节序列传递给
Request, theCookiesMiddleware将记录一个警告。参考 高级自定义 自定义日志行为。
以下设置可用于配置cookie中间件:
-
COOKIES_ENABLED -
COOKIES_DEBUG
每个蜘蛛有多个cookie会话¶
通过使用 cookiejar 请求元键。默认情况下,它使用一个cookie jar(会话),但您可以通过一个标识符来使用不同的标识符。
例如::
for i, url in enumerate(urls): yield scrapy.Request(url, meta={'cookiejar': i}, callback=self.parse_page)
记住 cookiejar meta-key不是“粘性的”。您需要在随后的请求中继续传递它。例如::
def parse_page(self, response): # do some processing return scrapy.Request("http://www.example.com/otherpage", meta={'cookiejar': response.meta['cookiejar']}, callback=self.parse_other_page)
COOKIES_ENABLED¶
违约: True
是否启用cookie中间件。如果禁用,则不会向Web服务器发送cookie。
注意,尽管 COOKIES_ENABLED 设置中频 Request. Remeta: ['dont_merge_cookies'] <dont_merge_cookies>`评估结果为 True 请求cookies将 not 发送到Web服务器并在中接收cookie Response 将 not 与现有cookie合并。
有关详细信息,请参阅 cookies 参数在 Request .
COOKIES_DEBUG¶
违约: False
如果启用,Scrapy将记录发送到请求中的所有cookie(即。 Cookie 头)和响应中接收到的所有cookie(即。 Set-Cookie 标题)。
下面是一个使用 COOKIES_DEBUG 启用::
2011-04-06 14:35:10-0300 [scrapy.core.engine] INFO: Spider opened 2011-04-06 14:35:10-0300 [scrapy.downloadermiddlewares.cookies] DEBUG: Sending cookies to: <GET http://www.diningcity.com/netherlands/index.html> Cookie: clientlanguage_nl=en_EN 2011-04-06 14:35:14-0300 [scrapy.downloadermiddlewares.cookies] DEBUG: Received cookies from: <200 http://www.diningcity.com/netherlands/index.html> Set-Cookie: JSESSIONID=B~FA4DC0C496C8762AE4F1A620EAB34F38; Path=/ Set-Cookie: ip_isocode=US Set-Cookie: clientlanguage_nl=en_EN; Expires=Thu, 07-Apr-2011 21:21:34 GMT; Path=/ 2011-04-06 14:49:50-0300 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.diningcity.com/netherlands/index.html> (referer: None) [...]
DefaultHeadersMiddleware¶
-
class
scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware[源代码]¶ -
此中间件设置在
DEFAULT_REQUEST_HEADERS设置。
DownloadTimeoutMiddleware¶
-
class
scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware[源代码]¶ -
此中间件为中指定的请求设置下载超时
DOWNLOAD_TIMEOUT设置或download_timeout蜘蛛属性。
注解
您还可以使用设置每个请求的下载超时 download_timeout request.meta key;即使禁用downloadTimeoutMiddleware,也支持此功能。
HttpAuthMiddleware¶
-
class
scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware[源代码]¶ -
此中间件使用 Basic access authentication (又名。HTTP AUTH)。
要从某些spider启用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请求和响应提供低级缓存。它必须与缓存存储后端以及缓存策略相结合。
带有三个HTTP缓存存储后端的 Scrapy 船:
-
文件系统存储后端(默认)
-
DBM存储后端
您可以使用
HTTPCACHE_STORAGE设置。或者你也可以 implement your own storage backend.Scrapy附带两个HTTP缓存策略:
-
RCF2616政策
-
虚拟策略(默认)
可以使用更改HTTP缓存策略
HTTPCACHE_POLICY设置。或者您也可以实现自己的策略。您还可以避免在使用
dont_cache元密钥相等True. -
虚拟策略(默认)¶
-
class
scrapy.extensions.httpcache.DummyPolicy[源代码]¶ -
此策略不知道任何HTTP缓存控制指令。每个请求及其相应的响应都被缓存。当再次看到相同的请求时,将返回响应,而不从Internet传输任何内容。
虚拟策略对于更快地测试spider(而不必每次都等待下载)以及在无法连接到Internet时尝试离线使用spider非常有用。目标是能够“重播”蜘蛛的奔跑 和以前一样 .
RCF2616政策¶
-
class
scrapy.extensions.httpcache.RFC2616Policy[源代码]¶ -
此策略提供了一个符合RFC2616的HTTP缓存,即具有HTTP缓存控制意识,旨在生产,并在连续运行中使用,以避免下载未修改的数据(以节省带宽和加快爬行速度)。
实施的内容:
-
不要试图用存储响应/请求
no-store缓存控制指令集 -
如果
no-cache甚至为新响应设置了缓存控制指令 -
计算新鲜度寿命
max-age缓存控制指令 -
计算新鲜度寿命
Expires响应报头 -
计算新鲜度寿命
Last-Modified响应头(firefox使用的启发式方法) -
计算当前年龄
Age响应报头 -
计算当前年龄
Date页眉 -
基于以下内容重新验证过时响应
Last-Modified响应报头 -
基于以下内容重新验证过时响应
ETag响应报头 -
集合
Date接收到的任何响应的头丢失了它 -
支持
max-stale请求中的缓存控制指令
这允许spider使用完整的rfc2616缓存策略进行配置,但避免按请求进行重新验证,同时保持与HTTP规范一致。
例子:
添加
Cache-Control: max-stale=600请求头接受超过其过期时间不超过600秒的响应。另见:RFC2616,14.9.3
缺少什么:
-
Pragma: no-cache支持https://www.w3.org/protocols/rfc2616/rfc2616-sec14.html sec14.9.1 -
Vary头支持https://www.w3.org/protocols/rfc2616/rfc2616-sec13.html sec13.6 -
更新或删除后无效https://www.w3.org/protocols/rfc2616/rfc2616-sec13.html sec13.10
-
…可能还有其他……
-
文件系统存储后端(默认)¶
-
class
scrapy.extensions.httpcache.FilesystemCacheStorage[源代码]¶ -
文件系统存储后端可用于HTTP缓存中间件。
每个请求/响应对存储在包含以下文件的不同目录中:
-
request_body-普通请求主体 -
request_headers-请求头(原始HTTP格式) -
response_body-普通反应体 -
response_headers-请求头(原始HTTP格式) -
meta-python中这个缓存资源的一些元数据repr()格式(grep友好格式) -
pickled_meta-中的相同元数据meta但是为了更有效的反序列化而进行的pickled
目录名是根据请求指纹生成的(请参见
scrapy.utils.request.fingerprint一级子目录用于避免在同一目录中创建过多的文件(在许多文件系统中效率低下)。示例目录可以是:/path/to/cache/dir/example.com/72/72811f648e718090f041317756c03adb0ada46c7
-
DBM存储后端¶
-
class
scrapy.extensions.httpcache.DbmCacheStorage[源代码]¶ -
A DBM 存储后端也可用于HTTP缓存中间件。
默认情况下,它使用
dbm,但您可以用HTTPCACHE_DBM_MODULE设置。
编写自己的存储后端¶
您可以通过创建定义下面描述的方法的python类来实现缓存存储后端。
-
class
scrapy.extensions.httpcache.CacheStorage¶ -
-
open_spider(spider)¶ -
在打开蜘蛛进行爬行后调用此方法。它处理
open_spider信号。- 参数
-
spider (
Spiderobject) -- 已经打开的蜘蛛
-
close_spider(spider)¶ -
关闭spider后调用此方法。它处理
close_spider信号。- 参数
-
spider (
Spiderobject) -- 已关闭的蜘蛛
-
retrieve_response(spider, request)¶ -
如果缓存中存在,则返回响应,或者
None否则。- 参数
-
-
spider (
Spiderobject) -- 生成请求的蜘蛛 -
request (
Requestobject) -- 查找的缓存响应的请求
-
-
store_response(spider, request, response)¶ -
将给定的响应存储在缓存中。
- 参数
-
-
spider (
Spiderobject) -- 响应所针对的蜘蛛 -
request (
Requestobject) -- 蜘蛛生成的相应请求 -
response (
Responseobject) -- 存储在缓存中的响应
-
-
要使用存储后端,请设置:
-
HTTPCACHE_STORAGE到自定义存储类的python导入路径。
httpcache中间件设置¶
这个 HttpCacheMiddleware 可通过以下设置进行配置:
HTTPCACHE_ENABLED¶
违约: False
是否启用HTTP缓存。
HTTPCACHE_EXPIRATION_SECS¶
违约: 0
缓存请求的过期时间(秒)。
超过此时间的缓存请求将被重新下载。如果为零,则缓存请求将永不过期。
HTTPCACHE_DIR¶
违约: 'httpcache'
用于存储(低级)HTTP缓存的目录。如果为空,则将禁用HTTP缓存。如果给定了相对路径,则相对于项目数据目录。有关详细信息,请参阅: 报废项目的默认结构 .
HTTPCACHE_IGNORE_HTTP_CODES¶
违约: []
不要用这些HTTP代码缓存响应。
HTTPCACHE_IGNORE_MISSING¶
违约: False
如果启用,在缓存中找不到的请求将被忽略,而不是下载。
HTTPCACHE_IGNORE_SCHEMES¶
违约: ['file']
不要用这些URI方案缓存响应。
HTTPCACHE_STORAGE¶
违约: 'scrapy.extensions.httpcache.FilesystemCacheStorage'
实现缓存存储后端的类。
HTTPCACHE_DBM_MODULE¶
违约: 'dbm'
要在中使用的数据库模块 DBM storage backend . 此设置特定于DBM后端。
HTTPCACHE_POLICY¶
违约: 'scrapy.extensions.httpcache.DummyPolicy'
实现缓存策略的类。
HTTPCACHE_GZIP¶
违约: False
如果启用,将使用gzip压缩所有缓存数据。此设置特定于文件系统后端。
HTTPCACHE_ALWAYS_STORE¶
违约: False
如果启用,将无条件缓存页。
蜘蛛可能希望缓存中有所有可用的响应,以便将来与一起使用 Cache-Control: max-stale 例如。dummypolicy缓存所有响应,但从不重新验证它们,有时需要更细微的策略。
此设置仍然尊重 Cache-Control: no-store 回应中的指示。如果你不想要,过滤 no-store 在您提供给缓存中间件的响应中的缓存控制标头。
HTTPCACHE_IGNORE_RESPONSE_CACHE_CONTROLS¶
违约: []
要忽略的响应中的缓存控制指令列表。
网站通常会设置“无存储”、“无缓存”、“必须重新验证”等,但是如果蜘蛛真正遵守这些指令,它可能会产生流量,这会让网站感到不安。这允许有选择地忽略缓存控制指令,这些指令对于正在爬网的站点来说并不重要。
我们假设蜘蛛不会在请求中发出缓存控制指令,除非它确实需要它们,所以请求中的指令不会被过滤。
HttpCompressionMiddleware¶
-
class
scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware[源代码]¶ -
此中间件允许从网站发送/接收压缩(gzip、deflate)流量。
此中间件还支持解码 brotli-compressed 回答,提供 brotlipy 已安装。
httpcompression中间件设置¶
COMPRESSION_ENABLED¶
违约: True
是否启用压缩中间件。
HttpProxyMiddleware¶
-
class
scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware[源代码]¶ -
此中间件通过设置
proxy元价值Request物体。就像Python标准库模块一样
urllib.request,它遵循以下环境变量:-
http_proxy -
https_proxy -
no_proxy
您也可以设置meta键
proxyper-request, to a value likehttp://some_proxy_server:portorhttp://username:password@some_proxy_server:port. Keep in mind this value will take precedence overhttp_proxy/https_proxy环境变量,它也将忽略no_proxy环境变量。 -
RedirectMiddleware¶
-
class
scrapy.downloadermiddlewares.redirect.RedirectMiddleware[源代码]¶ -
此中间件根据响应状态处理请求的重定向。
请求通过的URL(在重定向时)可以在 redirect_urls Request.meta 关键。
每个重定向背后的原因 redirect_urls 可以在 redirect_reasons Request.meta 关键。例如: [301, 302, 307, 'meta refresh'] .
原因的格式取决于处理相应重定向的中间件。例如, RedirectMiddleware 以整数表示触发响应状态代码,而 MetaRefreshMiddleware 总是使用 'meta refresh' 字符串作为原因。
这个 RedirectMiddleware 可以通过以下设置进行配置(有关详细信息,请参阅设置文档):
-
REDIRECT_ENABLED -
REDIRECT_MAX_TIMES
如果 Request.meta 有 dont_redirect key设置为true,该中间件将忽略该请求。
如果要处理蜘蛛中的某些重定向状态代码,可以在 handle_httpstatus_list 蜘蛛属性。
例如,如果您希望重定向中间件忽略301和302响应(并将它们传递给您的spider),可以这样做:
class MySpider(CrawlSpider): handle_httpstatus_list = [301, 302]
这个 handle_httpstatus_list 关键 Request.meta 还可以用于指定每个请求允许哪些响应代码。您也可以设置meta键 handle_httpstatus_all 到 True 如果您想允许请求的任何响应代码。
重定向中间件设置¶
REDIRECT_ENABLED¶
违约: True
是否启用重定向中间件。
REDIRECT_MAX_TIMES¶
违约: 20
单个请求将遵循的最大重定向数。在这个最大值之后,请求的响应按原样返回。
MetaRefreshMiddleware¶
-
class
scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware[源代码]¶ -
此中间件处理基于meta-refresh html标记的请求重定向。
这个 MetaRefreshMiddleware 可以通过以下设置进行配置(有关详细信息,请参阅设置文档):
-
METAREFRESH_ENABLED -
METAREFRESH_IGNORE_TAGS -
METAREFRESH_MAXDELAY
这个中间件服从 REDIRECT_MAX_TIMES 设置, dont_redirect , redirect_urls 和 redirect_reasons 按说明请求元键 RedirectMiddleware
元刷新中间件设置¶
METAREFRESH_ENABLED¶
违约: True
是否启用元刷新中间件。
METAREFRESH_IGNORE_TAGS¶
违约: []
忽略这些标记中的元标记。
在 2.0 版更改: 默认值为 METAREFRESH_IGNORE_TAGS 从改变 ['script', 'noscript'] 到 [] .
METAREFRESH_MAXDELAY¶
违约: 100
重定向后的最大元刷新延迟(秒)。有些站点使用meta-refresh重定向到会话过期的页面,因此我们将自动重定向限制为最大延迟。
RetryMiddleware¶
-
class
scrapy.downloadermiddlewares.retry.RetryMiddleware¶ -
一种中间件,用于重试可能由临时问题(如连接超时或HTTP 500错误)引起的失败请求。
一旦爬行器完成对所有常规(非失败)页面的爬行,将在抓取过程中收集失败的页面,并在最后重新安排。
这个 RetryMiddleware 可以通过以下设置进行配置(有关详细信息,请参阅设置文档):
-
RETRY_ENABLED -
RETRY_TIMES -
RETRY_HTTP_CODES
如果 Request.meta 有 dont_retry key设置为true,该中间件将忽略该请求。
重试IDdleware设置¶
RETRY_ENABLED¶
违约: True
是否启用重试中间件。
RETRY_TIMES¶
违约: 2
除第一次下载外,还要重试的最大次数。
也可以使用指定每个请求的最大重试次数 max_retry_times 属性 Request.meta . 初始化时, max_retry_times 元键优先于 RETRY_TIMES 设置。
RETRY_HTTP_CODES¶
违约: [500, 502, 503, 504, 522, 524, 408, 429]
要重试的HTTP响应代码。总是重试其他错误(DNS查找问题、连接丢失等)。
在某些情况下,您可能希望将400添加到 RETRY_HTTP_CODES 因为它是用于指示服务器过载的常见代码。默认情况下不包括它,因为HTTP规范这么说。
RobotsTxtMiddleware¶
-
class
scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware¶ -
此中间件过滤掉robots.txt排除标准禁止的请求。
要确保scrapy尊重robots.txt,请确保启用中间件,并且
ROBOTSTXT_OBEY设置已启用。这个
ROBOTSTXT_USER_AGENT设置可用于指定用于在中进行匹配的用户代理字符串 robots.txt 文件。如果是的话None,随请求或USER_AGENT设置(按该顺序)将用于确定要在中使用的用户代理 robots.txt 文件。这个中间件必须与 robots.txt 解析器。
支持以下设备的废船 robots.txt 解析器:
-
Protego (默认)
-
RobotFileParser
-
Reppy
-
Robotexclusionrulesparser
你可以改变 robots.txt 具有
ROBOTSTXT_PARSER设置。或者你也可以 implement support for a new parser . -
如果 Request.meta 有 dont_obey_robotstxt 密钥设置为true,即使 ROBOTSTXT_OBEY 启用。
解析器在几个方面有所不同:
-
执行语言
-
支持的规范
-
支持通配符匹配
-
用法 length based rule :尤其是
Allow和Disallow指令,其中基于路径长度的最具体规则胜过不太具体(较短)的规则
不同解析器的性能比较可在 the following link .
Protego解析器¶
基于 Protego :
-
用Python实现
-
符合 Google's Robots.txt Specification
-
支持通配符匹配
-
使用基于长度的规则
Scrapy默认使用这个解析器。
RobotFileParser¶
基于 RobotFileParser :
-
是Python的内置 robots.txt 语法分析器
-
符合 Martijn Koster's 1996 draft specification
-
缺少对通配符匹配的支持
-
不使用基于长度的规则
它比protey 8.0之前的版本更快地兼容。
要使用此分析器,请设置:
-
ROBOTSTXT_PARSERtoscrapy.robotstxt.PythonRobotParser
Reppy解析器¶
基于 Reppy :
-
周围有一个Python包装 Robots Exclusion Protocol Parser for C++
-
符合 Martijn Koster's 1996 draft specification
-
支持通配符匹配
-
使用基于长度的规则
本机实现,提供比Protego更好的速度。
要使用此解析器:
-
安装 Reppy 通过运行
pip install reppy -
集合
ROBOTSTXT_PARSER设置为scrapy.robotstxt.ReppyRobotParser
RobotExclusionRuleSpaser¶
基于 Robotexclusionrulesparser :
-
用Python实现
-
符合 Martijn Koster's 1996 draft specification
-
支持通配符匹配
-
不使用基于长度的规则
要使用此解析器:
-
安装 Robotexclusionrulesparser 通过运行
pip install robotexclusionrulesparser -
集合
ROBOTSTXT_PARSER设置为scrapy.robotstxt.RerpRobotParser
实现对新解析器的支持¶
您可以实现对新的 robots.txt 通过对抽象基类进行子类化来分析程序 RobotParser 以及实现下述方法。
-
class
scrapy.robotstxt.RobotParser[源代码]¶ -
-
abstract
allowed(url, user_agent)[源代码]¶ -
返回
True如果user_agent允许爬行url,否则返回False.- 参数
-
-
url (str) -- 绝对网址
-
user_agent (str) -- 用户代理
-
-
abstract classmethod
from_crawler(crawler, robotstxt_body)[源代码]¶ -
分析 robots.txt 文件为字节。这必须是类方法。它必须返回解析器后端的新实例。
- 参数
-
-
crawler (
Crawlerinstance) -- 提出请求的爬虫 -
robotstxt_body (bytes) -- a的内容 robots.txt 文件。
-
-
abstract
DownloaderStats¶
-
class
scrapy.downloadermiddlewares.stats.DownloaderStats[源代码]¶ -
存储通过它的所有请求、响应和异常的统计信息的中间件。
要使用此中间件,必须启用
DOWNLOADER_STATS设置。
UserAgentMiddleware¶
-
class
scrapy.downloadermiddlewares.useragent.UserAgentMiddleware[源代码]¶ -
允许spider覆盖默认用户代理的中间件。
为了让spider重写默认的用户代理,其
user_agent必须设置属性。
AjaxCrawlMiddleware¶
-
class
scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware[源代码]¶ -
基于元片段html标记查找“AJAX可爬网”页面变体的中间件。看到了吗https://developers.google.com/search/docs/ajax-crawling/docs/getting-started了解更多信息。
注解
Scrapy查找“ajax可爬行”页面,查找类似
'http://example.com/!#foo=bar'即使没有这个中间件。当URL不包含时,需要AjaxCrawlMiddleware'!#'. 这通常是“索引”或“主要”网站页面的情况。
AjaxCrawl中间件设置¶
AJAXCRAWL_ENABLED¶
违约: False
是否启用AjaxCrawl中间件。您可能希望启用它 broad crawls .
httpproxymiddleware设置¶
HTTPPROXY_ENABLED¶
违约: True
是否启用 HttpProxyMiddleware .
HTTPPROXY_AUTH_ENCODING¶
违约: "latin-1"
上代理身份验证的默认编码 HttpProxyMiddleware .
CookiesMiddleware¶
-
class
scrapy.downloadermiddlewares.cookies.CookiesMiddleware[源代码]¶ -
此中间件支持使用需要cookie的站点,例如使用会话的站点。就像网络浏览器发送的cookies一样,它也会跟踪网络浏览器发出的请求。
警告
当非UTF8编码的字节序列传递给
Request, theCookiesMiddleware将记录一个警告。参考 高级自定义 自定义日志行为。
以下设置可用于配置cookie中间件:
-
COOKIES_ENABLED -
COOKIES_DEBUG
每个蜘蛛有多个cookie会话¶
通过使用 cookiejar 请求元键。默认情况下,它使用一个cookie jar(会话),但您可以通过一个标识符来使用不同的标识符。
例如::
for i, url in enumerate(urls): yield scrapy.Request(url, meta={'cookiejar': i}, callback=self.parse_page)
记住 cookiejar meta-key不是“粘性的”。您需要在随后的请求中继续传递它。例如::
def parse_page(self, response): # do some processing return scrapy.Request("http://www.example.com/otherpage", meta={'cookiejar': response.meta['cookiejar']}, callback=self.parse_other_page)
COOKIES_ENABLED¶
违约: True
是否启用cookie中间件。如果禁用,则不会向Web服务器发送cookie。
注意,尽管 COOKIES_ENABLED 设置中频 Request. Remeta: ['dont_merge_cookies'] <dont_merge_cookies>`评估结果为 True 请求cookies将 not 发送到Web服务器并在中接收cookie Response 将 not 与现有cookie合并。
有关详细信息,请参阅 cookies 参数在 Request .
COOKIES_DEBUG¶
违约: False
如果启用,Scrapy将记录发送到请求中的所有cookie(即。 Cookie 头)和响应中接收到的所有cookie(即。 Set-Cookie 标题)。
下面是一个使用 COOKIES_DEBUG 启用::
2011-04-06 14:35:10-0300 [scrapy.core.engine] INFO: Spider opened 2011-04-06 14:35:10-0300 [scrapy.downloadermiddlewares.cookies] DEBUG: Sending cookies to: <GET http://www.diningcity.com/netherlands/index.html> Cookie: clientlanguage_nl=en_EN 2011-04-06 14:35:14-0300 [scrapy.downloadermiddlewares.cookies] DEBUG: Received cookies from: <200 http://www.diningcity.com/netherlands/index.html> Set-Cookie: JSESSIONID=B~FA4DC0C496C8762AE4F1A620EAB34F38; Path=/ Set-Cookie: ip_isocode=US Set-Cookie: clientlanguage_nl=en_EN; Expires=Thu, 07-Apr-2011 21:21:34 GMT; Path=/ 2011-04-06 14:49:50-0300 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.diningcity.com/netherlands/index.html> (referer: None) [...]
每个蜘蛛有多个cookie会话¶
通过使用 cookiejar 请求元键。默认情况下,它使用一个cookie jar(会话),但您可以通过一个标识符来使用不同的标识符。
例如::
for i, url in enumerate(urls): yield scrapy.Request(url, meta={'cookiejar': i}, callback=self.parse_page)
记住 cookiejar meta-key不是“粘性的”。您需要在随后的请求中继续传递它。例如::
def parse_page(self, response): # do some processing return scrapy.Request("http://www.example.com/otherpage", meta={'cookiejar': response.meta['cookiejar']}, callback=self.parse_other_page)
COOKIES_ENABLED¶
违约: True
是否启用cookie中间件。如果禁用,则不会向Web服务器发送cookie。
注意,尽管 COOKIES_ENABLED 设置中频 Request. Remeta: ['dont_merge_cookies'] <dont_merge_cookies>`评估结果为 True 请求cookies将 not 发送到Web服务器并在中接收cookie Response 将 not 与现有cookie合并。
有关详细信息,请参阅 cookies 参数在 Request .
COOKIES_DEBUG¶
违约: False
如果启用,Scrapy将记录发送到请求中的所有cookie(即。 Cookie 头)和响应中接收到的所有cookie(即。 Set-Cookie 标题)。
下面是一个使用 COOKIES_DEBUG 启用::
2011-04-06 14:35:10-0300 [scrapy.core.engine] INFO: Spider opened 2011-04-06 14:35:10-0300 [scrapy.downloadermiddlewares.cookies] DEBUG: Sending cookies to: <GET http://www.diningcity.com/netherlands/index.html> Cookie: clientlanguage_nl=en_EN 2011-04-06 14:35:14-0300 [scrapy.downloadermiddlewares.cookies] DEBUG: Received cookies from: <200 http://www.diningcity.com/netherlands/index.html> Set-Cookie: JSESSIONID=B~FA4DC0C496C8762AE4F1A620EAB34F38; Path=/ Set-Cookie: ip_isocode=US Set-Cookie: clientlanguage_nl=en_EN; Expires=Thu, 07-Apr-2011 21:21:34 GMT; Path=/ 2011-04-06 14:49:50-0300 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.diningcity.com/netherlands/index.html> (referer: None) [...]
DefaultHeadersMiddleware¶
-
class
scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware[源代码]¶ -
此中间件设置在
DEFAULT_REQUEST_HEADERS设置。
DownloadTimeoutMiddleware¶
-
class
scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware[源代码]¶ -
此中间件为中指定的请求设置下载超时
DOWNLOAD_TIMEOUT设置或download_timeout蜘蛛属性。
注解
您还可以使用设置每个请求的下载超时 download_timeout request.meta key;即使禁用downloadTimeoutMiddleware,也支持此功能。
HttpAuthMiddleware¶
-
class
scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware[源代码]¶ -
此中间件使用 Basic access authentication (又名。HTTP AUTH)。
要从某些spider启用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请求和响应提供低级缓存。它必须与缓存存储后端以及缓存策略相结合。
带有三个HTTP缓存存储后端的 Scrapy 船:
-
文件系统存储后端(默认)
-
DBM存储后端
您可以使用
HTTPCACHE_STORAGE设置。或者你也可以 implement your own storage backend.Scrapy附带两个HTTP缓存策略:
-
RCF2616政策
-
虚拟策略(默认)
可以使用更改HTTP缓存策略
HTTPCACHE_POLICY设置。或者您也可以实现自己的策略。您还可以避免在使用
dont_cache元密钥相等True. -
虚拟策略(默认)¶
-
class
scrapy.extensions.httpcache.DummyPolicy[源代码]¶ -
此策略不知道任何HTTP缓存控制指令。每个请求及其相应的响应都被缓存。当再次看到相同的请求时,将返回响应,而不从Internet传输任何内容。
虚拟策略对于更快地测试spider(而不必每次都等待下载)以及在无法连接到Internet时尝试离线使用spider非常有用。目标是能够“重播”蜘蛛的奔跑 和以前一样 .
RCF2616政策¶
-
class
scrapy.extensions.httpcache.RFC2616Policy[源代码]¶ -
此策略提供了一个符合RFC2616的HTTP缓存,即具有HTTP缓存控制意识,旨在生产,并在连续运行中使用,以避免下载未修改的数据(以节省带宽和加快爬行速度)。
实施的内容:
-
不要试图用存储响应/请求
no-store缓存控制指令集 -
如果
no-cache甚至为新响应设置了缓存控制指令 -
计算新鲜度寿命
max-age缓存控制指令 -
计算新鲜度寿命
Expires响应报头 -
计算新鲜度寿命
Last-Modified响应头(firefox使用的启发式方法) -
计算当前年龄
Age响应报头 -
计算当前年龄
Date页眉 -
基于以下内容重新验证过时响应
Last-Modified响应报头 -
基于以下内容重新验证过时响应
ETag响应报头 -
集合
Date接收到的任何响应的头丢失了它 -
支持
max-stale请求中的缓存控制指令
这允许spider使用完整的rfc2616缓存策略进行配置,但避免按请求进行重新验证,同时保持与HTTP规范一致。
例子:
添加
Cache-Control: max-stale=600请求头接受超过其过期时间不超过600秒的响应。另见:RFC2616,14.9.3
缺少什么:
-
Pragma: no-cache支持https://www.w3.org/protocols/rfc2616/rfc2616-sec14.html sec14.9.1 -
Vary头支持https://www.w3.org/protocols/rfc2616/rfc2616-sec13.html sec13.6 -
更新或删除后无效https://www.w3.org/protocols/rfc2616/rfc2616-sec13.html sec13.10
-
…可能还有其他……
-
文件系统存储后端(默认)¶
-
class
scrapy.extensions.httpcache.FilesystemCacheStorage[源代码]¶ -
文件系统存储后端可用于HTTP缓存中间件。
每个请求/响应对存储在包含以下文件的不同目录中:
-
request_body-普通请求主体 -
request_headers-请求头(原始HTTP格式) -
response_body-普通反应体 -
response_headers-请求头(原始HTTP格式) -
meta-python中这个缓存资源的一些元数据repr()格式(grep友好格式) -
pickled_meta-中的相同元数据meta但是为了更有效的反序列化而进行的pickled
目录名是根据请求指纹生成的(请参见
scrapy.utils.request.fingerprint一级子目录用于避免在同一目录中创建过多的文件(在许多文件系统中效率低下)。示例目录可以是:/path/to/cache/dir/example.com/72/72811f648e718090f041317756c03adb0ada46c7
-
DBM存储后端¶
-
class
scrapy.extensions.httpcache.DbmCacheStorage[源代码]¶ -
A DBM 存储后端也可用于HTTP缓存中间件。
默认情况下,它使用
dbm,但您可以用HTTPCACHE_DBM_MODULE设置。
编写自己的存储后端¶
您可以通过创建定义下面描述的方法的python类来实现缓存存储后端。
-
class
scrapy.extensions.httpcache.CacheStorage¶ -
-
open_spider(spider)¶ -
在打开蜘蛛进行爬行后调用此方法。它处理
open_spider信号。- 参数
-
spider (
Spiderobject) -- 已经打开的蜘蛛
-
close_spider(spider)¶ -
关闭spider后调用此方法。它处理
close_spider信号。- 参数
-
spider (
Spiderobject) -- 已关闭的蜘蛛
-
retrieve_response(spider, request)¶ -
如果缓存中存在,则返回响应,或者
None否则。- 参数
-
-
spider (
Spiderobject) -- 生成请求的蜘蛛 -
request (
Requestobject) -- 查找的缓存响应的请求
-
-
store_response(spider, request, response)¶ -
将给定的响应存储在缓存中。
- 参数
-
-
spider (
Spiderobject) -- 响应所针对的蜘蛛 -
request (
Requestobject) -- 蜘蛛生成的相应请求 -
response (
Responseobject) -- 存储在缓存中的响应
-
-
要使用存储后端,请设置:
-
HTTPCACHE_STORAGE到自定义存储类的python导入路径。
httpcache中间件设置¶
这个 HttpCacheMiddleware 可通过以下设置进行配置:
HTTPCACHE_ENABLED¶
违约: False
是否启用HTTP缓存。
HTTPCACHE_EXPIRATION_SECS¶
违约: 0
缓存请求的过期时间(秒)。
超过此时间的缓存请求将被重新下载。如果为零,则缓存请求将永不过期。
HTTPCACHE_DIR¶
违约: 'httpcache'
用于存储(低级)HTTP缓存的目录。如果为空,则将禁用HTTP缓存。如果给定了相对路径,则相对于项目数据目录。有关详细信息,请参阅: 报废项目的默认结构 .
HTTPCACHE_IGNORE_HTTP_CODES¶
违约: []
不要用这些HTTP代码缓存响应。
HTTPCACHE_IGNORE_MISSING¶
违约: False
如果启用,在缓存中找不到的请求将被忽略,而不是下载。
HTTPCACHE_IGNORE_SCHEMES¶
违约: ['file']
不要用这些URI方案缓存响应。
HTTPCACHE_STORAGE¶
违约: 'scrapy.extensions.httpcache.FilesystemCacheStorage'
实现缓存存储后端的类。
HTTPCACHE_DBM_MODULE¶
违约: 'dbm'
要在中使用的数据库模块 DBM storage backend . 此设置特定于DBM后端。
HTTPCACHE_POLICY¶
违约: 'scrapy.extensions.httpcache.DummyPolicy'
实现缓存策略的类。
HTTPCACHE_GZIP¶
违约: False
如果启用,将使用gzip压缩所有缓存数据。此设置特定于文件系统后端。
HTTPCACHE_ALWAYS_STORE¶
违约: False
如果启用,将无条件缓存页。
蜘蛛可能希望缓存中有所有可用的响应,以便将来与一起使用 Cache-Control: max-stale 例如。dummypolicy缓存所有响应,但从不重新验证它们,有时需要更细微的策略。
此设置仍然尊重 Cache-Control: no-store 回应中的指示。如果你不想要,过滤 no-store 在您提供给缓存中间件的响应中的缓存控制标头。
HTTPCACHE_IGNORE_RESPONSE_CACHE_CONTROLS¶
违约: []
要忽略的响应中的缓存控制指令列表。
网站通常会设置“无存储”、“无缓存”、“必须重新验证”等,但是如果蜘蛛真正遵守这些指令,它可能会产生流量,这会让网站感到不安。这允许有选择地忽略缓存控制指令,这些指令对于正在爬网的站点来说并不重要。
我们假设蜘蛛不会在请求中发出缓存控制指令,除非它确实需要它们,所以请求中的指令不会被过滤。
虚拟策略(默认)¶
-
class
scrapy.extensions.httpcache.DummyPolicy[源代码]¶ -
此策略不知道任何HTTP缓存控制指令。每个请求及其相应的响应都被缓存。当再次看到相同的请求时,将返回响应,而不从Internet传输任何内容。
虚拟策略对于更快地测试spider(而不必每次都等待下载)以及在无法连接到Internet时尝试离线使用spider非常有用。目标是能够“重播”蜘蛛的奔跑 和以前一样 .
RCF2616政策¶
-
class
scrapy.extensions.httpcache.RFC2616Policy[源代码]¶ -
此策略提供了一个符合RFC2616的HTTP缓存,即具有HTTP缓存控制意识,旨在生产,并在连续运行中使用,以避免下载未修改的数据(以节省带宽和加快爬行速度)。
实施的内容:
-
不要试图用存储响应/请求
no-store缓存控制指令集 -
如果
no-cache甚至为新响应设置了缓存控制指令 -
计算新鲜度寿命
max-age缓存控制指令 -
计算新鲜度寿命
Expires响应报头 -
计算新鲜度寿命
Last-Modified响应头(firefox使用的启发式方法) -
计算当前年龄
Age响应报头 -
计算当前年龄
Date页眉 -
基于以下内容重新验证过时响应
Last-Modified响应报头 -
基于以下内容重新验证过时响应
ETag响应报头 -
集合
Date接收到的任何响应的头丢失了它 -
支持
max-stale请求中的缓存控制指令
这允许spider使用完整的rfc2616缓存策略进行配置,但避免按请求进行重新验证,同时保持与HTTP规范一致。
例子:
添加
Cache-Control: max-stale=600请求头接受超过其过期时间不超过600秒的响应。另见:RFC2616,14.9.3
缺少什么:
-
Pragma: no-cache支持https://www.w3.org/protocols/rfc2616/rfc2616-sec14.html sec14.9.1 -
Vary头支持https://www.w3.org/protocols/rfc2616/rfc2616-sec13.html sec13.6 -
更新或删除后无效https://www.w3.org/protocols/rfc2616/rfc2616-sec13.html sec13.10
-
…可能还有其他……
-
文件系统存储后端(默认)¶
-
class
scrapy.extensions.httpcache.FilesystemCacheStorage[源代码]¶ -
文件系统存储后端可用于HTTP缓存中间件。
每个请求/响应对存储在包含以下文件的不同目录中:
-
request_body-普通请求主体 -
request_headers-请求头(原始HTTP格式) -
response_body-普通反应体 -
response_headers-请求头(原始HTTP格式) -
meta-python中这个缓存资源的一些元数据repr()格式(grep友好格式) -
pickled_meta-中的相同元数据meta但是为了更有效的反序列化而进行的pickled
目录名是根据请求指纹生成的(请参见
scrapy.utils.request.fingerprint一级子目录用于避免在同一目录中创建过多的文件(在许多文件系统中效率低下)。示例目录可以是:/path/to/cache/dir/example.com/72/72811f648e718090f041317756c03adb0ada46c7
-
DBM存储后端¶
-
class
scrapy.extensions.httpcache.DbmCacheStorage[源代码]¶ -
A DBM 存储后端也可用于HTTP缓存中间件。
默认情况下,它使用
dbm,但您可以用HTTPCACHE_DBM_MODULE设置。
编写自己的存储后端¶
您可以通过创建定义下面描述的方法的python类来实现缓存存储后端。
-
class
scrapy.extensions.httpcache.CacheStorage¶ -
-
open_spider(spider)¶ -
在打开蜘蛛进行爬行后调用此方法。它处理
open_spider信号。- 参数
-
spider (
Spiderobject) -- 已经打开的蜘蛛
-
close_spider(spider)¶ -
关闭spider后调用此方法。它处理
close_spider信号。- 参数
-
spider (
Spiderobject) -- 已关闭的蜘蛛
-
retrieve_response(spider, request)¶ -
如果缓存中存在,则返回响应,或者
None否则。- 参数
-
-
spider (
Spiderobject) -- 生成请求的蜘蛛 -
request (
Requestobject) -- 查找的缓存响应的请求
-
-
store_response(spider, request, response)¶ -
将给定的响应存储在缓存中。
- 参数
-
-
spider (
Spiderobject) -- 响应所针对的蜘蛛 -
request (
Requestobject) -- 蜘蛛生成的相应请求 -
response (
Responseobject) -- 存储在缓存中的响应
-
-
要使用存储后端,请设置:
-
HTTPCACHE_STORAGE到自定义存储类的python导入路径。
httpcache中间件设置¶
这个 HttpCacheMiddleware 可通过以下设置进行配置:
HTTPCACHE_ENABLED¶
违约: False
是否启用HTTP缓存。
HTTPCACHE_EXPIRATION_SECS¶
违约: 0
缓存请求的过期时间(秒)。
超过此时间的缓存请求将被重新下载。如果为零,则缓存请求将永不过期。
HTTPCACHE_DIR¶
违约: 'httpcache'
用于存储(低级)HTTP缓存的目录。如果为空,则将禁用HTTP缓存。如果给定了相对路径,则相对于项目数据目录。有关详细信息,请参阅: 报废项目的默认结构 .
HTTPCACHE_IGNORE_HTTP_CODES¶
违约: []
不要用这些HTTP代码缓存响应。
HTTPCACHE_IGNORE_MISSING¶
违约: False
如果启用,在缓存中找不到的请求将被忽略,而不是下载。
HTTPCACHE_IGNORE_SCHEMES¶
违约: ['file']
不要用这些URI方案缓存响应。
HTTPCACHE_STORAGE¶
违约: 'scrapy.extensions.httpcache.FilesystemCacheStorage'
实现缓存存储后端的类。
HTTPCACHE_DBM_MODULE¶
违约: 'dbm'
要在中使用的数据库模块 DBM storage backend . 此设置特定于DBM后端。
HTTPCACHE_POLICY¶
违约: 'scrapy.extensions.httpcache.DummyPolicy'
实现缓存策略的类。
HTTPCACHE_GZIP¶
违约: False
如果启用,将使用gzip压缩所有缓存数据。此设置特定于文件系统后端。
HTTPCACHE_ALWAYS_STORE¶
违约: False
如果启用,将无条件缓存页。
蜘蛛可能希望缓存中有所有可用的响应,以便将来与一起使用 Cache-Control: max-stale 例如。dummypolicy缓存所有响应,但从不重新验证它们,有时需要更细微的策略。
此设置仍然尊重 Cache-Control: no-store 回应中的指示。如果你不想要,过滤 no-store 在您提供给缓存中间件的响应中的缓存控制标头。
HTTPCACHE_IGNORE_RESPONSE_CACHE_CONTROLS¶
违约: []
要忽略的响应中的缓存控制指令列表。
网站通常会设置“无存储”、“无缓存”、“必须重新验证”等,但是如果蜘蛛真正遵守这些指令,它可能会产生流量,这会让网站感到不安。这允许有选择地忽略缓存控制指令,这些指令对于正在爬网的站点来说并不重要。
我们假设蜘蛛不会在请求中发出缓存控制指令,除非它确实需要它们,所以请求中的指令不会被过滤。
HTTPCACHE_ENABLED¶
违约: False
是否启用HTTP缓存。
HTTPCACHE_EXPIRATION_SECS¶
违约: 0
缓存请求的过期时间(秒)。
超过此时间的缓存请求将被重新下载。如果为零,则缓存请求将永不过期。
HTTPCACHE_DIR¶
违约: 'httpcache'
用于存储(低级)HTTP缓存的目录。如果为空,则将禁用HTTP缓存。如果给定了相对路径,则相对于项目数据目录。有关详细信息,请参阅: 报废项目的默认结构 .
HTTPCACHE_IGNORE_HTTP_CODES¶
违约: []
不要用这些HTTP代码缓存响应。
HTTPCACHE_IGNORE_MISSING¶
违约: False
如果启用,在缓存中找不到的请求将被忽略,而不是下载。
HTTPCACHE_IGNORE_SCHEMES¶
违约: ['file']
不要用这些URI方案缓存响应。
HTTPCACHE_STORAGE¶
违约: 'scrapy.extensions.httpcache.FilesystemCacheStorage'
实现缓存存储后端的类。
HTTPCACHE_DBM_MODULE¶
违约: 'dbm'
要在中使用的数据库模块 DBM storage backend . 此设置特定于DBM后端。
HTTPCACHE_POLICY¶
违约: 'scrapy.extensions.httpcache.DummyPolicy'
实现缓存策略的类。
HTTPCACHE_GZIP¶
违约: False
如果启用,将使用gzip压缩所有缓存数据。此设置特定于文件系统后端。
HTTPCACHE_ALWAYS_STORE¶
违约: False
如果启用,将无条件缓存页。
蜘蛛可能希望缓存中有所有可用的响应,以便将来与一起使用 Cache-Control: max-stale 例如。dummypolicy缓存所有响应,但从不重新验证它们,有时需要更细微的策略。
此设置仍然尊重 Cache-Control: no-store 回应中的指示。如果你不想要,过滤 no-store 在您提供给缓存中间件的响应中的缓存控制标头。
HTTPCACHE_IGNORE_RESPONSE_CACHE_CONTROLS¶
违约: []
要忽略的响应中的缓存控制指令列表。
网站通常会设置“无存储”、“无缓存”、“必须重新验证”等,但是如果蜘蛛真正遵守这些指令,它可能会产生流量,这会让网站感到不安。这允许有选择地忽略缓存控制指令,这些指令对于正在爬网的站点来说并不重要。
我们假设蜘蛛不会在请求中发出缓存控制指令,除非它确实需要它们,所以请求中的指令不会被过滤。
HttpCompressionMiddleware¶
-
class
scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware[源代码]¶ -
此中间件允许从网站发送/接收压缩(gzip、deflate)流量。
此中间件还支持解码 brotli-compressed 回答,提供 brotlipy 已安装。
httpcompression中间件设置¶
COMPRESSION_ENABLED¶
违约: True
是否启用压缩中间件。
httpcompression中间件设置¶
COMPRESSION_ENABLED¶
违约: True
是否启用压缩中间件。
COMPRESSION_ENABLED¶
违约: True
是否启用压缩中间件。
HttpProxyMiddleware¶
-
class
scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware[源代码]¶ -
此中间件通过设置
proxy元价值Request物体。就像Python标准库模块一样
urllib.request,它遵循以下环境变量:-
http_proxy -
https_proxy -
no_proxy
您也可以设置meta键
proxyper-request, to a value likehttp://some_proxy_server:portorhttp://username:password@some_proxy_server:port. Keep in mind this value will take precedence overhttp_proxy/https_proxy环境变量,它也将忽略no_proxy环境变量。 -
RedirectMiddleware¶
-
class
scrapy.downloadermiddlewares.redirect.RedirectMiddleware[源代码]¶ -
此中间件根据响应状态处理请求的重定向。
请求通过的URL(在重定向时)可以在 redirect_urls Request.meta 关键。
每个重定向背后的原因 redirect_urls 可以在 redirect_reasons Request.meta 关键。例如: [301, 302, 307, 'meta refresh'] .
原因的格式取决于处理相应重定向的中间件。例如, RedirectMiddleware 以整数表示触发响应状态代码,而 MetaRefreshMiddleware 总是使用 'meta refresh' 字符串作为原因。
这个 RedirectMiddleware 可以通过以下设置进行配置(有关详细信息,请参阅设置文档):
-
REDIRECT_ENABLED -
REDIRECT_MAX_TIMES
如果 Request.meta 有 dont_redirect key设置为true,该中间件将忽略该请求。
如果要处理蜘蛛中的某些重定向状态代码,可以在 handle_httpstatus_list 蜘蛛属性。
例如,如果您希望重定向中间件忽略301和302响应(并将它们传递给您的spider),可以这样做:
class MySpider(CrawlSpider): handle_httpstatus_list = [301, 302]
这个 handle_httpstatus_list 关键 Request.meta 还可以用于指定每个请求允许哪些响应代码。您也可以设置meta键 handle_httpstatus_all 到 True 如果您想允许请求的任何响应代码。
重定向中间件设置¶
REDIRECT_ENABLED¶
违约: True
是否启用重定向中间件。
REDIRECT_MAX_TIMES¶
违约: 20
单个请求将遵循的最大重定向数。在这个最大值之后,请求的响应按原样返回。
重定向中间件设置¶
REDIRECT_ENABLED¶
违约: True
是否启用重定向中间件。
REDIRECT_MAX_TIMES¶
违约: 20
单个请求将遵循的最大重定向数。在这个最大值之后,请求的响应按原样返回。
REDIRECT_ENABLED¶
违约: True
是否启用重定向中间件。
REDIRECT_MAX_TIMES¶
违约: 20
单个请求将遵循的最大重定向数。在这个最大值之后,请求的响应按原样返回。
MetaRefreshMiddleware¶
-
class
scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware[源代码]¶ -
此中间件处理基于meta-refresh html标记的请求重定向。
这个 MetaRefreshMiddleware 可以通过以下设置进行配置(有关详细信息,请参阅设置文档):
-
METAREFRESH_ENABLED -
METAREFRESH_IGNORE_TAGS -
METAREFRESH_MAXDELAY
这个中间件服从 REDIRECT_MAX_TIMES 设置, dont_redirect , redirect_urls 和 redirect_reasons 按说明请求元键 RedirectMiddleware
元刷新中间件设置¶
METAREFRESH_ENABLED¶
违约: True
是否启用元刷新中间件。
METAREFRESH_IGNORE_TAGS¶
违约: []
忽略这些标记中的元标记。
在 2.0 版更改: 默认值为 METAREFRESH_IGNORE_TAGS 从改变 ['script', 'noscript'] 到 [] .
METAREFRESH_MAXDELAY¶
违约: 100
重定向后的最大元刷新延迟(秒)。有些站点使用meta-refresh重定向到会话过期的页面,因此我们将自动重定向限制为最大延迟。
元刷新中间件设置¶
METAREFRESH_ENABLED¶
违约: True
是否启用元刷新中间件。
METAREFRESH_IGNORE_TAGS¶
违约: []
忽略这些标记中的元标记。
在 2.0 版更改: 默认值为 METAREFRESH_IGNORE_TAGS 从改变 ['script', 'noscript'] 到 [] .
METAREFRESH_MAXDELAY¶
违约: 100
重定向后的最大元刷新延迟(秒)。有些站点使用meta-refresh重定向到会话过期的页面,因此我们将自动重定向限制为最大延迟。
METAREFRESH_ENABLED¶
违约: True
是否启用元刷新中间件。
METAREFRESH_IGNORE_TAGS¶
违约: []
忽略这些标记中的元标记。
在 2.0 版更改: 默认值为 METAREFRESH_IGNORE_TAGS 从改变 ['script', 'noscript'] 到 [] .
METAREFRESH_MAXDELAY¶
违约: 100
重定向后的最大元刷新延迟(秒)。有些站点使用meta-refresh重定向到会话过期的页面,因此我们将自动重定向限制为最大延迟。
RetryMiddleware¶
-
class
scrapy.downloadermiddlewares.retry.RetryMiddleware¶ -
一种中间件,用于重试可能由临时问题(如连接超时或HTTP 500错误)引起的失败请求。
一旦爬行器完成对所有常规(非失败)页面的爬行,将在抓取过程中收集失败的页面,并在最后重新安排。
这个 RetryMiddleware 可以通过以下设置进行配置(有关详细信息,请参阅设置文档):
-
RETRY_ENABLED -
RETRY_TIMES -
RETRY_HTTP_CODES
如果 Request.meta 有 dont_retry key设置为true,该中间件将忽略该请求。
重试IDdleware设置¶
RETRY_ENABLED¶
违约: True
是否启用重试中间件。
RETRY_TIMES¶
违约: 2
除第一次下载外,还要重试的最大次数。
也可以使用指定每个请求的最大重试次数 max_retry_times 属性 Request.meta . 初始化时, max_retry_times 元键优先于 RETRY_TIMES 设置。
RETRY_HTTP_CODES¶
违约: [500, 502, 503, 504, 522, 524, 408, 429]
要重试的HTTP响应代码。总是重试其他错误(DNS查找问题、连接丢失等)。
在某些情况下,您可能希望将400添加到 RETRY_HTTP_CODES 因为它是用于指示服务器过载的常见代码。默认情况下不包括它,因为HTTP规范这么说。
重试IDdleware设置¶
RETRY_ENABLED¶
违约: True
是否启用重试中间件。
RETRY_TIMES¶
违约: 2
除第一次下载外,还要重试的最大次数。
也可以使用指定每个请求的最大重试次数 max_retry_times 属性 Request.meta . 初始化时, max_retry_times 元键优先于 RETRY_TIMES 设置。
RETRY_HTTP_CODES¶
违约: [500, 502, 503, 504, 522, 524, 408, 429]
要重试的HTTP响应代码。总是重试其他错误(DNS查找问题、连接丢失等)。
在某些情况下,您可能希望将400添加到 RETRY_HTTP_CODES 因为它是用于指示服务器过载的常见代码。默认情况下不包括它,因为HTTP规范这么说。
RETRY_ENABLED¶
违约: True
是否启用重试中间件。
RETRY_TIMES¶
违约: 2
除第一次下载外,还要重试的最大次数。
也可以使用指定每个请求的最大重试次数 max_retry_times 属性 Request.meta . 初始化时, max_retry_times 元键优先于 RETRY_TIMES 设置。
RETRY_HTTP_CODES¶
违约: [500, 502, 503, 504, 522, 524, 408, 429]
要重试的HTTP响应代码。总是重试其他错误(DNS查找问题、连接丢失等)。
在某些情况下,您可能希望将400添加到 RETRY_HTTP_CODES 因为它是用于指示服务器过载的常见代码。默认情况下不包括它,因为HTTP规范这么说。
RobotsTxtMiddleware¶
-
class
scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware¶ -
此中间件过滤掉robots.txt排除标准禁止的请求。
要确保scrapy尊重robots.txt,请确保启用中间件,并且
ROBOTSTXT_OBEY设置已启用。这个
ROBOTSTXT_USER_AGENT设置可用于指定用于在中进行匹配的用户代理字符串 robots.txt 文件。如果是的话None,随请求或USER_AGENT设置(按该顺序)将用于确定要在中使用的用户代理 robots.txt 文件。这个中间件必须与 robots.txt 解析器。
支持以下设备的废船 robots.txt 解析器:
-
Protego (默认)
-
RobotFileParser
-
Reppy
-
Robotexclusionrulesparser
你可以改变 robots.txt 具有
ROBOTSTXT_PARSER设置。或者你也可以 implement support for a new parser . -
如果 Request.meta 有 dont_obey_robotstxt 密钥设置为true,即使 ROBOTSTXT_OBEY 启用。
解析器在几个方面有所不同:
-
执行语言
-
支持的规范
-
支持通配符匹配
-
用法 length based rule :尤其是
Allow和Disallow指令,其中基于路径长度的最具体规则胜过不太具体(较短)的规则
不同解析器的性能比较可在 the following link .
Protego解析器¶
基于 Protego :
-
用Python实现
-
符合 Google's Robots.txt Specification
-
支持通配符匹配
-
使用基于长度的规则
Scrapy默认使用这个解析器。
RobotFileParser¶
基于 RobotFileParser :
-
是Python的内置 robots.txt 语法分析器
-
符合 Martijn Koster's 1996 draft specification
-
缺少对通配符匹配的支持
-
不使用基于长度的规则
它比protey 8.0之前的版本更快地兼容。
要使用此分析器,请设置:
-
ROBOTSTXT_PARSERtoscrapy.robotstxt.PythonRobotParser
Reppy解析器¶
基于 Reppy :
-
周围有一个Python包装 Robots Exclusion Protocol Parser for C++
-
符合 Martijn Koster's 1996 draft specification
-
支持通配符匹配
-
使用基于长度的规则
本机实现,提供比Protego更好的速度。
要使用此解析器:
-
安装 Reppy 通过运行
pip install reppy -
集合
ROBOTSTXT_PARSER设置为scrapy.robotstxt.ReppyRobotParser
RobotExclusionRuleSpaser¶
基于 Robotexclusionrulesparser :
-
用Python实现
-
符合 Martijn Koster's 1996 draft specification
-
支持通配符匹配
-
不使用基于长度的规则
要使用此解析器:
-
安装 Robotexclusionrulesparser 通过运行
pip install robotexclusionrulesparser -
集合
ROBOTSTXT_PARSER设置为scrapy.robotstxt.RerpRobotParser
Protego解析器¶
基于 Protego :
-
用Python实现
-
符合 Google's Robots.txt Specification
-
支持通配符匹配
-
使用基于长度的规则
Scrapy默认使用这个解析器。
RobotFileParser¶
基于 RobotFileParser :
-
是Python的内置 robots.txt 语法分析器
-
符合 Martijn Koster's 1996 draft specification
-
缺少对通配符匹配的支持
-
不使用基于长度的规则
它比protey 8.0之前的版本更快地兼容。
要使用此分析器,请设置:
-
ROBOTSTXT_PARSERtoscrapy.robotstxt.PythonRobotParser
Reppy解析器¶
基于 Reppy :
-
周围有一个Python包装 Robots Exclusion Protocol Parser for C++
-
符合 Martijn Koster's 1996 draft specification
-
支持通配符匹配
-
使用基于长度的规则
本机实现,提供比Protego更好的速度。
要使用此解析器:
-
安装 Reppy 通过运行
pip install reppy -
集合
ROBOTSTXT_PARSER设置为scrapy.robotstxt.ReppyRobotParser
RobotExclusionRuleSpaser¶
基于 Robotexclusionrulesparser :
-
用Python实现
-
符合 Martijn Koster's 1996 draft specification
-
支持通配符匹配
-
不使用基于长度的规则
要使用此解析器:
-
安装 Robotexclusionrulesparser 通过运行
pip install robotexclusionrulesparser -
集合
ROBOTSTXT_PARSER设置为scrapy.robotstxt.RerpRobotParser
实现对新解析器的支持¶
您可以实现对新的 robots.txt 通过对抽象基类进行子类化来分析程序 RobotParser 以及实现下述方法。
-
class
scrapy.robotstxt.RobotParser[源代码]¶ -
-
abstract
allowed(url, user_agent)[源代码]¶ -
返回
True如果user_agent允许爬行url,否则返回False.- 参数
-
-
url (str) -- 绝对网址
-
user_agent (str) -- 用户代理
-
-
abstract classmethod
from_crawler(crawler, robotstxt_body)[源代码]¶ -
分析 robots.txt 文件为字节。这必须是类方法。它必须返回解析器后端的新实例。
- 参数
-
-
crawler (
Crawlerinstance) -- 提出请求的爬虫 -
robotstxt_body (bytes) -- a的内容 robots.txt 文件。
-
-
abstract
DownloaderStats¶
-
class
scrapy.downloadermiddlewares.stats.DownloaderStats[源代码]¶ -
存储通过它的所有请求、响应和异常的统计信息的中间件。
要使用此中间件,必须启用
DOWNLOADER_STATS设置。
UserAgentMiddleware¶
-
class
scrapy.downloadermiddlewares.useragent.UserAgentMiddleware[源代码]¶ -
允许spider覆盖默认用户代理的中间件。
为了让spider重写默认的用户代理,其
user_agent必须设置属性。
AjaxCrawlMiddleware¶
-
class
scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware[源代码]¶ -
基于元片段html标记查找“AJAX可爬网”页面变体的中间件。看到了吗https://developers.google.com/search/docs/ajax-crawling/docs/getting-started了解更多信息。
注解
Scrapy查找“ajax可爬行”页面,查找类似
'http://example.com/!#foo=bar'即使没有这个中间件。当URL不包含时,需要AjaxCrawlMiddleware'!#'. 这通常是“索引”或“主要”网站页面的情况。
AjaxCrawl中间件设置¶
AJAXCRAWL_ENABLED¶
违约: False
是否启用AjaxCrawl中间件。您可能希望启用它 broad crawls .
httpproxymiddleware设置¶
HTTPPROXY_ENABLED¶
违约: True
是否启用 HttpProxyMiddleware .
HTTPPROXY_AUTH_ENCODING¶
违约: "latin-1"
上代理身份验证的默认编码 HttpProxyMiddleware .
AjaxCrawl中间件设置¶
AJAXCRAWL_ENABLED¶
违约: False
是否启用AjaxCrawl中间件。您可能希望启用它 broad crawls .
AJAXCRAWL_ENABLED¶
违约: False
是否启用AjaxCrawl中间件。您可能希望启用它 broad crawls .
httpproxymiddleware设置¶
HTTPPROXY_ENABLED¶
违约: True
是否启用 HttpProxyMiddleware .
HTTPPROXY_AUTH_ENCODING¶
违约: "latin-1"
上代理身份验证的默认编码 HttpProxyMiddleware .
HTTPPROXY_ENABLED¶
违约: True
是否启用 HttpProxyMiddleware .
HTTPPROXY_AUTH_ENCODING¶
违约: "latin-1"
上代理身份验证的默认编码 HttpProxyMiddleware .