设置
Scrapy 设置允许您自定义所有 Scrapy 组件的行为,包括核心、扩展、pipeline 以及 Spider 本身。
设置的基础设施提供了一个全局的键值映射命名空间,代码可以使用它来获取配置值。设置可以通过不同的机制来填充,这些机制将在下面介绍。
设置也是选择当前活动的 Scrapy 项目(如果您有多个项目)的机制。
有关可用内置设置的列表,请参阅:内置设置参考。
指定设置
使用 Scrapy 时,您必须告诉它您正在使用哪些设置。您可以通过使用环境变量 SCRAPY_SETTINGS_MODULE
来实现这一点。
SCRAPY_SETTINGS_MODULE
的值应采用 Python 路径语法,例如 myproject.settings
。请注意,设置模块应位于 Python 的 导入搜索路径 中。
填充设置
设置可以使用不同的机制来填充,每种机制具有不同的优先级
1. 命令行设置
命令行中设置的设置具有最高优先级,会覆盖任何其他设置。
您可以使用 -s
(或 --set
)命令行选项显式覆盖一个或多个设置。
示例
scrapy crawl myspider -s LOG_LEVEL=INFO -s LOG_FILE=scrapy.log
2. Spider 设置
Spiders 可以定义自己的设置,这些设置将具有更高的优先级并覆盖项目设置。
注意
爬虫前设置 不能按 spider 定义,并且 reactor 设置 在 在同一进程中运行多个 spider 时,不应按 spider 设置不同的值。
实现这一点的一种方法是设置它们的 custom_settings
属性
import scrapy
class MySpider(scrapy.Spider):
name = "myspider"
custom_settings = {
"SOME_SETTING": "some value",
}
通常最好实现 update_settings()
方法,并且在那里设置的设置应明确使用 "spider"
优先级
import scrapy
class MySpider(scrapy.Spider):
name = "myspider"
@classmethod
def update_settings(cls, settings):
super().update_settings(settings)
settings.set("SOME_SETTING", "some value", priority="spider")
版本 2.11 新增。
也可以在 from_crawler()
方法中修改设置,例如根据 spider 参数 或其他逻辑
import scrapy
class MySpider(scrapy.Spider):
name = "myspider"
@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
spider = super().from_crawler(crawler, *args, **kwargs)
if "some_argument" in kwargs:
spider.settings.set(
"SOME_SETTING", kwargs["some_argument"], priority="spider"
)
return spider
3. 项目设置
Scrapy 项目包含一个设置模块,通常是一个名为 settings.py
的文件,您应该在该文件中填充适用于所有 spider 的大多数设置。
另请参阅
4. Add-on 设置
Add-ons 可以修改设置。如果可能,它们应使用 "addon"
优先级来完成此操作。
5. 命令特定的默认设置
每个 Scrapy 命令 都可以有自己的默认设置,这些设置会覆盖 全局默认设置。
这些命令特定的默认设置在每个命令类的 default_settings
属性中指定。
6. 全局默认设置
scrapy.settings.default_settings
模块定义了一些 内置设置 的全局默认值。
注意
startproject
会生成一个 settings.py
文件,该文件将一些设置设置为不同的值。
设置的参考文档会指示默认值(如果存在)。如果 startproject
设置了一个值,则该值被记录为默认值,而来自 scrapy.settings.default_settings
的值被记录为“备用值”(fallback)。
与 pickle 的兼容性
设置值必须是 可 pickle 化 的。
导入路径和类
版本 2.4.0 新增。
当设置引用 Scrapy 需要导入的可调用对象(例如类或函数)时,您可以通过两种不同的方式指定该对象
作为包含该对象导入路径的字符串
作为对象本身
例如
from mybot.pipelines.validate import ValidateMyItem
ITEM_PIPELINES = {
# passing the classname...
ValidateMyItem: 300,
# ...equals passing the class path
"mybot.pipelines.validate.ValidateMyItem": 300,
}
注意
不支持传递不可调用对象。
如何访问设置
在 spider 中,可以通过 self.settings
访问设置
class MySpider(scrapy.Spider):
name = "myspider"
start_urls = ["http://example.com"]
def parse(self, response):
print(f"Existing settings: {self.settings.attributes.keys()}")
注意
settings
属性在 spider 初始化后在基础 Spider 类中设置。如果您想在初始化之前使用设置(例如,在 spider 的 __init__()
方法中),您需要覆盖 from_crawler()
方法。
settings
对象可以像 dict
一样使用(例如 settings["LOG_ENABLED"]
)。但是,为了支持非字符串设置值(可能从命令行作为字符串传递),建议使用 Settings
API 提供的方法之一。
组件优先级字典
一个 组件优先级字典 是一个 dict
,其中键是 组件,值是组件优先级。例如
{
"path.to.ComponentA": None,
ComponentB: 100,
}
组件可以指定为类对象或通过导入路径指定。
优先级为 1 的组件会比优先级为 2 的组件 更早 执行。然而,更早执行的具体含义取决于对应的设置。例如,在 DOWNLOADER_MIDDLEWARES
设置中,组件的 process_request()
方法会在后续组件的方法之前执行,但其 process_response()
方法会在后续组件的方法之后执行。
优先级为 None
的组件会被禁用。
一些组件优先级字典会与一些内置值合并。例如,DOWNLOADER_MIDDLEWARES
会与 DOWNLOADER_MIDDLEWARES_BASE
合并。这就是 None
的便利之处,它允许您在常规设置中禁用基本设置中的组件
DOWNLOADER_MIDDLEWARES = {
"scrapy.downloadermiddlewares.offsite.OffsiteMiddleware": None,
}
特殊设置
以下设置与其他所有设置的工作方式略有不同。
爬虫前设置
爬虫前设置 是在创建 Crawler
对象之前使用的设置。
这些设置不能 从 spider 中设置。
这些设置包括 SPIDER_LOADER_CLASS
以及相应 组件 使用的设置,例如默认组件的 SPIDER_MODULES
和 SPIDER_LOADER_WARN_ONLY
。
Reactor 设置
Reactor 设置 是与 Twisted reactor 相关联的设置。
这些设置可以从 spider 中定义。但是,由于每个进程只能使用 1 个 reactor,因此在 在同一进程中运行多个 spider 时,这些设置不能按 spider 使用不同的值。
一般来说,如果不同的 spider 定义了不同的值,则使用第一个定义的值。但是,如果两个 spider 请求不同的 reactor,则会引发异常。
这些设置包括
DNS_RESOLVER
以及相应组件使用的设置,例如默认组件的DNSCACHE_ENABLED
、DNSCACHE_SIZE
和DNS_TIMEOUT
。
ASYNCIO_EVENT_LOOP
和 TWISTED_REACTOR
在安装 reactor 时使用。其余设置在启动 reactor 时应用。
内置设置参考
以下是所有可用 Scrapy 设置的列表,按字母顺序排列,以及它们的默认值和适用范围。
适用范围(如果可用)显示了该设置的使用位置,如果它与任何特定组件相关联。在这种情况下,将显示该组件的模块,通常是扩展、中间件或 pipeline。这也意味着必须启用该组件,设置才能生效。
ADDONS
默认值: {}
一个字典,包含项目中启用的 add-ons 的路径及其优先级。有关更多信息,请参阅 Add-ons。
AWS_ACCESS_KEY_ID
默认值: None
需要访问 Amazon Web Services 的代码(例如 S3 feed 存储后端)使用的 AWS 访问密钥。
AWS_SECRET_ACCESS_KEY
默认值: None
需要访问 Amazon Web Services 的代码(例如 S3 feed 存储后端)使用的 AWS 秘密密钥。
AWS_SESSION_TOKEN
默认值: None
需要访问 Amazon Web Services 的代码(例如 S3 feed 存储后端)在使用 临时安全凭证 时使用的 AWS 安全令牌。
AWS_ENDPOINT_URL
默认值: None
用于 S3 兼容存储(例如 Minio 或 s3.scality)的端点 URL。
AWS_USE_SSL
默认值: None
如果您想禁用与 S3 或 S3 兼容存储通信时的 SSL 连接,请使用此选项。默认情况下会使用 SSL。
AWS_VERIFY
默认值: None
验证 Scrapy 与 S3 或 S3 兼容存储之间的 SSL 连接。默认情况下会进行 SSL 验证。
AWS_REGION_NAME
默认值: None
与 AWS 客户端关联的区域名称。
ASYNCIO_EVENT_LOOP
默认值: None
给定 asyncio
事件循环类的导入路径。
如果启用了 asyncio reactor(参见 TWISTED_REACTOR
),则可以使用此设置指定要与之一起使用的 asyncio 事件循环。将此设置设置为所需 asyncio 事件循环类的导入路径。如果将此设置设置为 None
,则将使用默认的 asyncio 事件循环。
如果您使用 install_reactor()
函数手动安装 asyncio reactor,则可以使用 event_loop_path
参数指示要使用的事件循环类的导入路径。
请注意,事件循环类必须继承自 asyncio.AbstractEventLoop
。
Caution
请注意,当使用非默认事件循环时(通过 ASYNCIO_EVENT_LOOP
定义或使用 install_reactor()
安装),Scrapy 会调用 asyncio.set_event_loop()
,这将把指定的事件循环设置为当前 OS 线程的当前循环。
BOT_NAME
默认值: <项目名称>
(备用值: 'scrapybot'
)
此 Scrapy 项目实现的机器人的名称(也称为项目名称)。此名称也将用于日志记录。
使用 startproject
命令创建项目时,此名称会自动填充为您的项目名称。
CONCURRENT_ITEMS
默认值: 100
在 item pipelines 中并行处理的最大并发 item 数(每个响应)。
CONCURRENT_REQUESTS
默认值: 16
Scrapy 下载器将执行的最大并发(即同时)请求数。
CONCURRENT_REQUESTS_PER_DOMAIN
默认值: 8
将对任何单个域名执行的最大并发(即同时)请求数。
另请参阅: AutoThrottle 扩展 及其 AUTOTHROTTLE_TARGET_CONCURRENCY
选项。
CONCURRENT_REQUESTS_PER_IP
默认值: 0
将对任何单个 IP 执行的最大并发(即同时)请求数。如果非零,则忽略 CONCURRENT_REQUESTS_PER_DOMAIN
设置,并使用此设置。换句话说,并发限制将按 IP 应用,而不是按域名应用。
此设置也影响 DOWNLOAD_DELAY
和 AutoThrottle 扩展:如果 CONCURRENT_REQUESTS_PER_IP
非零,则下载延迟将按 IP 执行,而不是按域名执行。
DEFAULT_DROPITEM_LOG_LEVEL
默认值: "WARNING"
关于丢弃 item 的消息的默认 日志级别。
当 item pipeline 的 process_item()
方法通过引发 scrapy.exceptions.DropItem
来丢弃 item 时,会记录一条消息,默认情况下其日志级别为此设置中配置的级别。
您可以将此日志级别指定为整数(例如 20
)、日志级别常量(例如 logging.INFO
)或带有日志级别常量名称的字符串(例如 "INFO"
)。
编写 item pipeline 时,您可以通过在 scrapy.exceptions.DropItem
异常中设置 scrapy.exceptions.DropItem.log_level
来强制使用不同的日志级别。例如
from scrapy.exceptions import DropItem
class MyPipeline:
def process_item(self, item, spider):
if not item.get("price"):
raise DropItem("Missing price data", log_level="INFO")
return item
DEFAULT_ITEM_CLASS
默认值: 'scrapy.Item'
在Scrapy shell中实例化项目的默认类。
DEFAULT_REQUEST_HEADERS
默认值
{
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en",
}
Scrapy HTTP请求使用的默认头部。它们在DefaultHeadersMiddleware
中填充。
Caution
通过 Cookie
头部设置的cookie不会被CookiesMiddleware考虑。如果您需要为请求设置cookie,请使用Request.cookies
参数。这是一个已知且正在解决的当前限制。
DEPTH_LIMIT
默认值: 0
范围: scrapy.spidermiddlewares.depth.DepthMiddleware
允许对任何站点进行的最大爬取深度。如果为零,则不施加限制。
DEPTH_PRIORITY
默认值: 0
范围: scrapy.spidermiddlewares.depth.DepthMiddleware
一个整数,用于根据Request
的深度调整其priority
。
请求的优先级调整如下:
request.priority = request.priority - (depth * DEPTH_PRIORITY)
随着深度增加,DEPTH_PRIORITY
的正值会降低请求优先级 (BFO),而负值会提高请求优先级 (DFO)。另请参阅Scrapy是按广度优先还是深度优先顺序爬取?。
注意
与REDIRECT_PRIORITY_ADJUST
和RETRY_PRIORITY_ADJUST
等其他优先级设置相比,此设置的优先级调整方式**恰好相反**。
DEPTH_STATS_VERBOSE
默认值: False
范围: scrapy.spidermiddlewares.depth.DepthMiddleware
是否收集详细的深度统计信息。如果启用,将会在统计信息中收集每个深度的请求数量。
DNSCACHE_ENABLED
默认值: True
是否启用DNS内存缓存。
DNSCACHE_SIZE
默认值: 10000
DNS内存缓存大小。
DNS_RESOLVER
版本 2.0 中新增。
默认值: 'scrapy.resolver.CachingThreadedResolver'
用于解析DNS名称的类。默认的scrapy.resolver.CachingThreadedResolver
通过DNS_TIMEOUT
设置支持为DNS请求指定超时,但仅适用于IPv4地址。Scrapy提供了一个替代解析器scrapy.resolver.CachingHostnameResolver
,它支持IPv4/IPv6地址,但不考虑DNS_TIMEOUT
设置。
DNS_TIMEOUT
默认值: 60
处理DNS查询的超时时间(秒)。支持浮点数。
DOWNLOADER
默认值: 'scrapy.core.downloader.Downloader'
用于爬取的下载器。
DOWNLOADER_HTTPCLIENTFACTORY
默认值: 'scrapy.core.downloader.webclient.ScrapyHTTPClientFactory'
定义用于HTTP/1.0连接 (对于HTTP10DownloadHandler
) 的Twisted protocol.ClientFactory
类。
注意
HTTP/1.0现在很少使用,其Scrapy支持已弃用,因此您可以安全地忽略此设置,除非您确实想使用HTTP/1.0并相应地为http(s)
方案覆盖DOWNLOAD_HANDLERS
,即设置为'scrapy.core.downloader.handlers.http.HTTP10DownloadHandler'
。
DOWNLOADER_CLIENTCONTEXTFACTORY
默认值: 'scrapy.core.downloader.contextfactory.ScrapyClientContextFactory'
表示要使用的ContextFactory的类路径。
这里的“ContextFactory”是Twisted中用于SSL/TLS上下文的术语,定义了要使用的TLS/SSL协议版本、是否进行证书验证,甚至启用客户端认证(以及各种其他功能)。
注意
Scrapy默认的上下文工厂**不执行远程服务器证书验证**。这对于网页抓取通常是可以接受的。
如果您确实需要启用远程服务器证书验证,Scrapy还提供了另一个您可以设置的上下文工厂类:'scrapy.core.downloader.contextfactory.BrowserLikeContextFactory'
,它使用平台的证书来验证远程端点。
如果您使用了自定义的ContextFactory,请确保其 __init__
方法接受一个 method
参数 (这是 OpenSSL.SSL
方法映射 DOWNLOADER_CLIENT_TLS_METHOD
>),一个 tls_verbose_logging
参数 (bool
) 以及一个 tls_ciphers
参数 (参见 DOWNLOADER_CLIENT_TLS_CIPHERS
>)。
DOWNLOADER_CLIENT_TLS_CIPHERS
默认值: 'DEFAULT'
使用此设置自定义默认HTTP/1.1下载器使用的TLS/SSL密码套件。
此设置应包含符合OpenSSL密码列表格式的字符串,这些密码将被用作客户端密码套件。更改此设置可能对于访问某些HTTPS网站是必需的:例如,对于DH参数较弱的网站,您可能需要使用'DEFAULT:!DH'
,或者如果网站要求,则需要启用一个不包含在DEFAULT
中的特定密码套件。
DOWNLOADER_CLIENT_TLS_METHOD
默认值: 'TLS'
使用此设置自定义默认HTTP/1.1下载器使用的TLS/SSL方法。
此设置必须是以下字符串值之一:
'TLS'
: 映射到OpenSSL的TLS_method()
(也称为SSLv23_method()
),允许协议协商,从平台支持的最高版本开始;**默认,推荐**'TLSv1.0'
: 此值强制HTTPS连接使用TLS版本1.0;如果您想要 Scrapy<1.1 的行为,请设置此值'TLSv1.1'
: 强制使用TLS版本1.1'TLSv1.2'
: 强制使用TLS版本1.2
DOWNLOADER_CLIENT_TLS_VERBOSE_LOGGING
默认值: False
将此设置为True
将在建立HTTPS连接后启用关于TLS连接参数的DEBUG级别消息日志。日志信息的类型取决于OpenSSL和pyOpenSSL的版本。
此设置仅用于默认的DOWNLOADER_CLIENTCONTEXTFACTORY
。
DOWNLOADER_MIDDLEWARES
默认值:: {}
一个字典,包含您的项目中启用的下载器中间件及其顺序。更多信息请参见激活下载器中间件。
DOWNLOADER_MIDDLEWARES_BASE
默认值
{
"scrapy.downloadermiddlewares.offsite.OffsiteMiddleware": 50,
"scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware": 100,
"scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware": 300,
"scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware": 350,
"scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware": 400,
"scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": 500,
"scrapy.downloadermiddlewares.retry.RetryMiddleware": 550,
"scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware": 560,
"scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware": 580,
"scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware": 590,
"scrapy.downloadermiddlewares.redirect.RedirectMiddleware": 600,
"scrapy.downloadermiddlewares.cookies.CookiesMiddleware": 700,
"scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": 750,
"scrapy.downloadermiddlewares.stats.DownloaderStats": 850,
"scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware": 900,
}
一个字典,包含Scrapy中默认启用的下载器中间件及其顺序。较低的顺序更接近引擎,较高的顺序更接近下载器。您绝不应在项目中修改此设置,请修改DOWNLOADER_MIDDLEWARES
代替。更多信息请参见激活下载器中间件。
DOWNLOADER_STATS
默认值: True
是否启用下载器统计信息收集。
DOWNLOAD_DELAY
默认值: 0
对同一域名进行连续两次请求之间等待的最小秒数。
使用DOWNLOAD_DELAY
来限制您的爬取速度,以避免对服务器造成过大压力。
支持小数。例如,每10秒最多发送4个请求:
DOWNLOAD_DELAY = 2.5
此设置也受RANDOMIZE_DOWNLOAD_DELAY
设置的影响,该设置默认启用。
当CONCURRENT_REQUESTS_PER_IP
非零时,延迟将按IP地址而不是按域名强制执行。
请注意,DOWNLOAD_DELAY
可以降低每个域名的有效并发度,使其低于CONCURRENT_REQUESTS_PER_DOMAIN
。如果域名的响应时间低于DOWNLOAD_DELAY
,则该域名的有效并发度为1。测试限速配置时,通常应该首先降低CONCURRENT_REQUESTS_PER_DOMAIN
,只有当CONCURRENT_REQUESTS_PER_DOMAIN
为1但希望施加更高的限制时,才增加DOWNLOAD_DELAY
。
注意
可以使用download_delay
蜘蛛属性为每个蜘蛛设置此延迟。
也可以按域名更改此设置,但这需要非平凡的代码。请参阅AutoThrottle扩展的实现以获取示例。
DOWNLOAD_HANDLERS
默认值: {}
一个字典,包含您的项目中启用的请求下载处理器。有关示例格式,请参见DOWNLOAD_HANDLERS_BASE
。
DOWNLOAD_HANDLERS_BASE
默认值
{
"data": "scrapy.core.downloader.handlers.datauri.DataURIDownloadHandler",
"file": "scrapy.core.downloader.handlers.file.FileDownloadHandler",
"http": "scrapy.core.downloader.handlers.http.HTTPDownloadHandler",
"https": "scrapy.core.downloader.handlers.http.HTTPDownloadHandler",
"s3": "scrapy.core.downloader.handlers.s3.S3DownloadHandler",
"ftp": "scrapy.core.downloader.handlers.ftp.FTPDownloadHandler",
}
一个字典,包含Scrapy中默认启用的请求下载处理器。您绝不应在项目中修改此设置,请修改DOWNLOAD_HANDLERS
代替。
您可以通过在DOWNLOAD_HANDLERS
中将其URI方案赋值为None
来禁用任何这些下载处理器。例如,要禁用内置的FTP处理器(不替换),请将其放入您的settings.py
中:
DOWNLOAD_HANDLERS = {
"ftp": None,
}
默认的HTTPS处理器使用HTTP/1.1。要使用HTTP/2:
安装
Twisted[http2]>=17.9.0
以安装在Twisted中启用HTTP/2支持所需的包。更新
DOWNLOAD_HANDLERS
如下:DOWNLOAD_HANDLERS = { "https": "scrapy.core.downloader.handlers.http2.H2DownloadHandler", }
警告
Scrapy中的HTTP/2支持是实验性的,尚不推荐用于生产环境。未来的Scrapy版本可能会引入相关更改,恕不另行通知或弃用。
DOWNLOAD_SLOTS
默认值: {}
允许为每个槽 (域名) 定义并发/延迟参数
DOWNLOAD_SLOTS = { "quotes.toscrape.com": {"concurrency": 1, "delay": 2, "randomize_delay": False}, "books.toscrape.com": {"delay": 3, "randomize_delay": False}, }
注意
对于其他下载器槽,将使用默认设置值:
DOWNLOAD_DELAY
:delay
CONCURRENT_REQUESTS_PER_DOMAIN
:concurrency
RANDOMIZE_DOWNLOAD_DELAY
:randomize_delay
DOWNLOAD_TIMEOUT
默认值: 180
下载器在超时前等待的时间(秒)。
注意
可以使用download_timeout
蜘蛛属性为每个蜘蛛设置此超时,并使用download_timeout
Request.meta 键为每个请求设置。
DOWNLOAD_MAXSIZE
默认值: 1073741824
(1 GiB)
允许的最大响应体大小(字节)。大于此值的响应将被中止并忽略。
这适用于压缩前和压缩后。如果解压响应体超出此限制,解压将被中止,响应将被忽略。
使用0
来禁用此限制。
此限制可以使用download_maxsize
蜘蛛属性为每个蜘蛛设置,并使用download_maxsize
Request.meta 键为每个请求设置。
DOWNLOAD_WARNSIZE
默认值: 33554432
(32 MiB)
如果响应的大小在压缩前或压缩后超过此值,将记录一条警告。
使用0
来禁用此限制。
此限制可以使用download_warnsize
蜘蛛属性为每个蜘蛛设置,并使用download_warnsize
Request.meta 键为每个请求设置。
DOWNLOAD_FAIL_ON_DATALOSS
默认值: True
是否在响应损坏时失败,即声明的 Content-Length
与服务器发送的内容不匹配,或者分块响应未正确结束。如果设置为 True
,这些响应将引发 ResponseFailed([_DataLoss])
错误。如果设置为 False
,这些响应将被传递,并且会将 dataloss
标志添加到响应中,例如:'dataloss' in response.flags
为 True
。
此设置也可以通过使用download_fail_on_dataloss
Request.meta 键并设置为 False
来按请求设置。
注意
响应损坏或数据丢失错误可能发生在多种情况下,从服务器配置错误到网络错误再到数据损坏。用户需要决定处理损坏的响应是否有意义,因为它们可能包含部分或不完整的内容。如果RETRY_ENABLED
为True
且此设置也为True
,则ResponseFailed([_DataLoss])
失败将像往常一样重试。
警告
此设置被H2DownloadHandler
下载处理器忽略(参见DOWNLOAD_HANDLERS
)。如果发生数据丢失错误,相应的HTTP/2连接可能会损坏,影响使用同一连接的其他请求;因此,对于使用该连接的每个请求,始终会引发ResponseFailed([InvalidBodyLengthError])
失败。
DUPEFILTER_CLASS
默认值: 'scrapy.dupefilters.RFPDupeFilter'
用于检测和过滤重复请求的类。
默认的RFPDupeFilter
根据REQUEST_FINGERPRINTER_CLASS
设置进行过滤。
要更改如何检查重复项,您可以将DUPEFILTER_CLASS
指向RFPDupeFilter
的自定义子类,该子类覆盖其__init__
方法以使用不同的请求指纹生成类。例如:
from scrapy.dupefilters import RFPDupeFilter
from scrapy.utils.request import fingerprint
class CustomRequestFingerprinter:
def fingerprint(self, request):
return fingerprint(request, include_headers=["X-ID"])
class CustomDupeFilter(RFPDupeFilter):
def __init__(self, path=None, debug=False, *, fingerprinter=None):
super().__init__(
path=path, debug=debug, fingerprinter=CustomRequestFingerprinter()
)
要禁用重复请求过滤,请将DUPEFILTER_CLASS
设置为'scrapy.dupefilters.BaseDupeFilter'
。请注意,不过滤重复请求可能会导致爬取循环。通常最好在不应过滤的特定Request
对象的__init__
方法中将dont_filter
参数设置为True
。
分配给DUPEFILTER_CLASS
的类必须实现以下接口:
class MyDupeFilter:
@classmethod
def from_settings(cls, settings):
"""Returns an instance of this duplicate request filtering class
based on the current crawl settings."""
return cls()
def request_seen(self, request):
"""Returns ``True`` if *request* is a duplicate of another request
seen in a previous call to :meth:`request_seen`, or ``False``
otherwise."""
return False
def open(self):
"""Called before the spider opens. It may return a deferred."""
pass
def close(self, reason):
"""Called before the spider closes. It may return a deferred."""
pass
def log(self, request, spider):
"""Logs that a request has been filtered out.
It is called right after a call to :meth:`request_seen` that
returns ``True``.
If :meth:`request_seen` always returns ``False``, such as in the
case of :class:`~scrapy.dupefilters.BaseDupeFilter`, this method
may be omitted.
"""
pass
- class scrapy.dupefilters.BaseDupeFilter[源代码]
空的重复请求过滤类(
DUPEFILTER_CLASS
),不会过滤任何请求。
- class scrapy.dupefilters.RFPDupeFilter(path: str | None = None, debug: bool = False, *, fingerprinter: RequestFingerprinterProtocol | None = None)[源代码]
重复请求过滤类(
DUPEFILTER_CLASS
),根据规范化(w3lib.url.canonicalize_url()
)的url
、method
和body
来过滤请求。
DUPEFILTER_DEBUG
默认值: False
默认情况下,RFPDupeFilter
只记录第一个重复请求。将DUPEFILTER_DEBUG
设置为True
将使其记录所有重复请求。
EDITOR
默认值: vi
(在Unix系统上) 或 IDLE 编辑器 (在Windows上)
EXTENSIONS
默认值:: {}
EXTENSIONS_BASE
默认值
{
"scrapy.extensions.corestats.CoreStats": 0,
"scrapy.extensions.telnet.TelnetConsole": 0,
"scrapy.extensions.memusage.MemoryUsage": 0,
"scrapy.extensions.memdebug.MemoryDebugger": 0,
"scrapy.extensions.closespider.CloseSpider": 0,
"scrapy.extensions.feedexport.FeedExporter": 0,
"scrapy.extensions.logstats.LogStats": 0,
"scrapy.extensions.spiderstate.SpiderState": 0,
"scrapy.extensions.throttle.AutoThrottle": 0,
}
一个字典,包含Scrapy中默认可用的扩展及其顺序。此设置包含所有稳定的内置扩展。请记住,其中一些需要通过设置启用。
FEED_TEMPDIR
Feed Temp dir 允许您设置一个自定义文件夹来保存爬虫临时文件,以便在使用FTP feed存储和Amazon S3上传之前使用。
FEED_STORAGE_GCS_ACL
将项目存储到 Google Cloud Storage 时使用的访问控制列表 (ACL)。有关如何设置此值的更多信息,请参阅 Google Cloud 文档中名为 JSON API 的列。
FTP_PASSIVE_MODE
默认值: True
在发起 FTP 传输时是否使用被动模式。
FTP_PASSWORD
默认值: "guest"
当 Request
meta 中没有 "ftp_password"
时,用于 FTP 连接的密码。
注意
引用 RFC 1635,尽管匿名 FTP 通常使用密码 “guest” 或用户的电子邮件地址,但有些 FTP 服务器会明确要求用户的电子邮件地址,并且不允许使用 “guest” 密码登录。
FTP_USER
默认值: "anonymous"
当 Request
meta 中没有 "ftp_user"
时,用于 FTP 连接的用户名。
GCS_PROJECT_ID
默认值: None
在 Google Cloud Storage 上存储数据时将使用的项目 ID。
ITEM_PIPELINES
默认值: {}
一个字典,包含要使用的项目管道及其顺序。顺序值是任意的,但通常定义在 0-1000 范围内。较低的顺序比较高的顺序先处理。
示例
ITEM_PIPELINES = {
"mybot.pipelines.validate.ValidateMyItem": 300,
"mybot.pipelines.validate.StoreMyItem": 800,
}
ITEM_PIPELINES_BASE
默认值: {}
一个字典,包含 Scrapy 中默认启用的管道。您不应在项目中修改此设置,而应修改 ITEM_PIPELINES
。
JOBDIR
默认值: None
一个字符串,指示在 暂停和恢复爬取 时用于存储爬取状态的目录。
LOG_ENABLED
默认值: True
是否启用日志记录。
LOG_ENCODING
默认值: 'utf-8'
用于日志记录的编码。
LOG_FILE
默认值: None
用于日志输出的文件名。如果为 None
,则将使用标准错误输出。
LOG_FILE_APPEND
默认值: True
如果为 False
,则指定给 LOG_FILE
的日志文件将被覆盖(丢弃之前运行的输出,如果有的话)。
LOG_FORMAT
默认值: '%(asctime)s [%(name)s] %(levelname)s: %(message)s'
用于格式化日志消息的字符串。有关可用占位符的完整列表,请参阅 Python 日志记录文档。
LOG_DATEFORMAT
默认值: '%Y-%m-%d %H:%M:%S'
用于格式化日期/时间的字符串,是 LOG_FORMAT
中 %(asctime)s
占位符的扩展。有关可用指令的完整列表,请参阅 Python datetime 文档。
LOG_FORMATTER
默认值: scrapy.logformatter.LogFormatter
用于 格式化不同操作的日志消息 的类。
LOG_LEVEL
默认值: 'DEBUG'
要记录的最低级别。可用级别为: CRITICAL, ERROR, WARNING, INFO, DEBUG。更多信息请参阅 日志记录。
LOG_STDOUT
默认值: False
如果为 True
,则进程的所有标准输出(和错误)都将重定向到日志。例如,如果执行 print('hello')
,它将出现在 Scrapy 日志中。
LOG_SHORT_NAMES
默认值: False
如果为 True
,日志将只包含根路径。如果设置为 False
,则显示负责日志输出的组件。
LOG_VERSIONS
默认值: ["lxml", "libxml2", "cssselect", "parsel", "w3lib", "Twisted", "Python", "pyOpenSSL", "cryptography", "Platform"]
记录指定项目的已安装版本。
项目可以是任何已安装的 Python 包。
还支持以下特殊项目:
libxml2
Platform
(platform.platform()
)Python
LOGSTATS_INTERVAL
默认值: 60.0
LogStats
记录统计数据的间隔(以秒为单位)。
MEMDEBUG_ENABLED
默认值: False
是否启用内存调试。
MEMDEBUG_NOTIFY
默认值: []
当内存调试启用时,如果此设置不为空,则内存报告将发送到指定的地址,否则报告将写入日志。
示例
MEMDEBUG_NOTIFY = ['user@example.com']
MEMUSAGE_ENABLED
默认值: True
范围: scrapy.extensions.memusage
是否启用内存使用扩展。此扩展记录进程使用的峰值内存(并将其写入统计信息)。它还可以选择在超过内存限制时关闭 Scrapy 进程(参见 MEMUSAGE_LIMIT_MB
),并在发生时通过电子邮件通知(参见 MEMUSAGE_NOTIFY_MAIL
)。
参见 内存使用扩展。
MEMUSAGE_LIMIT_MB
默认值: 0
范围: scrapy.extensions.memusage
在关闭 Scrapy 之前允许的最大内存量(以兆字节为单位)(如果 MEMUSAGE_ENABLED 为 True)。如果为零,则不执行检查。
参见 内存使用扩展。
MEMUSAGE_CHECK_INTERVAL_SECONDS
默认值: 60.0
范围: scrapy.extensions.memusage
内存使用扩展 以固定的时间间隔检查当前内存使用情况,与 MEMUSAGE_LIMIT_MB
和 MEMUSAGE_WARNING_MB
设置的限制进行比较。
此设置这些间隔的长度,以秒为单位。
参见 内存使用扩展。
MEMUSAGE_NOTIFY_MAIL
默认值: False
范围: scrapy.extensions.memusage
达到内存限制时要通知的电子邮件列表。
示例
MEMUSAGE_NOTIFY_MAIL = ['user@example.com']
参见 内存使用扩展。
MEMUSAGE_WARNING_MB
默认值: 0
范围: scrapy.extensions.memusage
在发送警告电子邮件通知之前允许的最大内存量(以兆字节为单位)。如果为零,则不生成警告。
NEWSPIDER_MODULE
默认值: "<project name>.spiders"
(回退: ""
)
使用 genspider
命令创建新爬虫的模块。
示例
NEWSPIDER_MODULE = 'mybot.spiders_dev'
RANDOMIZE_DOWNLOAD_DELAY
默认值: True
如果启用,Scrapy 在从同一网站抓取请求时将等待随机时间(介于 0.5 * DOWNLOAD_DELAY
和 1.5 * DOWNLOAD_DELAY
之间)。
这种随机化降低了爬虫被分析请求并查找请求之间时间统计上显着相似性的网站检测到(并随后阻止)的可能性。
随机化策略与 wget 的 --random-wait
选项使用的策略相同。
如果 DOWNLOAD_DELAY
为零(默认值),则此选项无效。
REACTOR_THREADPOOL_MAXSIZE
默认值: 10
Twisted Reactor 线程池的最大大小限制。这是各种 Scrapy 组件使用的通用多用途线程池。例如,线程 DNS 解析器、BlockingFeedStorage、S3FilesStore。如果您在使用不足的阻塞 IO 时遇到问题,请增加此值。
REDIRECT_PRIORITY_ADJUST
默认值: +2
范围: scrapy.downloadermiddlewares.redirect.RedirectMiddleware
调整重定向请求相对于原始请求的优先级。
正的优先级调整(默认值)意味着更高的优先级。
负的优先级调整意味着更低的优先级。
ROBOTSTXT_OBEY
默认值: True
(回退: False
)
如果启用,Scrapy 将遵守 robots.txt 策略。更多信息请参阅 RobotsTxtMiddleware。
注意
尽管出于历史原因,默认值为 False
,但在通过 scrapy startproject
命令生成的 settings.py 文件中,此选项默认启用。
ROBOTSTXT_PARSER
默认值: 'scrapy.robotstxt.ProtegoRobotParser'
用于解析 robots.txt
文件的解析器后端。更多信息请参阅 RobotsTxtMiddleware。
ROBOTSTXT_USER_AGENT
默认值: None
用于在 robots.txt 文件中匹配的用户代理字符串。如果为 None
,则您在请求中发送的 User-Agent 头部或 USER_AGENT
设置(按此顺序)将用于确定在 robots.txt 文件中使用的用户代理。
SCHEDULER
默认值: 'scrapy.core.scheduler.Scheduler'
用于爬取的调度器类。详情请参阅 调度器 主题。
SCHEDULER_DEBUG
默认值: False
设置为 True
将记录关于请求调度器的调试信息。这目前仅记录(一次)请求无法序列化到磁盘的情况。统计计数器(scheduler/unserializable
)跟踪发生此情况的次数。
日志中的示例条目
1956-01-31 00:00:00+0800 [scrapy.core.scheduler] ERROR: Unable to serialize request:
<GET http://example.com> - reason: cannot serialize <Request at 0x9a7c7ec>
(type Request)> - no more unserializable requests will be logged
(see 'scheduler/unserializable' stats counter)
SCHEDULER_DISK_QUEUE
默认值: 'scrapy.squeues.PickleLifoDiskQueue'
调度器将使用的磁盘队列类型。其他可用类型包括 scrapy.squeues.PickleFifoDiskQueue
、scrapy.squeues.MarshalFifoDiskQueue
、scrapy.squeues.MarshalLifoDiskQueue
。
SCHEDULER_MEMORY_QUEUE
默认值: 'scrapy.squeues.LifoMemoryQueue'
调度器使用的内存队列类型。其他可用类型为: scrapy.squeues.FifoMemoryQueue
。
SCHEDULER_PRIORITY_QUEUE
默认值: 'scrapy.pqueues.ScrapyPriorityQueue'
调度器使用的优先级队列类型。另一个可用类型是 scrapy.pqueues.DownloaderAwarePriorityQueue
。scrapy.pqueues.DownloaderAwarePriorityQueue
在您并行爬取许多不同域名时比 scrapy.pqueues.ScrapyPriorityQueue
效果更好。但目前 scrapy.pqueues.DownloaderAwarePriorityQueue
不与 CONCURRENT_REQUESTS_PER_IP
一起工作。
SCHEDULER_START_DISK_QUEUE
默认值: 'scrapy.squeues.PickleFifoDiskQueue'
调度器 用于 start requests 的磁盘队列类型(参见 JOBDIR
)。
有关可用选项,请参见 SCHEDULER_DISK_QUEUE
。
使用 None
或 ""
完全禁用这些单独的队列,改为让 start requests 与其他请求共享相同的队列。
注意
禁用单独的 start request 队列会使 start request 顺序 不直观:start requests 只会按顺序发送,直到达到 CONCURRENT_REQUESTS
,然后剩余的 start requests 将按反向顺序发送。
SCHEDULER_START_MEMORY_QUEUE
默认值: 'scrapy.squeues.FifoMemoryQueue'
调度器 用于 start requests 的内存队列类型。
有关可用选项,请参见 SCHEDULER_MEMORY_QUEUE
。
使用 None
或 ""
完全禁用这些单独的队列,改为让 start requests 与其他请求共享相同的队列。
注意
禁用单独的 start request 队列会使 start request 顺序 不直观:start requests 只会按顺序发送,直到达到 CONCURRENT_REQUESTS
,然后剩余的 start requests 将按反向顺序发送。
SCRAPER_SLOT_MAX_ACTIVE_SIZE
版本 2.0 中新增。
默认值: 5_000_000
正在处理的响应数据的软限制(以字节为单位)。
当所有正在处理的响应大小总和超过此值时,Scrapy 不处理新的请求。
SPIDER_CONTRACTS
默认值:: {}
一个字典,包含项目中启用的爬虫契约,用于测试爬虫。更多信息请参阅 爬虫契约。
SPIDER_CONTRACTS_BASE
默认值
{
"scrapy.contracts.default.UrlContract": 1,
"scrapy.contracts.default.ReturnsContract": 2,
"scrapy.contracts.default.ScrapesContract": 3,
}
一个字典,包含 Scrapy 中默认启用的爬虫契约。您不应在项目中修改此设置,而应修改 SPIDER_CONTRACTS
。更多信息请参阅 爬虫契约。
您可以通过在 SPIDER_CONTRACTS
中将其类路径设置为 None
来禁用这些契约中的任何一个。例如,要禁用内置的 ScrapesContract
,请将其放入您的 settings.py
中:
SPIDER_CONTRACTS = {
"scrapy.contracts.default.ScrapesContract": None,
}
SPIDER_LOADER_CLASS
默认值: 'scrapy.spiderloader.SpiderLoader'
用于加载爬虫的类,该类必须实现 SpiderLoader API。
SPIDER_LOADER_WARN_ONLY
默认值: False
默认情况下,当 Scrapy 尝试从 SPIDER_MODULES
导入爬虫类时,如果发生任何 ImportError
或 SyntaxError
异常,它将大声失败。但您可以通过设置 SPIDER_LOADER_WARN_ONLY = True
来选择静默此异常,并将其转换为简单的警告。
注意
一些 scrapy 命令 已经在 True
的情况下运行此设置(即它们只会发出警告而不会失败),因为它们实际上不需要加载爬虫类即可工作:scrapy runspider
、scrapy settings
、scrapy startproject
、scrapy version
。
SPIDER_MIDDLEWARES
默认值:: {}
一个字典,包含项目中启用的爬虫中间件及其顺序。更多信息请参阅 激活爬虫中间件。
SPIDER_MIDDLEWARES_BASE
默认值
{
"scrapy.spidermiddlewares.httperror.HttpErrorMiddleware": 50,
"scrapy.spidermiddlewares.referer.RefererMiddleware": 700,
"scrapy.spidermiddlewares.urllength.UrlLengthMiddleware": 800,
"scrapy.spidermiddlewares.depth.DepthMiddleware": 900,
}
一个字典,包含 Scrapy 中默认启用的爬虫中间件及其顺序。较低的顺序更接近引擎,较高的顺序更接近爬虫。更多信息请参阅 激活爬虫中间件。
SPIDER_MODULES
默认值: ["<project name>.spiders"]
(回退: []
)
一个列表,列出了 Scrapy 将查找爬虫的模块。
示例
SPIDER_MODULES = ["mybot.spiders_prod", "mybot.spiders_dev"]
STATS_CLASS
默认值: 'scrapy.statscollectors.MemoryStatsCollector'
用于收集统计信息的类,该类必须实现 Stats Collector API。
STATS_DUMP
默认值: True
爬虫完成时转储 Scrapy 统计信息(到 Scrapy 日志)。
更多信息请参阅: 统计信息收集。
STATSMAILER_RCPTS
默认值: []
(空列表)
在爬虫完成爬取后发送 Scrapy 统计信息。更多信息请参阅 StatsMailer
。
TELNETCONSOLE_ENABLED
默认值: True
一个布尔值,指定是否启用 telnet 控制台(前提是其扩展也已启用)。
TEMPLATES_DIR
默认值: scrapy 模块内的 templates
目录
使用 startproject
命令创建新项目和使用 genspider
命令创建新爬虫时查找模板的目录。
项目名称不得与 project
子目录中自定义文件或目录的名称冲突。
TWISTED_REACTOR
版本 2.0 中新增。
默认值: "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
给定 reactor
的导入路径。
如果尚未安装其他 reactor,例如在调用 scrapy
CLI 程序或使用 CrawlerProcess
类时,Scrapy 将安装此 reactor。
如果您正在使用 CrawlerRunner
类,您还需要手动安装正确的 reactor。您可以使用 install_reactor()
来实现:
- scrapy.utils.reactor.install_reactor(reactor_path: str, event_loop_path: str | None = None) None [源代码]
安装具有指定导入路径的
reactor
。如果启用了 asyncio reactor,也会安装具有指定导入路径的 asyncio 事件循环。
如果已安装 reactor,install_reactor()
无效。
CrawlerRunner.__init__
如果已安装的 reactor 与 TWISTED_REACTOR
设置不匹配,则会引发 Exception
;因此,在项目文件和导入的第三方库中存在顶级 reactor
导入会导致 Scrapy 在检查安装的 reactor 时引发 Exception
。
为了使用 Scrapy 安装的 reactor:
import scrapy
from twisted.internet import reactor
class QuotesSpider(scrapy.Spider):
name = "quotes"
def __init__(self, *args, **kwargs):
self.timeout = int(kwargs.pop("timeout", "60"))
super(QuotesSpider, self).__init__(*args, **kwargs)
async def start(self):
reactor.callLater(self.timeout, self.stop)
urls = ["https://quotes.toscrape.com/page/1"]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
for quote in response.css("div.quote"):
yield {"text": quote.css("span.text::text").get()}
def stop(self):
self.crawler.engine.close_spider(self, "timeout")
这将引发 Exception
,变为:
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
def __init__(self, *args, **kwargs):
self.timeout = int(kwargs.pop("timeout", "60"))
super(QuotesSpider, self).__init__(*args, **kwargs)
async def start(self):
from twisted.internet import reactor
reactor.callLater(self.timeout, self.stop)
urls = ["https://quotes.toscrape.com/page/1"]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
for quote in response.css("div.quote"):
yield {"text": quote.css("span.text::text").get()}
def stop(self):
self.crawler.engine.close_spider(self, "timeout")
如果此设置设置为 None
,则 Scrapy 将使用已安装的现有 reactor(如果存在),否则安装 Twisted 为当前平台定义的默认 reactor。
版本 2.7 中的变化: startproject
命令现在在生成的 settings.py
文件中将此设置设置为 twisted.internet.asyncioreactor.AsyncioSelectorReactor
。
版本 2.13 中的变化: 默认值从 None
更改为 "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
。
更多信息请参阅 选择 Reactor 和 GUI 工具包集成。
URLLENGTH_LIMIT
默认值: 2083
范围: spidermiddlewares.urllength
允许爬取 URL 的最大长度。
此设置可作为 URL 长度不断增加情况下的停止条件,这种情况可能是由于目标服务器或您的代码中的编程错误引起的。另请参阅 REDIRECT_MAX_TIMES
和 DEPTH_LIMIT
。
使用 0
允许任何长度的 URL。
默认值复制自 Microsoft Internet Explorer 最大 URL 长度,尽管此设置存在的原因不同。
USER_AGENT
默认值: "Scrapy/VERSION (+https://scrapy.net.cn)"
爬取时使用的默认 User-Agent,除非被覆盖。如果 ROBOTSTXT_USER_AGENT
设置为 None
且请求未指定覆盖的 User-Agent 头部,则 RobotsTxtMiddleware
也会使用此用户代理。
WARN_ON_GENERATOR_RETURN_VALUE
默认值: True
启用后,如果基于生成器的回调方法(如 parse
)包含非 None
值的 return 语句,Scrapy 将发出警告。这有助于检测爬虫开发中的潜在错误。
禁用此设置可防止在运行时动态修改生成器函数源代码时可能发生的语法错误,跳过对回调函数的 AST 解析,或在自动重载开发环境中提高性能。
其他地方记录的设置:
以下设置记录在其他地方,请查看每个特定情况以了解如何启用和使用它们。