下载器中间件
下载器中间件是 Scrapy 请求/响应处理的钩子框架。它是一个轻量级的低层系统,用于全局修改 Scrapy 的请求和响应。
激活下载器中间件
要激活下载器中间件组件,请将其添加到 DOWNLOADER_MIDDLEWARES
设置中,该设置是一个字典,其键是中间件类路径,值是中间件的顺序。
示例
DOWNLOADER_MIDDLEWARES = {
"myproject.middlewares.CustomDownloaderMiddleware": 543,
}
DOWNLOADER_MIDDLEWARES
设置会与 Scrapy 中定义的 DOWNLOADER_MIDDLEWARES_BASE
设置(不应被覆盖)合并,然后按顺序排序以获得最终启用的中间件列表:第一个中间件离引擎更近,最后一个离下载器更近。换句话说,每个中间件的 process_request()
方法将按中间件顺序递增调用(100、200、300 等),而每个中间件的 process_response()
方法将按顺序递减调用。
要决定为您的中间件分配哪个顺序,请查看 DOWNLOADER_MIDDLEWARES_BASE
设置并根据您想插入中间件的位置选择一个值。顺序很重要,因为每个中间件执行不同的操作,您的中间件可能依赖于之前(或之后)应用的一些中间件。
如果您想禁用内置中间件(即 DOWNLOADER_MIDDLEWARES_BASE
中定义并默认启用的中间件),您必须在项目的 DOWNLOADER_MIDDLEWARES
设置中定义它,并将其值设置为 None
。例如,如果您想禁用 user-agent 中间件
DOWNLOADER_MIDDLEWARES = {
"myproject.middlewares.CustomDownloaderMiddleware": 543,
"scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": None,
}
最后,请记住某些中间件可能需要通过特定设置来启用。有关更多信息,请参阅每个中间件的文档。
编写自己的下载器中间件
每个下载器中间件都是一个 组件,它定义了一个或多个以下方法
- class scrapy.downloadermiddlewares.DownloaderMiddleware
注意
任何下载器中间件方法也可能返回一个 deferred(延迟对象)。
- process_request(request, spider)
此方法在每个经过下载器中间件的请求被调用时执行。
process_request()
应该返回以下之一:None
,一个Response
对象,一个Request
对象,或抛出IgnoreRequest
异常。如果它返回
None
,Scrapy 将继续处理此请求,执行所有其他中间件,直到最终调用相应的下载器处理程序来执行请求(并下载其响应)。如果它返回一个
Response
对象,Scrapy 将不再调用 *任何* 其他process_request()
或process_exception()
方法,也不会调用相应的下载函数;它将直接返回该响应。已安装中间件的process_response()
方法始终会在每个响应上被调用。如果它返回一个
Request
对象,Scrapy 将停止调用process_request()
方法并重新调度返回的请求。一旦新的请求被执行,相应的中间件链将对下载的响应进行调用。如果它抛出
IgnoreRequest
异常,则将调用已安装下载器中间件的process_exception()
方法。如果没有中间件处理该异常,则会调用请求的 errback 函数(Request.errback
)。如果没有代码处理抛出的异常,它将被忽略且不记录日志(与其他异常不同)。
- process_response(request, response, spider)
process_response()
应该返回以下之一:一个Response
对象,一个Request
对象,或抛出IgnoreRequest
异常。如果它返回一个
Response
对象(可以是给定的同一个响应,也可以是一个全新的响应),该响应将继续由链中下一个中间件的process_response()
方法处理。如果它返回一个
Request
对象,中间件链将中止,并且返回的请求将被重新调度以便将来下载。这与process_request()
返回请求时的行为相同。如果它抛出
IgnoreRequest
异常,则会调用请求的 errback 函数(Request.errback
)。如果没有代码处理抛出的异常,它将被忽略且不记录日志(与其他异常不同)。
- process_exception(request, exception, spider)
当下载处理程序或
process_request()
(来自下载器中间件)抛出异常(包括IgnoreRequest
异常)时,Scrapy 会调用process_exception()
方法process_exception()
应该返回以下之一:None
,一个Response
对象,或一个Request
对象。如果它返回
None
,Scrapy 将继续处理此异常,执行所有其他已安装中间件的process_exception()
方法,直到没有中间件剩余,然后启用默认异常处理。如果它返回一个
Response
对象,则会启动已安装中间件的process_response()
方法链,Scrapy 将不再调用任何其他中间件的process_exception()
方法。如果它返回一个
Request
对象,返回的请求将被重新调度以便将来下载。这会像返回响应一样停止中间件process_exception()
方法的执行。
内置下载器中间件参考
本页面描述了 Scrapy 内置的所有下载器中间件组件。有关如何使用它们以及如何编写自己的下载器中间件的信息,请参阅下载器中间件使用指南。
有关默认启用(及其顺序)的组件列表,请参阅 DOWNLOADER_MIDDLEWARES_BASE
设置。
DefaultHeadersMiddleware
- class scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware[source]
此中间件设置
DEFAULT_REQUEST_HEADERS
设置中指定的所有默认请求头。
DownloadTimeoutMiddleware
- class scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware[source]
此中间件设置
DOWNLOAD_TIMEOUT
设置或download_timeout
爬虫属性中指定的请求下载超时。
注意
您还可以使用 download_timeout
Request.meta 键按请求设置下载超时;即使禁用 DownloadTimeoutMiddleware,这也受支持。
HttpAuthMiddleware
- class scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware[source]
此中间件使用基本访问认证(即 HTTP 认证)对某些爬虫生成的请求进行认证。
要为爬虫启用 HTTP 认证,请将
http_user
和http_pass
爬虫属性设置为认证数据,并将http_auth_domain
爬虫属性设置为需要此认证的域名(其子域名也将以相同方式处理)。您可以将http_auth_domain
设置为None
以启用所有请求的认证,但这可能会将您的认证凭据泄露给不相关的域名。警告
在以前的 Scrapy 版本中,HttpAuthMiddleware 会随所有请求一起发送认证数据,如果爬虫向多个不同域名发出请求,这会带来安全问题。目前,如果未设置
http_auth_domain
属性,中间件将使用第一个请求的域名,这适用于某些爬虫但不适用于其他爬虫。将来,中间件将产生错误而不是继续处理。示例
from scrapy.spiders import CrawlSpider class SomeIntranetSiteSpider(CrawlSpider): http_user = "someuser" http_pass = "somepass" http_auth_domain = "intranet.example.com" name = "intranet.example.com" # .. rest of the spider code omitted ...
HttpCacheMiddleware
- class scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware[source]
此中间件为所有 HTTP 请求和响应提供低级缓存。它必须与缓存存储后端和缓存策略结合使用。
Scrapy 内置了以下 HTTP 缓存存储后端
您可以使用
HTTPCACHE_STORAGE
设置更改 HTTP 缓存存储后端。或者您也可以实现自己的存储后端。Scrapy 内置了两种 HTTP 缓存策略
您可以使用
HTTPCACHE_POLICY
设置更改 HTTP 缓存策略。或者您也可以实现自己的策略。您还可以通过将
dont_cache
元数据键设置为True
来阻止对任何策略的响应进行缓存。
Dummy policy(默认策略)
RFC2616 策略
- class scrapy.extensions.httpcache.RFC2616Policy[source]
此策略提供符合 RFC2616 标准的 HTTP 缓存,即感知 HTTP Cache-Control 指令,旨在用于生产环境和持续运行中,避免下载未修改的数据(以节省带宽并加快爬取速度)。
已实现的功能
不尝试存储设置了
no-store
cache-control 指令的响应/请求即使对于新鲜的响应,如果设置了
no-cache
cache-control 指令,也不从缓存中提供响应根据
max-age
cache-control 指令计算新鲜度生命周期根据
Expires
响应头计算新鲜度生命周期根据
Last-Modified
响应头计算新鲜度生命周期(Firefox 使用的启发式方法)根据
Age
响应头计算当前年龄根据
Date
头计算当前年龄根据
Last-Modified
响应头重新验证过时响应根据
ETag
响应头重新验证过时响应为任何缺少
Date
头的接收到的响应设置Date
头支持请求中的
max-stale
cache-control 指令
这使得爬虫可以配置完整的 RFC2616 缓存策略,同时按请求避免重新验证,并保持与 HTTP 规范的一致性。
示例
向 Request 头添加
Cache-Control: max-stale=600
以接受过期时间不超过 600 秒的响应。另请参阅:RFC2616, 14.9.3
缺失的功能
Pragma: no-cache
支持 https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1Vary
头支持 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[source]
文件系统存储后端可用于 HTTP 缓存中间件。
每个请求/响应对存储在不同的目录中,包含以下文件
request_body
- 原始请求体request_headers
- 请求头(原始 HTTP 格式)response_body
- 原始响应体response_headers
- 请求头(原始 HTTP 格式)meta
- 此缓存资源的一些元数据,采用 Pythonrepr()
格式(grep 友好格式)pickled_meta
- 与meta
中相同的元数据,但经过 pickle 处理以实现更高效的反序列化
目录名称由请求的指纹(参见
scrapy.utils.request.fingerprint
)生成,并使用一级子目录来避免在同一目录中创建过多文件(这在许多文件系统中效率低下)。示例目录可能如下/path/to/cache/dir/example.com/72/72811f648e718090f041317756c03adb0ada46c7
DBM 存储后端
- class scrapy.extensions.httpcache.DbmCacheStorage[source]
HTTP 缓存中间件也提供了 DBM 存储后端。
默认情况下,它使用
dbm
,但您可以使用HTTPCACHE_DBM_MODULE
设置更改它。
编写您自己的存储后端
您可以通过创建一个定义以下方法的 Python 类来实现缓存存储后端。
- class scrapy.extensions.httpcache.CacheStorage
- open_spider(spider)
此方法在 spider 已打开以进行抓取后调用。它处理
open_spider
信号。- 参数:
spider (
Spider
对象) – 已打开的 spider
- close_spider(spider)
此方法在 spider 已关闭后调用。它处理
close_spider
信号。- 参数:
spider (
Spider
对象) – 已关闭的 spider
- retrieve_response(spider, request)
如果缓存中存在响应,则返回响应,否则返回
None
。
为了使用您自己的存储后端,请将
HTTPCACHE_STORAGE
设置为您自定义存储类的 Python 导入路径。
HTTPCache 中间件设置
HttpCacheMiddleware
可以通过以下设置进行配置
HTTPCACHE_ENABLED
默认值:False
是否启用 HTTP 缓存。
HTTPCACHE_EXPIRATION_SECS
默认值:0
缓存请求的过期时间,单位为秒。
早于此时间的缓存请求将被重新下载。如果为零,缓存请求将永远不会过期。
HTTPCACHE_DIR
默认值:'httpcache'
用于存储(低级别)HTTP 缓存的目录。如果为空,HTTP 缓存将被禁用。如果给定相对路径,则相对于项目数据目录。更多信息请参见:Scrapy 项目的默认结构。
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 存储后端 中使用的数据库模块。此设置为 DBM 后端特有。
HTTPCACHE_POLICY
默认值:'scrapy.extensions.httpcache.DummyPolicy'
实现缓存策略的类。
HTTPCACHE_GZIP
默认值:False
如果启用,将使用 gzip 压缩所有缓存数据。此设置为 Filesystem 后端特有。
HTTPCACHE_ALWAYS_STORE
默认值:False
如果启用,将无条件缓存页面。
spider 可能希望将所有响应都存储在缓存中,以便将来配合 Cache-Control: max-stale
使用。DummyPolicy 缓存所有响应但从不重新验证它们,有时需要更细致的策略。
此设置仍然遵循响应中的 Cache-Control: no-store
指令。如果您不希望这样,请过滤掉您提供给缓存中间件的响应中的 no-store
Cache-Control 头部。
HTTPCACHE_IGNORE_RESPONSE_CACHE_CONTROLS
默认值:[]
要忽略的响应中 Cache-Control 指令列表。
网站通常设置“no-store”、“no-cache”、“must-revalidate”等,但如果 spider 实际遵守这些指令,就会因为流量而感到困扰。这允许有选择地忽略那些对于被抓取的网站而言已知不重要的 Cache-Control 指令。
我们假设 spider 在请求中发出的 Cache-Control 指令是它确实需要的,因此不会过滤请求中的指令。
HttpCompressionMiddleware
- class scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware[source]
此中间件允许发送/接收来自网站的压缩(gzip、deflate)流量。
此中间件还支持解码 brotli 压缩以及 zstd 压缩的响应,前提是分别安装了 brotli 或 zstandard。
HttpCompressionMiddleware 设置
COMPRESSION_ENABLED
默认值:True
是否启用压缩中间件。
HttpProxyMiddleware
- class scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware[source]
此中间件通过为
Request
对象设置proxy
meta 值来为请求设置 HTTP 代理。与 Python 标准库模块
urllib.request
一样,它遵循以下环境变量:http_proxy
https_proxy
no_proxy
您还可以为每个请求设置
proxy
meta 键,值为http://some_proxy_server:port
或http://username:password@some_proxy_server:port
。请注意,此值优先于http_proxy
/https_proxy
环境变量,并且会忽略no_proxy
环境变量。
HttpProxyMiddleware 设置
HTTPPROXY_ENABLED
默认值:True
是否启用 HttpProxyMiddleware
。
HTTPPROXY_AUTH_ENCODING
默认值:"latin-1"
HttpProxyMiddleware
中代理身份验证的默认编码。
OffsiteMiddleware
- class scrapy.downloadermiddlewares.offsite.OffsiteMiddleware[source]
版本 2.11.2 中新增。
过滤掉 URL 不在 spider 所覆盖域范围内的请求。
此中间件过滤掉所有主机名不在 spider 的
allowed_domains
属性中的请求。列表中任何域的所有子域也都允许。例如,规则www.example.org
也允许bob.www.example.org
,但不允许www2.example.com
或example.com
。当您的 spider 返回一个不属于 spider 覆盖域的请求时,此中间件将记录类似如下的调试消息:
DEBUG: Filtered offsite request to 'offsite.example': <GET http://offsite.example/some/page.html>
为避免日志中出现过多噪音,它只会为每个新过滤的域打印一条这样的消息。因此,例如,如果过滤掉另一个指向
offsite.example
的请求,将不会打印日志消息。但如果过滤掉指向other.example
的请求,则会打印一条消息(但仅针对第一个过滤的请求)。如果 spider 未定义
allowed_domains
属性,或该属性为空,则 Offsite 中间件将允许所有请求。如果请求的
dont_filter
属性设置为True
,或者Request.meta
中的allow_offsite
设置为True
,则 OffsiteMiddleware 将允许该请求,即使其域未列在允许的域中。
RedirectMiddleware
请求(在重定向过程中)经过的 URL 可以在 Request.meta
的 redirect_urls
键中找到。
redirect_urls
中每次重定向的原因可以在 Request.meta
的 redirect_reasons
键中找到。例如:[301, 302, 307, 'meta refresh']
。
原因的格式取决于处理相应重定向的中间件。例如,RedirectMiddleware
将触发的响应状态码表示为整数,而 MetaRefreshMiddleware
总是使用字符串 'meta refresh'
作为原因。
RedirectMiddleware
可以通过以下设置进行配置(更多信息请参见设置文档):
如果 Request.meta
中的 dont_redirect
键设置为 True,则此中间件将忽略该请求。
如果您希望在 spider 中处理某些重定向状态码,可以在 handle_httpstatus_list
spider 属性中指定这些状态码。
例如,如果您希望重定向中间件忽略 301 和 302 响应(并将它们传递给您的 spider),您可以这样做:
class MySpider(CrawlSpider):
handle_httpstatus_list = [301, 302]
Request.meta
中的 handle_httpstatus_list
键也可用于按请求指定允许的响应码。您还可以将 meta 键 handle_httpstatus_all
设置为 True
,以便允许任何请求的任何响应码。
RedirectMiddleware 设置
REDIRECT_ENABLED
默认值:True
是否启用重定向中间件。
REDIRECT_MAX_TIMES
默认值:20
单个请求将遵循的最大重定向次数。如果超过最大重定向次数,则请求被中止并忽略。
MetaRefreshMiddleware
- class scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware[source]
此中间件根据 meta-refresh html 标签处理请求的重定向。
MetaRefreshMiddleware
可以通过以下设置进行配置(更多信息请参见设置文档):
此中间件遵循 REDIRECT_MAX_TIMES
设置、dont_redirect
、redirect_urls
和 redirect_reasons
请求 meta 键,如 RedirectMiddleware
中所述
MetaRefreshMiddleware 设置
METAREFRESH_ENABLED
默认值:True
是否启用 Meta Refresh 中间件。
METAREFRESH_MAXDELAY
默认值:100
遵循重定向的最大 meta-refresh 延迟(单位为秒)。一些网站使用 meta-refresh 重定向到会话过期页面,因此我们将自动重定向限制在最大延迟之内。
RetryMiddleware
- class scrapy.downloadermiddlewares.retry.RetryMiddleware[source]
一个用于重试因连接超时或 HTTP 500 错误等临时问题导致的失败请求的中间件。
失败的页面在抓取过程中收集起来,并在 spider 完成所有常规(非失败)页面的抓取后重新调度。
RetryMiddleware
可以通过以下设置进行配置(更多信息请参见设置文档):
如果 Request.meta
中的 dont_retry
键设置为 True,则此中间件将忽略该请求。
要从 spider 回调中重试请求,可以使用 get_retry_request()
函数
- scrapy.downloadermiddlewares.retry.get_retry_request(request: Request, *, spider: Spider, reason: str | Exception | type[Exception] = 'unspecified', max_retry_times: int | None = None, priority_adjust: int | None = None, logger: Logger = <Logger scrapy.downloadermiddlewares.retry (WARNING)>, stats_base_key: str = 'retry') Request | None [source]
返回一个新的
Request
对象以重试指定的请求,如果指定请求的重试次数已用尽,则返回None
。例如,在
Spider
回调中,您可以按如下方式使用它:def parse(self, response): if not response.text: new_request_or_none = get_retry_request( response.request, spider=self, reason='empty', ) return new_request_or_none
spider 是请求重试请求的
Spider
实例。它用于访问 设置 和 统计信息,并提供额外的日志记录上下文(参见logging.debug()
)。reason 是一个字符串或
Exception
对象,表示请求需要重试的原因。它用于命名重试统计信息。max_retry_times 是一个数字,确定 request 可以重试的最大次数。如果未指定或为
None
,则从请求的max_retry_times
meta 键中读取该数字。如果max_retry_times
meta 键未定义或为None
,则从RETRY_TIMES
设置中读取该数字。priority_adjust 是一个数字,确定新请求优先级相对于 request 的变化。如果未指定,则从
RETRY_PRIORITY_ADJUST
设置中读取该数字。logger 是用于记录消息的 logging.Logger 对象
stats_base_key 是一个字符串,用作与重试相关的 job 统计信息的基键
RetryMiddleware 设置
RETRY_ENABLED
默认值:True
是否启用重试中间件。
RETRY_TIMES
默认值:2
最大重试次数,不包括第一次下载。
最大重试次数也可以通过 Request.meta
的 max_retry_times
属性按请求指定。初始化时,max_retry_times
meta 键优先于 RETRY_TIMES
设置。
RETRY_HTTP_CODES
默认值:[500, 502, 503, 504, 522, 524, 408, 429]
需要重试的 HTTP 响应码。其他错误(DNS 查找问题、连接丢失等)总是会重试。
在某些情况下,您可能希望将 400 添加到 RETRY_HTTP_CODES
,因为它是一个常用的代码,用于表示服务器过载。默认情况下不包含它,因为 HTTP 规范是这样规定的。
RETRY_EXCEPTIONS
默认值
[
'twisted.internet.defer.TimeoutError',
'twisted.internet.error.TimeoutError',
'twisted.internet.error.DNSLookupError',
'twisted.internet.error.ConnectionRefusedError',
'twisted.internet.error.ConnectionDone',
'twisted.internet.error.ConnectError',
'twisted.internet.error.ConnectionLost',
'twisted.internet.error.TCPTimedOutError',
'twisted.web.client.ResponseFailed',
IOError,
'scrapy.core.downloader.handlers.http11.TunnelError',
]
要重试的异常列表。
列表中的每个条目可以是异常类型或其导入路径字符串。
当异常类型不在 RETRY_EXCEPTIONS
中,或者当请求的最大重试次数已超过时(参见 RETRY_TIMES
),异常将不会被捕获。要了解未捕获异常的传播,请参见 process_exception()
。
RETRY_PRIORITY_ADJUST
默认值:-1
调整重试请求的优先级相对于原始请求
正优先级调整意味着优先级更高。
负数优先级调整(默认)意味着较低优先级。
RobotsTxtMiddleware
- class scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware[来源]
此中间件会过滤掉 robots.txt 排除标准禁止的请求。
为确保 Scrapy 遵守 robots.txt,请确保此中间件已启用且
ROBOTSTXT_OBEY
设置已启用。ROBOTSTXT_USER_AGENT
设置可用于指定在 robots.txt 文件中进行匹配时使用的用户代理字符串。如果该值为None
,则将按顺序使用您随请求发送的 User-Agent 头部或USER_AGENT
设置来确定在 robots.txt 文件中使用的用户代理。此中间件必须与 robots.txt 解析器结合使用。
Scrapy 内置支持以下 robots.txt 解析器
您可以使用
ROBOTSTXT_PARSER
设置更改 robots.txt 解析器。或者您也可以实现对新解析器的支持。
如果 Request.meta
的 dont_obey_robotstxt
键设置为 True,则即使 ROBOTSTXT_OBEY
已启用,此中间件也会忽略该请求。
解析器在以下几个方面有所不同
实现语言
支持的规范
支持通配符匹配
长度规则的使用:特别是对于
Allow
和Disallow
指令,其中基于路径长度的最具体规则优先于不太具体(较短)的规则
不同解析器的性能比较可在此链接 查看。
Protego 解析器
基于 Protego
用 Python 实现
支持通配符匹配
使用长度规则
Scrapy 默认使用此解析器。
RobotFileParser
是 Python 内置的 robots.txt 解析器
缺乏对通配符匹配的支持
不使用长度规则
它比 Protego 快,并且向后兼容 1.8.0 版本之前的 Scrapy。
为了使用此解析器,请设置
ROBOTSTXT_PARSER
为scrapy.robotstxt.PythonRobotParser
Robotexclusionrulesparser
用 Python 实现
支持通配符匹配
不使用长度规则
为了使用此解析器
通过运行
pip install robotexclusionrulesparser
安装Robotexclusionrulesparser
将
ROBOTSTXT_PARSER
设置为scrapy.robotstxt.RerpRobotParser
实现对新解析器的支持
您可以通过继承抽象基类 RobotParser
并实现下述方法来为新的 robots.txt 解析器实现支持。
- class scrapy.robotstxt.RobotParser[来源]
- abstract allowed(url: str | bytes, user_agent: str | bytes) bool [来源]
如果
user_agent
允许抓取url
,则返回True
,否则返回False
。
- abstract classmethod from_crawler(crawler: Crawler, robotstxt_body: bytes) Self [来源]
将 robots.txt 文件内容解析为字节。这必须是一个类方法。它必须返回一个新的解析器后端实例。
- 参数:
crawler (
Crawler
实例) – 发出请求的爬虫robotstxt_body (bytes) – robots.txt 文件的内容。
DownloaderStats
- class scrapy.downloadermiddlewares.stats.DownloaderStats[来源]
此中间件存储所有通过它的请求、响应和异常的统计信息。
要使用此中间件,必须启用
DOWNLOADER_STATS
设置。