发行说明¶
Scrapy 2.12.0 (2024-11-18)¶
亮点 (Highlights)
放弃对 Python 3.8 的支持,添加对 Python 3.13 的支持 (Dropped support for Python 3.8, added support for Python 3.13)
start_requests()
现在可以 yield 项目 (items) (can now yield items)添加
JsonResponse
修改后的需求¶
放弃对 Python 3.8 的支持。(issue 6466, issue 6472)
添加对 Python 3.13 的支持。(issue 6166)
这些依赖项的最低版本已提高
Twisted: 18.9.0 → 21.7.0
cryptography: 36.0.0 → 37.0.0
pyOpenSSL: 21.0.0 → 22.0.0
lxml: 4.4.1 → 4.6.0
从依赖项列表中删除了
setuptools
。(issue 6487)
向后不兼容的更改¶
HTTPS 请求的用户定义 Cookie 将会设置
secure
标志为True
,除非显式地将其设置为False
。当这些 Cookie 在 HTTP 请求中重用时,例如在重定向到 HTTP URL 后,这一点很重要。(issue 6357)基于 Reppy 的
robots.txt
解析器,scrapy.robotstxt.ReppyRobotParser
,已被移除,因为它不支持 Python 3.9+。(issue 5230, issue 6099, issue 6499)scrapy.pipelines.media.MediaPipeline
及其子类的初始化 API 进行了改进,并且一些以前有效的用法场景可能不再有效。只有当您定义MediaPipeline
的自定义子类或通过from_settings()
或__init__()
调用而不是from_crawler()
调用创建这些管道的实例时,才会影响您。以前,
MediaPipeline.from_crawler()
会调用from_settings()
方法(如果存在)或__init__()
方法(否则),然后使用crawler
实例进行一些额外的初始化。如果from_settings()
方法存在(如FilesPipeline
中),它会调用__init__()
来创建实例。无法覆盖from_crawler()
而无需从其中调用MediaPipeline.from_crawler()
,而这在某些情况下(包括FilesPipeline
的子类)无法调用。现在,根据
from_crawler()
和from_settings()
的通用用法以及后者已被弃用,推荐的初始化顺序如下所示所有
__init__()
方法都应该接受一个crawler
参数。如果它们也接受settings
参数,则应忽略它,而使用crawler.settings
。当它们调用基类的__init__()
时,也应将crawler
参数传递给它。不应定义
from_settings()
方法。类特定的初始化代码应该放在覆盖的from_crawler()
方法或__init__()
中。现在可以覆盖
from_crawler()
,并且如果遵循其他建议,则无需在其中调用MediaPipeline.from_crawler()
。如果管道实例是使用
from_settings()
或__init__()
调用创建的(这在之前也不受支持,因为它错过了重要的初始化代码),则现在应使用from_crawler()
调用创建它们。
ImagesPipeline.convert_image
的response_body
参数现在是仅位置参数,因为它已从可选更改为必填。 (issue 6500)scrapy.utils.conf.build_component_list()
的convert
参数现在是仅位置参数,因为前面的参数 (custom
) 已被移除。 (issue 6500)scrapy.utils.conf.feed_process_params_from_cli()
的overwrite_output
参数现在是仅位置参数,因为前面的参数 (output_format
) 已被移除。 (issue 6500)
弃用移除¶
移除了 Scrapy 2.7.0 中弃用的
scrapy.utils.request.request_fingerprint()
函数。 (issue 6212,issue 6213)移除了 Scrapy 2.7.0 中弃用的设置
REQUEST_FINGERPRINTER_IMPLEMENTATION
的值"2.6"
的支持。 (issue 6212,issue 6213)RFPDupeFilter
子类现在需要在其__init__
方法中支持fingerprinter
参数,该参数在 Scrapy 2.7.0 中引入。 (issue 6102,issue 6113)移除了 Scrapy 2.7.0 中弃用的
scrapy.downloadermiddlewares.decompression
模块。 (issue 6100,issue 6113)移除了 Scrapy 2.6.0 中弃用的
scrapy.utils.response.response_httprepr()
函数。 (issue 6111,issue 6116)具有蜘蛛级 HTTP 身份验证的蜘蛛,即具有
http_user
或http_pass
属性的蜘蛛,现在也必须定义http_auth_domain
,该属性在 Scrapy 2.5.1 中引入。 (issue 6103,issue 6113)媒体管道 方法
file_path()
、file_downloaded()
、get_images()
、image_downloaded()
、media_downloaded()
、media_to_download()
和thumb_path()
现在必须支持一个在 Scrapy 2.4.0 中添加的item
参数。 (issue 6107,issue 6113)Feed 存储后端类 的
__init__()
和from_crawler()
方法现在必须支持在 Scrapy 2.4.0 中引入的仅关键字feed_options
参数。 (issue 6105,issue 6113)移除了 Scrapy 2.3.0 中弃用的
scrapy.loader.common
和scrapy.loader.processors
模块。 (issue 6106,issue 6113)移除了 Scrapy 2.3.0 中弃用的
scrapy.utils.misc.extract_regex()
函数。 (issue 6106,issue 6113)移除了
scrapy.http.JSONRequest
类,在 Scrapy 1.8.0 中替换为JsonRequest
。 (issue 6110,issue 6113)scrapy.utils.log.logformatter_adapter
不再支持缺少args
、level
或msg
参数,也不再支持format
参数,所有这些情况都在 Scrapy 1.0.0 中被弃用。 (issue 6109,issue 6116)分配给
SPIDER_LOADER_CLASS
设置的自定义类,如果未实现ISpiderLoader
接口,现在将在运行时引发zope.interface.verify.DoesNotImplement
异常。不符合规范的类从 Scrapy 1.0.0 开始就一直在触发弃用警告。 (issue 6101,issue 6113)移除了 Scrapy 2.1.0 中弃用的
--output-format
/-t
命令行选项。应改用-O <URI>:<FORMAT>
。 (issue 6500)在同一个
Crawler
实例上多次运行crawl()
,在 Scrapy 2.11.0 中弃用,现在会引发异常。 (issue 6500)在 Scrapy 2.5.0 中弃用,不允许在不为
__init__()
中的crawler
参数提供支持并且没有自定义from_crawler()
方法的情况下对HttpCompressionMiddleware
进行子类化。 (issue 6500)移除了 Scrapy 2.10.0 中弃用的
RetryMiddleware
的EXCEPTIONS_TO_RETRY
属性。 (issue 6500)移除了在未安装 boto3 包的情况下对 S3 Feed 导出 的支持,在 Scrapy 2.10.0 中弃用。 (issue 6500)
移除了 Scrapy 2.10.0 中弃用的
scrapy.extensions.feedexport._FeedSlot
类。 (issue 6500)移除了 Scrapy 2.8.0 中弃用的
scrapy.pipelines.images.NoimagesDrop
异常。 (issue 6500)ImagesPipeline.convert_image
的response_body
参数现在是必需的,在 Scrapy 2.8.0 中弃用未传递它。 (issue 6500)移除了 Scrapy 2.10.0 中弃用的
scrapy.utils.conf.build_component_list()
的custom
参数。 (issue 6500)移除了 Scrapy 2.9.0 中弃用的
scrapy.utils.reactor.get_asyncio_event_loop_policy()
函数。请改用asyncio.get_event_loop()
和相关的标准库函数。 (issue 6500)
弃用¶
具有 Scrapy 组件 的
from_settings()
方法现在已弃用。现在应改用from_crawler()
。受影响的组件scrapy.dupefilters.RFPDupeFilter
scrapy.middleware.MiddlewareManager
scrapy.core.downloader.contextfactory.ScrapyClientContextFactory
在第三方Scrapy组件中,现在不建议再使用
from_settings()
方法而没有from_crawler()
方法。如果您不想重构代码,可以定义一个简单的from_crawler()
方法,该方法调用cls.from_settings(crawler.settings)
来解决此问题。请注意,如果您有from_crawler()
方法,Scrapy将不会调用from_settings()
方法,因此后者可以删除。(issue 6540)scrapy.pipelines.media.MediaPipeline
及其子类的初始化API得到了改进,一些旧的使用场景现在已弃用(另请参阅“向后不兼容的更改”部分)。具体来说不建议定义不带
crawler
参数的__init__()
方法。不建议在不传递
crawler
参数的情况下调用__init__()
方法。如果传递了crawler
参数,也不建议再传递settings
参数,因为无论如何都会忽略它。调用
from_settings()
已弃用,请改用from_crawler()
。重写
from_settings()
已弃用,请改用重写from_crawler()
。
REQUEST_FINGERPRINTER_IMPLEMENTATION
设置现在已弃用。(issue 6212,issue 6213)scrapy.utils.misc.create_instance()
函数现在已弃用,请改用scrapy.utils.misc.build_from_crawler()
。(issue 5523,issue 5884,issue 6162,issue 6169,issue 6540)scrapy.core.downloader.Downloader._get_slot_key()
已弃用,请改用scrapy.core.downloader.Downloader.get_slot_key()
。(issue 6340,issue 6352)scrapy.utils.defer.process_chain_both()
现在已弃用。(issue 6397)scrapy.twisted_version
现在已弃用,您应该直接使用twisted.version
(但请注意,它是一个incremental.Version
对象,而不是元组)。(issue 6509,issue 6512)scrapy.utils.python.flatten()
和scrapy.utils.python.iflatten()
现在已弃用。(issue 6517,issue 6519)scrapy.utils.python.equal_attributes()
现在已弃用。(issue 6517,issue 6519)scrapy.utils.request.request_authenticate()
现在已弃用,您应该直接设置Authorization
标头。(issue 6517,issue 6519)scrapy.utils.serialize.ScrapyJSONDecoder
现在已弃用,自Scrapy 1.0.0以来它不包含任何代码。(issue 6517,issue 6519)scrapy.utils.test.assert_samelines()
现在已弃用。(issue 6517,issue 6519)scrapy.extensions.feedexport.build_storage()
现在已弃用。您可以直接调用构建器可调用对象。(issue 6540)
新功能¶
start_requests()
现在可以生成项目。(issue 5289,issue 6417)添加了一个新的
Response
子类JsonResponse
,用于具有JSON MIME类型的响应。(issue 6069,issue 6171,issue 6174)LogStats
扩展现在在蜘蛛关闭时将items_per_minute
和responses_per_minute
添加到统计数据中。(issue 4110,issue 4111)添加了
CLOSESPIDER_PAGECOUNT_NO_ITEM
,如果在设定的时间内没有抓取到任何项目,则允许关闭蜘蛛。(issue 6434)用户定义的cookie现在可以包含
secure
字段。(issue 6357)添加了
Crawler
的组件获取器:get_addon()
,get_downloader_middleware()
,get_extension()
,get_item_pipeline()
,get_spider_middleware()
。(issue 6181)基于响应延迟的自动节流扩展对插槽延迟的更新现在可以通过
autothrottle_dont_adjust_delay
元数据键对特定请求禁用。(issue 6246,issue 6527)如果
SPIDER_LOADER_WARN_ONLY
设置为True
,SpiderLoader
不会引发SyntaxError
,而是发出警告。(issue 6483,issue 6484)添加了对多压缩响应的支持(在
Content-Encoding
标头中具有多个编码的响应)。(issue 5143,issue 5964,issue 6063)添加了对
REFERRER_POLICY
中多个标准值的支持。(issue 6381)添加了对brotlicffi(以前称为brotlipy)的支持。brotli仍然推荐,但只有brotlicffi在PyPy上有效。(issue 6263,issue 6269)
添加了
MetadataContract
,用于设置请求元数据。(issue 6468,issue 6469)
改进¶
扩展了
LinkExtractor
默认忽略的文件扩展名列表。(issue 6074,issue 6125)scrapy.utils.httpobj.urlparse_cached()
现在在更多地方使用,而不是urllib.parse.urlparse()
。(issue 6228,issue 6229)
错误修复¶
MediaPipeline
现在是一个抽象类,其原本预期在子类中被重写的方法现在是抽象方法。(issue 6365,issue 6368)修复了处理合同提取中无效的以
@
开头的行的问题。(issue 6383,issue 6388)导入
scrapy.extensions.telnet
不会再安装默认的 reactor。(issue 6432)降低了在 2.11.2 中提升的已丢弃请求的日志详细程度。(issue 6433,issue 6475)
文档¶
添加了
SECURITY.md
,其中记录了安全策略。(issue 5364,issue 6051)用于 从脚本运行 Scrapy 的示例代码不再在顶层导入
twisted.internet.reactor
,这在未经修改地使用此代码时会导致非默认 reactor 出现问题。(issue 6361,issue 6374)记录了
SpiderState
扩展。(issue 6278,issue 6522)其他文档改进和修复。(issue 5920,issue 6094,issue 6177,issue 6200,issue 6207,issue 6216,issue 6223,issue 6317,issue 6328,issue 6389,issue 6394,issue 6402,issue 6411,issue 6427,issue 6429,issue 6440,issue 6448,issue 6449,issue 6462,issue 6497,issue 6506,issue 6507,issue 6524)
质量保证¶
添加了
py.typed
,符合 PEP 561。(issue 6058,issue 6059)使用类型提示全面覆盖了代码(除了最复杂的部分,主要与
twisted.web.http
和其他没有类型提示的 Twisted 部分相关)。(issue 5989,issue 6097,issue 6127,issue 6129,issue 6130,issue 6133,issue 6143,issue 6191,issue 6268,issue 6274,issue 6275,issue 6276,issue 6279,issue 6325,issue 6326,issue 6333,issue 6335,issue 6336,issue 6337,issue 6341,issue 6353,issue 6356,issue 6370,issue 6371,issue 6384,issue 6385,issue 6387,issue 6391,issue 6395,issue 6414,issue 6422,issue 6460,issue 6466,issue 6472,issue 6494,issue 6498,issue 6516)改进了 Bandit 检查。(issue 6260,issue 6264,issue 6265)
将 pyupgrade 添加到
pre-commit
配置中。(issue 6392)将
flake8-bugbear
、flake8-comprehensions
、flake8-debugger
、flake8-docstrings
、flake8-string-format
和flake8-type-checking
添加到pre-commit
配置中。(issue 6406,issue 6413)CI 和测试改进和修复。(issue 5285,issue 5454,issue 5997,issue 6078,issue 6084,issue 6087,issue 6132,issue 6153,issue 6154,issue 6201,issue 6231,issue 6232,issue 6235,issue 6236,issue 6242,issue 6245,issue 6253,issue 6258,issue 6259,issue 6270,issue 6272,issue 6286,issue 6290,issue 6296 issue 6367,issue 6372,issue 6403,issue 6416,issue 6435,issue 6489,issue 6501,issue 6504,issue 6511,issue 6543,issue 6545)
代码清理。(issue 6196,issue 6197,issue 6198,issue 6199,issue 6254,issue 6257,issue 6285,issue 6305,issue 6343,issue 6349,issue 6386,issue 6415,issue 6463,issue 6470,issue 6499,issue 6505,issue 6510,issue 6531,issue 6542)
其他¶
问题跟踪器改进。(issue 6066)
Scrapy 2.11.2 (2024-05-14)¶
安全漏洞修复¶
不再遵循重定向到非 HTTP 协议的链接。有关更多信息,请参阅 23j4-mw76-5v7h 安全公告。(issue 457)
现在,即使域名相同,重定向到不同方案(
http://
或https://
)或端口时,也会丢弃Authorization
标头。更多信息,请参阅 4qqq-9vqf-3h3f 安全公告。当使用针对
http://
和https://
不同的系统代理设置时,重定向到不同的 URL 方案现在也会触发重定向请求中相应的代理设置更改。更多信息,请参阅 jm3v-qxmh-hxwv 安全公告。(issue 767)现在,
Spider.allowed_domains
会对所有请求强制执行,而不仅仅是对来自 spider 回调的请求。(issue 1042,issue 2241,issue 6358)xmliter_lxml()
不再解析 XML 实体。(issue 6265)现在使用 defusedxml 使
scrapy.http.request.rpc.XmlRpcRequest
更安全。(issue 6250,issue 6251)
错误修复¶
恢复了对 brotlipy 的支持,该支持在 Scrapy 2.11.1 中被弃用,转而支持 brotli。(issue 6261)
注意
brotlipy 在 Scrapy 和上游中均已弃用。如果可以,请改用 brotli。
将
METAREFRESH_IGNORE_TAGS
默认设置为["noscript"]
。这可以防止MetaRefreshMiddleware
跟踪启用 JavaScript 的 Web 浏览器不会跟踪的重定向。(issue 6342,issue 6347)在 feed 导出 期间,不要关闭来自 内置后处理插件 的底层文件。(issue 5932,issue 6178,issue 6239)
LinkExtractor
现在正确应用了unique
和canonicalize
参数。(issue 3273,issue 6221)如果
JOBDIR
为空字符串,则不要初始化调度程序磁盘队列。(issue 6121,issue 6124)修复
Spider.logger
未记录自定义额外信息的问题。(issue 6323,issue 6324)编码非 UTF-8 的
robots.txt
文件不再阻止解析文档中与 UTF-8 兼容(例如 ASCII)的部分。(issue 6292,issue 6298)scrapy.http.cookies.WrappedRequest.get_header()
不再在default
为None
时引发异常。(issue 6308,issue 6310)Selector
现在使用scrapy.utils.response.get_base_url()
来确定给定Response
的基本 URL。(issue 6265)媒体管道 的
media_to_download()
方法现在在剥离异常之前记录异常。(issue 5067,issue 5068)将回调传递给
parse
命令时,使用正确的签名构建回调可调用对象。(issue 6182)
文档¶
添加了一个关于 创建空白请求 的常见问题解答条目。(issue 6203,issue 6208)
说明
scrapy.selector.Selector.type
可以是"json"
。(issue 6328,issue 6334)
质量保证¶
使构建可重现。(issue 5019,issue 6322)
打包和测试修复。(issue 6286,issue 6290,issue 6312,issue 6316,issue 6344)
Scrapy 2.11.1 (2024-02-14)¶
亮点 (Highlights)
安全漏洞修复。
支持 Twisted >= 23.8.0。
文档改进。
安全漏洞修复¶
解决了 ReDoS 漏洞
scrapy.utils.iterators.xmliter
现在已弃用,建议使用xmliter_lxml()
,XMLFeedSpider
现在使用该函数。为了最大程度地减少此更改对现有代码的影响,
xmliter_lxml()
现在支持在节点名称中使用前缀指示节点命名空间,以及在使用 libxml2 2.7+ 时处理具有高度嵌套树的大文件。修复了
open_in_browser()
函数实现中的正则表达式。
更多信息,请参阅 cc65-xxvf-f7r9 安全公告。
DOWNLOAD_MAXSIZE
和DOWNLOAD_WARNSIZE
现在也适用于解压缩后的响应主体。更多信息,请参阅 7j7m-v7m3-jqm7 安全公告。同样,与 7j7m-v7m3-jqm7 安全公告 相关,已删除弃用的
scrapy.downloadermiddlewares.decompression
模块。现在,重定向到不同域名时会丢弃
Authorization
标头。更多信息,请参阅 cw9j-q3vf-hrrv 安全公告。
修改后的需求¶
Twisted 依赖项不再限于 < 23.8.0。(issue 6024,issue 6064,issue 6142)
错误修复¶
重构了操作系统信号处理代码,不再使用私有的 Twisted 函数。(issue 6024,issue 6064,issue 6112)
文档¶
改进了 2.11.0 版本中进行的
Crawler
初始化更改的文档。(issue 6057,issue 6147)扩展了
Request.meta
的文档。(issue 5565)修复了
dont_merge_cookies
的文档。(issue 5936,issue 6077)在数据导出文档中添加了指向 Zyte 导出指南的链接。(issue 6183)
在 2.11.0 版本说明中添加了关于
PythonItemExporter
中不兼容的更改的缺失说明。(issue 6060,issue 6081)在 2.8.0 版本说明中添加了关于删除已弃用的
scrapy.utils.boto.is_botocore()
函数的缺失说明。(issue 6056,issue 6061)其他文档改进。(issue 6128,issue 6144,issue 6163,issue 6190,issue 6192)
质量保证¶
将 Python 3.12 添加到 CI 配置中,重新启用了在添加预发布支持时禁用的测试。(issue 5985,issue 6083,issue 6098)
修复了 PyPy 7.3.14 上的测试问题。(issue 6204,issue 6205)
Scrapy 2.11.0 (2023-09-18)¶
亮点 (Highlights)
爬虫现在可以在其
from_crawler()
方法中修改设置,例如根据爬虫参数。定期记录统计数据。
向后不兼容的更改¶
scrapy.crawler.Crawler
实例的大部分初始化现在在crawl()
中完成,因此在调用该方法之前实例的状态与旧版本的 Scrapy 不同。我们不建议在调用Crawler
实例的crawl()
之前使用该实例。(issue 6038)scrapy.Spider.from_crawler()
现在在之前在scrapy.crawler.Crawler.__init__()
中初始化的各种组件初始化之前以及在设置最终确定并冻结之前被调用。此更改是为了允许在scrapy.Spider.from_crawler()
中更改设置。如果希望在爬虫代码中尽早访问最终设置值和已初始化的Crawler
属性,可以在start_requests()
或engine_started
信号的处理程序中执行此操作。(issue 6038)TextResponse.json
方法现在要求响应采用有效的 JSON 编码(UTF-8、UTF-16 或 UTF-32)。如果需要处理无效编码的 JSON 文档,请改用json.loads(response.text)
。(issue 6016)PythonItemExporter
以前默认使用二进制输出,但现在不再使用了。(issue 6006,issue 6007)
已移除弃用功能¶
移除了
PythonItemExporter
的二进制导出模式,该模式在 Scrapy 1.1.0 中已弃用。(issue 6006,issue 6007)注意
如果在 Scrapy Cloud 上使用此 Scrapy 版本,且堆栈包含旧版本的 Scrapy,并收到“TypeError: Unexpected options: binary”错误,则可能需要将
scrapinghub-entrypoint-scrapy >= 0.14.1
添加到项目的依赖项中,或切换到包含 Scrapy 2.11 的堆栈。移除了
CrawlerRunner.spiders
属性,该属性在 Scrapy 1.0.0 中已弃用,请改用CrawlerRunner.spider_loader
。(issue 6010)移除了
scrapy.utils.response.response_httprepr()
函数,该函数在 Scrapy 2.6.0 中已弃用。(issue 6111)
弃用功能¶
在同一个
scrapy.crawler.Crawler
实例上多次运行crawl()
现已弃用。(issue 1587,issue 6040)
新功能¶
爬虫现在可以在其
from_crawler()
方法中修改设置,例如根据爬虫参数。(issue 1305,issue 1580,issue 2392,issue 3663,issue 6038)添加了
PeriodicLog
扩展,可以启用该扩展以定期记录统计数据和/或其差异。(issue 5926)通过删除不必要的正文解码,优化了
TextResponse.json
中的内存使用情况。(issue 5968,issue 6016)指向
.webp
文件的链接现在会被链接提取器忽略。(issue 6021)
错误修复¶
修复了启用日志记录的附加组件。(issue 6036)
修复了
MailSender
在将charset
参数传递给send()
时生成无效邮件正文的问题。(issue 5096,issue 5118)修复了从
RetryMiddleware
的子类访问self.EXCEPTIONS_TO_RETRY
时发生的异常。(issue 6049,issue 6050)scrapy.settings.BaseSettings.getdictorlist()
(用于解析FEED_EXPORT_FIELDS
)现在处理元组值。(issue 6011,issue 6013)已弃用的
datetime.utcnow()
调用已被替换为带有时区的datetime.now()
调用。(issue 6014)
文档¶
更新了管道示例中的已弃用函数调用。(issue 6008,issue 6009)
质量保证¶
扩展了类型提示。(issue 6003,issue 6005,issue 6031,issue 6034)
将brotli 固定到 1.0.9 用于 PyPy 测试,因为 1.1.0 会破坏它们。(issue 6044,issue 6045)
其他 CI 和预提交改进。(issue 6002,issue 6013,issue 6046)
Scrapy 2.10.1 (2023-08-30)¶
标记 Twisted >= 23.8.0
为不支持版本。(issue 6024,issue 6026)
Scrapy 2.10.0 (2023-08-04)¶
亮点 (Highlights)
添加了 Python 3.12 支持,放弃了 Python 3.7 支持。
新的插件框架简化了支持该框架的第三方组件的配置。
现在可以配置重试的异常。
对 Feed 导出进行了许多修复和改进。
修改了依赖项¶
放弃了对 Python 3.7 的支持。(issue 5953)
添加了对即将发布的 Python 3.12 的支持。(issue 5984)
这些依赖项的最低版本已提高
lxml: 4.3.0 → 4.4.1
cryptography: 3.4.6 → 36.0.0
pkg_resources
不再使用。(issue 5956,issue 5958)现在推荐使用 boto3 而不是 botocore 导出到 S3。(issue 5833)。
向后不兼容的更改¶
FEED_STORE_EMPTY
设置的值现在为True
而不是False
。在早期的 Scrapy 版本中,即使此设置设置为False
,也会创建空文件(这是一个现在已修复的错误),因此新的默认值应保留旧的行为。(issue 872,issue 5847)
弃用移除¶
当将函数分配给
FEED_URI_PARAMS
设置时,在 Scrapy 2.6 中弃用的返回None
或修改params
输入参数不再受支持。(issue 5994,issue 5996)在 Scrapy 2.6 中弃用的
scrapy.utils.reqser
模块已移除。(issue 5994,issue 5996)在 Scrapy 2.6 中弃用的
scrapy.squeues
类PickleFifoDiskQueueNonRequest
、PickleLifoDiskQueueNonRequest
、MarshalFifoDiskQueueNonRequest
和MarshalLifoDiskQueueNonRequest
已移除。(issue 5994,issue 5996)在 Scrapy 2.6 中弃用的
scrapy.core.engine.ExecutionEngine
的属性open_spiders
和方法has_capacity
和schedule
已移除。(issue 5994,issue 5998)在 Scrapy 2.6 中弃用的将
spider
参数传递给scrapy.core.engine.ExecutionEngine
的spider_is_idle()
、crawl()
和download()
方法不再受支持。(issue 5994,issue 5998)
弃用¶
scrapy.utils.datatypes.CaselessDict
已弃用,请改用scrapy.utils.datatypes.CaseInsensitiveDict
。(issue 5146)将
custom
参数传递给scrapy.utils.conf.build_component_list()
已弃用,它过去用于合并FOO
和FOO_BASE
设置值,但现在 Scrapy 使用scrapy.settings.BaseSettings.getwithbase()
来执行相同的操作。使用此参数且无法切换到getwithbase()
的代码可以切换到显式合并值。(issue 5726,issue 5923)
新特性¶
添加了对 Scrapy 插件 的支持。(issue 5950)
添加了
RETRY_EXCEPTIONS
设置,该设置配置RetryMiddleware
将重试哪些异常。(issue 2701,issue 5929)添加了在指定时间内未生成任何项目时关闭爬虫的可能性,由
CLOSESPIDER_TIMEOUT_NO_ITEM
配置。(issue 5979)添加了对 Feed 导出中
AWS_REGION_NAME
设置的支持。(issue 5980)添加了对在
FEEDS
设置中使用引用绝对 Windows 路径的pathlib.Path
对象的支持。(issue 5939)
Bug 修复¶
修复了即使
FEED_STORE_EMPTY=False
也会创建空 Feed 的问题。(issue 872,issue 5847)修复了指定输出文件时使用绝对 Windows 路径的问题。(issue 5969,issue 5971)
通过切换到分块上传修复了将大型文件上传到 S3 的问题(需要 boto3)。(issue 960,issue 5735,issue 5833)
修复了 JSON 导出器在某些异常发生时写入额外逗号的问题。(issue 3090,issue 5952)
修复了 CSV 导出器中“读取已关闭的文件”错误。(issue 5043,issue 5705)
修复了类对象添加的组件抛出带有消息的
NotConfigured
异常时的错误。(issue 5950,issue 5992)添加了缺失的
scrapy.settings.BaseSettings.pop()
方法。(issue 5959,issue 5960,issue 5963)添加了
CaseInsensitiveDict
作为CaselessDict
的替代,修复了一些 API 不一致性。(issue 5146)
文档¶
记录了早期 Twisted reactor 安装可能出现的问题及其解决方法。(issue 5981,issue 6000)
添加了在回调中发出额外请求的示例。(issue 5927)
改进了 Feed 导出文档。(issue 5579,issue 5931)
阐明了关于重定向时请求对象的文档。(issue 5707,issue 5937)
质量保证¶
添加了对针对已安装的 Scrapy 版本运行测试的支持。(issue 4914,issue 5949)
扩展了类型提示。(issue 5925,issue 5977)
修复了
test_utils_asyncio.AsyncioTest.test_set_asyncio_event_loop
测试。(issue 5951)修复了 Windows 上的
test_feedexport.BatchDeliveriesTest.test_batch_path_differ
测试。(issue 5847)启用了 Windows 上 Python 3.11 的 CI 运行。(issue 5999)
简化了跳过依赖于
uvloop
的测试。(issue 5984)修复了
extra-deps-pinned
tox 环境。(issue 5948)实现了清理工作。(issue 5965,issue 5986)
Scrapy 2.9.0 (2023-05-08)¶
亮点 (Highlights)
每个域的下载设置。
兼容新的 cryptography 和新的 parsel。
来自新版 parsel 的 JMESPath 选择器。
错误修复。
弃用¶
scrapy.extensions.feedexport._FeedSlot
重命名为scrapy.extensions.feedexport.FeedSlot
,旧名称已弃用。(issue 5876)
新特性¶
对应于
DOWNLOAD_DELAY
、CONCURRENT_REQUESTS_PER_DOMAIN
和RANDOMIZE_DOWNLOAD_DELAY
的设置现在可以通过新的DOWNLOAD_SLOTS
设置在每个域的基础上设置。(issue 5328)添加了
TextResponse.jmespath()
,自 parsel 1.8.1 以来可用的 JMESPath 选择器的快捷方式。(issue 5894,issue 5915)添加了
feed_slot_closed
和feed_exporter_closed
信号。(issue 5876)添加了
scrapy.utils.request.request_to_curl()
,一个从Request
对象生成 curl 命令的函数。(issue 5892)FILES_STORE
和IMAGES_STORE
的值现在可以是pathlib.Path
实例。(issue 5801)
错误修复¶
修复了 Parsel 1.8.1+ 的警告。(issue 5903,issue 5918)
修复了使用 S3 存储进行 Feed 后处理时的错误。(issue 5500,issue 5581)
添加了缺失的
scrapy.settings.BaseSettings.setdefault()
方法。(issue 5811,issue 5821)修复了使用 cryptography 40.0.0+ 且启用了
DOWNLOADER_CLIENT_TLS_VERBOSE_LOGGING
时的错误。(issue 5857,issue 5858)FilesPipeline
为 Google Cloud Storage 上的文件返回的校验和不再进行 Base64 编码。(issue 5874,issue 5891)scrapy.utils.request.request_from_curl()
现在支持 curl--data-raw
参数的以 $ 为前缀的字符串值,这些值由浏览器为包含某些符号的数据生成。(issue 5899,issue 5901)parse
命令现在也适用于异步生成器回调。(issue 5819,issue 5824)genspider
命令现在可以正确处理 HTTPS URL。(issue 3553,issue 5808)改进了对 asyncio 循环的处理。(issue 5831,issue 5832)
LinkExtractor
现在跳过某些格式错误的 URL,而不是引发异常。(issue 5881)scrapy.utils.python.get_func_args()
现在支持更多类型的可调用对象。(issue 5872,issue 5885)修复了处理
Content-Type
标头的非 UTF8 值时的错误。(issue 5914,issue 5917)修复了破坏用户在
scrapy.mail.MailSender.send()
中处理发送失败的错误。(issue 1611,issue 5880)
文档¶
扩展了贡献文档。(issue 5109,issue 5851)
将 blacken-docs 添加到 pre-commit 并使用它重新格式化了文档。(issue 5813,issue 5816)
修复了一个 JS 问题。(issue 5875,issue 5877)
修复了
make htmlview
。(issue 5878,issue 5879)修复了错别字和其他一些小错误。(issue 5827,issue 5839,issue 5883,issue 5890,issue 5895,issue 5904)
质量保证¶
扩展了类型提示。(issue 5805,issue 5889,issue 5896)
文档中大多数示例的测试现在作为 CI 的一部分运行,发现的问题已修复。(issue 5816,issue 5826,issue 5919)
删除了对已弃用 Python 类的使用。(issue 5849)
消除了 coverage 发出的
include-ignored
警告。(issue 5820)修复了
test_feedexport.test_batch_path_differ
测试的随机失败。(issue 5855,issue 5898)更新了 docstrings 以匹配 parsel 1.8.1 生成的输出,以便它们不会导致测试失败。(issue 5902,issue 5919)
其他 CI 和 pre-commit 改进。(issue 5802,issue 5823,issue 5908)
Scrapy 2.8.0 (2023-02-02)¶
这是一个维护版本,包含一些小特性、错误修复和清理工作。
弃用移除¶
Scrapy 2.0 中已弃用的
scrapy.utils.gz.read1
函数现已移除。请改用read1()
方法GzipFile
。(issue 5719)Scrapy 2.0 中已弃用的
scrapy.utils.python.to_native_str
函数现已移除。请改用scrapy.utils.python.to_unicode()
。(issue 5719)Scrapy 2.0 中已弃用的
scrapy.utils.python.MutableChain.next
方法现已移除。请使用__next__()
代替。(issue 5719)Scrapy 2.0 中已弃用的
scrapy.linkextractors.FilteringLinkExtractor
类现已移除。请使用LinkExtractor
代替。(issue 5720)Scrapy 2.0 中已弃用的使用以
SCRAPY_
为前缀的环境变量覆盖设置的功能现已移除。(issue 5724)Scrapy 2.0 中已弃用的在代理 URL 中使用
noconnect
查询字符串参数的功能现已移除。我们预计以前需要此参数的代理在没有它的情况下也能正常工作。(issue 5731)Scrapy 2.3 中已弃用的
scrapy.utils.python.retry_on_eintr
函数现已移除。(issue 5719)Scrapy 2.4 中已弃用的
scrapy.utils.python.WeakKeyCache
类现已移除。(issue 5719)Scrapy 2.4 中已弃用的
scrapy.utils.boto.is_botocore()
函数现已移除。(issue 5719)
弃用功能¶
scrapy.pipelines.images.NoimagesDrop
现已弃用。(issue 5368,issue 5489)ImagesPipeline.convert_image
现在必须接受一个response_body
参数。(issue 3055,issue 3689,issue 4753)
新功能¶
使用 black 代码风格格式化了使用
genspider
和startproject
命令生成的的文件。(issue 5809,issue 5814)FEED_EXPORT_ENCODING
现在在startproject
命令生成的settings.py
文件中设置为"utf-8"
。使用此值,JSON 导出将不会强制使用转义序列来表示非 ASCII 字符。(issue 5797,issue 5800)MemoryUsage
扩展现在在检查期间记录峰值内存使用情况,并且现在使用二进制单位 MiB 以避免混淆。(issue 5717,issue 5722,issue 5727)Request
的callback
参数现在可以设置为scrapy.http.request.NO_CALLBACK()
,以将其与None
区分开,因为后者表示要使用默认的 spider 回调(parse()
)。(issue 5798)
错误修复¶
启用了不安全的旧版 SSL 重新协商,以修复访问某些过时网站的问题。(issue 5491,issue 5790)
修复了基于 STARTTLS 的电子邮件传递在 Twisted 21.2.0 及更高版本中无法工作的问题。(issue 5386,issue 5406)
修复了 项目导出器 的
finish_exporting()
方法在空文件时未被调用的问题。(issue 5537,issue 5758)修复了 HTTP/2 响应在收到多个具有相同名称的标头时仅获取最后一个标头值的问题。(issue 5777)
修复了
shell
命令在某些情况下 使用 asyncio 时引发的异常。(issue 5740,issue 5742,issue 5748,issue 5759,issue 5760,issue 5771)使用
CrawlSpider
时,在Rule
的process_request
回调中添加到请求的回调关键字参数(cb_kwargs
)将不再被忽略。(issue 5699)图片管道 不再重新编码 JPEG 文件。(issue 3055,issue 3689,issue 4753)
修复了 图片管道 处理透明 WebP 图片的方式。(issue 3072,issue 5766,issue 5767)
scrapy.shell.inspect_response()
不再抑制SIGINT
(Ctrl+C)。(issue 2918)LinkExtractor
使用unique=False
时不再过滤掉 URL 和文本都相同的链接。(issue 3798,issue 3799,issue 4695,issue 5458)RobotsTxtMiddleware
现在忽略不支持robots.txt
的 URL 协议(data://
,file://
)。(issue 5807)消除了 Scrapy 2.6 中引入的
filelock
调试日志消息。(issue 5753,issue 5754)修复了
scrapy -h
的输出显示意外的**commands**
行的问题。(issue 5709,issue 5711,issue 5712)使 命令 输出中活动项目的指示更加清晰。(issue 5715)
文档¶
记录了
DOWNLOAD_DELAY
如何影响每个域的并发性。(issue 5083,issue 5540)改进了文档的一致性。(issue 5761)
修复了错别字。(issue 5714,issue 5744,issue 5764)
质量保证¶
应用了 black 代码风格,对导入语句进行了排序,并引入了 pre-commit。(issue 4654,issue 4658,issue 5734,issue 5737,issue 5806,issue 5810)
从
os.path
切换到pathlib
。(issue 4916,issue 4497,issue 5682)解决了 Pylint 报告的许多问题。(issue 5677)
提高了代码可读性。(issue 5736)
改进了包元数据。(issue 5768)
删除了对
setup.py
的直接调用。(issue 5774,issue 5776)删除了不必要的
OrderedDict
用法。(issue 5795)删除了不必要的
__str__
定义。(issue 5150)删除了过时的代码和注释。(issue 5725,issue 5729,issue 5730,issue 5732)
修复了测试和 CI 问题。(issue 5749,issue 5750,issue 5756,issue 5762,issue 5765,issue 5780,issue 5781,issue 5782,issue 5783,issue 5785,issue 5786)
Scrapy 2.7.1 (2022-11-02)¶
新特性¶
放宽了 2.6.2 中引入的限制,以便可以再次显式设置
Proxy-Authorization
标头,只要proxy
元数据中的代理 URL 没有其他凭据,并且只要该代理 URL 保持不变;这恢复了与 scrapy-zyte-smartproxy 2.1.0 及更早版本 的兼容性(issue 5626)。
错误修复¶
现在,将
-O
/--overwrite-output
和-t
/--output-format
选项一起使用会产生错误,而不是忽略前一个选项(issue 5516,issue 5605)。替换了已弃用的
asyncio
API,这些 API 隐式地使用当前事件循环,替换为显式地从事件循环策略请求循环的代码(issue 5685,issue 5689)。修复了 Scrapy 本身中对已弃用 Scrapy API 的使用(issue 5588,issue 5589)。
修复了对已弃用 Pillow API 的使用(issue 5684,issue 5692)。
改进了检查生成器是否返回值的代码,以便它不再在装饰方法和部分方法上失败(issue 5323,issue 5592,issue 5599,issue 5691)。
文档¶
将行为准则升级到 Contributor Covenant v2.1(issue 5698)。
修复了错别字(issue 5681,issue 5694)。
质量保证¶
重新启用了一些错误地禁用的 flake8 检查(issue 5688)。
忽略了测试中来自
typing
的无害弃用警告(issue 5686,issue 5697)。现代化了我们的 CI 配置(issue 5695,issue 5696)。
Scrapy 2.7.0 (2022-10-17)¶
亮点 (Highlights)
添加了 Python 3.11 支持,放弃了 Python 3.6 支持
改进了对 异步回调 的支持
Asyncio 支持 在新项目中默认启用
项目字段的输出名称现在可以是任意字符串
现在可以集中配置 请求指纹
修改了依赖项¶
现在需要 Python 3.7 或更高版本;已放弃对 Python 3.6 的支持。已添加对即将推出的 Python 3.11 的支持。
一些依赖项的最低要求版本也已更改
lxml: 3.5.0 → 4.3.0
zope.interface: 5.0.0 → 5.1.0
(issue 5512,issue 5514,issue 5524,issue 5563,issue 5664,issue 5670,issue 5678)
弃用¶
ImagesPipeline.thumb_path
现在必须接受一个item
参数(issue 5504,issue 5508)。scrapy.downloadermiddlewares.decompression
模块现已弃用(issue 5546,issue 5547)。
新特性¶
process_spider_output()
方法 蜘蛛中间件 现在可以定义为 异步生成器(issue 4978)。现在异步处理定义为 协程 的
Request
回调的输出(issue 4978)。CrawlSpider
现在支持 异步回调(issue 5657)。使用
startproject
命令创建的新项目默认启用了 asyncio 支持(issue 5590,issue 5679)。FEED_EXPORT_FIELDS
设置现在可以定义为字典以自定义项目字段的输出名称,从而取消了要求输出名称为有效 Python 标识符的限制,例如防止它们包含空格(issue 1008,issue 3266,issue 3696)。现在,您可以通过新的
REQUEST_FINGERPRINTER_CLASS
设置自定义 请求指纹,而不是必须更改依赖于请求指纹的每个 Scrapy 组件(issue 900,issue 3420,issue 4113,issue 4762,issue 4524)。jsonl
现在受支持,并建议用作 JSON Lines 文件的文件扩展名(issue 4848)。ImagesPipeline.thumb_path
现在接收源 item(issue 5504,issue 5508)。
错误修复¶
当使用 Google Cloud Storage 和 媒体管道 时,
FILES_EXPIRES
现在在FILES_STORE
未指向 Google Cloud Storage 存储桶的根目录时也能正常工作(issue 5317,issue 5318)。parse
命令现在支持 异步回调(issue 5424,issue 5577)。当使用
parse
命令并传入一个没有可用 spider 的 URL 时,不再抛出异常(issue 3264,issue 3265,issue 5375,issue 5376,issue 5497)。TextResponse
现在在确定响应主体文本编码时,会优先考虑 字节顺序标记,遵循 HTML 活跃标准(issue 5601,issue 5611)。MIME 嗅探现在会考虑 FTP 和 HTTP/1.0 请求以及缓存请求中的响应主体(issue 4873)。
MIME 嗅探现在可以检测有效的 HTML 5 文档,即使缺少
html
标签(issue 4873)。如果
ASYNCIO_EVENT_LOOP
的值与实际安装的 asyncio 事件循环不匹配,现在会抛出异常(issue 5529)。修复了
Headers.getlist
只返回最后一个 header 的问题(issue 5515,issue 5526)。修复了
LinkExtractor
默认情况下不忽略tar.gz
文件扩展名的问题(issue 1837,issue 2067,issue 4066)。
文档¶
阐明了
Spider.parse
的返回类型(issue 5602,issue 5608)。为了使
HttpCompressionMiddleware
执行 brotli 压缩,现在建议安装 brotli 而不是 brotlipy,因为前者提供了更新版本的 brotli。信号文档 现在提到了 协程支持 并在代码示例中使用它(issue 4852,issue 5358)。
避免被封禁 现在推荐使用 Common Crawl 而不是 Google 缓存(issue 3582,issue 5432)。
新的 组件 主题涵盖了对 Scrapy 组件(如 下载中间件、扩展、项目管道、蜘蛛中间件 等)的要求的强制执行;还添加了 强制执行 asyncio 作为要求(issue 4978)。
设置 现在指出设置值必须是 可 pickle 化的(issue 5607,issue 5629)。
删除了过时的文档(issue 5446,issue 5373,issue 5369,issue 5370,issue 5554)。
修复了错别字(issue 5442,issue 5455,issue 5457,issue 5461,issue 5538,issue 5553,issue 5558,issue 5624,issue 5631)。
修复了其他问题(issue 5283,issue 5284,issue 5559,issue 5567,issue 5648,issue 5659,issue 5665)。
质量保证¶
添加了一个持续集成作业来运行 twine check(issue 5655,issue 5656)。
解决了测试问题和警告(issue 5560,issue 5561,issue 5612,issue 5617,issue 5639,issue 5645,issue 5662,issue 5671,issue 5675)。
清理了代码(issue 4991,issue 4995,issue 5451,issue 5487,issue 5542,issue 5667,issue 5668,issue 5672)。
应用了轻微的代码改进(issue 5661)。
Scrapy 2.6.3 (2022-09-27)¶
添加了对 pyOpenSSL 22.1.0 的支持,并删除了对 SSLv3 的支持(issue 5634,issue 5635,issue 5636)。
升级了以下依赖项的最低版本
cryptography: 2.0 → 3.3
pyOpenSSL: 16.2.0 → 21.0.0
service_identity: 16.0.0 → 18.1.0
Twisted: 17.9.0 → 18.9.0
zope.interface: 4.1.3 → 5.0.0
修复了测试和文档问题(issue 5612,issue 5617,issue 5631)。
Scrapy 2.6.2 (2022-07-25)¶
安全漏洞修复
当
HttpProxyMiddleware
处理带有proxy
元数据的请求,并且该proxy
元数据包含代理凭据时,HttpProxyMiddleware
会设置Proxy-Authorization
header,但仅当该 header 未设置时。有一些第三方代理轮换下载中间件,会在每次处理请求时设置不同的
proxy
元数据。由于请求重试和重定向,同一个请求可能会被下载中间件处理多次,包括
HttpProxyMiddleware
和任何第三方代理轮换下载中间件。这些第三方代理轮换下载中间件可能会将请求的
proxy
元数据更改为一个新值,但未能从proxy
元数据的先前值中删除Proxy-Authorization
头,从而导致一个代理的凭据被发送到另一个代理。为了防止意外泄露代理凭据,
HttpProxyMiddleware
在处理请求时的行为现在如下所示如果正在处理的请求定义了包含凭据的
proxy
元数据,则Proxy-Authorization
头将始终更新为包含这些凭据。如果正在处理的请求定义了不包含凭据的
proxy
元数据,则Proxy-Authorization
头将被删除,*除非*它最初是为同一个代理 URL 定义的。要删除代理凭据同时保留相同的代理 URL,请删除
Proxy-Authorization
头。如果请求没有
proxy
元数据,或者该元数据是假值(例如None
),则Proxy-Authorization
头将被删除。现在无法再通过
proxy
元数据设置代理 URL,但通过Proxy-Authorization
头设置凭据。请改为通过proxy
元数据设置代理凭据。
还修复了 2.6.0 中引入的以下回归
CrawlerProcess
再次支持爬取多个蜘蛛(issue 5435,issue 5436)在 Scrapy 之前安装 Twisted reactor(例如,在模块级别导入
twisted.internet.reactor
)不再阻止 Scrapy 启动,只要在TWISTED_REACTOR
中没有指定不同的 reactor(issue 5525,issue 5528)修复了在某些条件下蜘蛛完成之后记录的异常(issue 5437,issue 5440)
--output
/-o
命令行参数再次支持以连字符开头的值(issue 5444,issue 5445)scrapy parse -h
命令不再抛出错误(issue 5481,issue 5482)
Scrapy 2.6.1 (2022-03-01)¶
修复了 2.6.0 中引入的一个回归,该回归会在跟随重定向时取消设置请求方法。
Scrapy 2.6.0 (2022-03-01)¶
亮点 (Highlights)
Python 3.10 支持
asyncio 支持 不再被视为实验性功能,并且无论您的 Python 版本如何,都可以在 Windows 上开箱即用
Feed 导出现在支持
pathlib.Path
输出路径以及每个 Feed 的项目过滤 和后处理
安全漏洞修复¶
当定义了 Cookie 的
Request
对象收到重定向响应,导致计划创建新的Request
对象时,原始Request
对象中定义的 Cookie 将不再复制到新的Request
对象中。如果您在
Request
对象上手动设置了Cookie
头,并且重定向 URL 的域名与原始Request
对象的 URL 域名不完全匹配,则您的Cookie
头现在将从新的Request
对象中删除。旧的行为可能被攻击者利用来访问您的 Cookie。请参阅cjvr-mfj7-j4j8 安全公告以获取更多信息。
注意
仍然可以通过在定义 Cookie 时将共享的域名后缀(例如
example.com
)定义为 Cookie 域名来启用不同域名之间共享 Cookie 的功能(例如example.com
和任何子域名)。请参阅Request
类的文档以获取更多信息。当 Cookie 的域名(在响应的
Set-Cookie
头中接收或在Request
对象中定义)设置为公共后缀时,现在将忽略该 Cookie,除非 Cookie 域名与请求域名相同。旧的行为可能被攻击者利用,将来自受控域名的 Cookie 注入到您的 CookieJar 中,这些 Cookie 可能会发送到不受攻击者控制的其他域名。请参阅mfjm-vh54-3f96 安全公告以获取更多信息。
修改后的依赖项¶
h2 依赖项现在是可选的,仅在需要启用 HTTP/2 支持时才需要。(issue 5113)
向后不兼容的更改¶
FormRequest
的formdata
参数,如果为非 POST 请求指定,现在将覆盖 URL 查询字符串,而不是附加到它。(issue 2919,issue 3579)当将函数分配给
FEED_URI_PARAMS
设置时,现在该函数的返回值(而不是params
输入参数)将决定 Feed URI 参数,除非该返回值为None
。(issue 4962,issue 4966)在
scrapy.core.engine.ExecutionEngine
中,方法crawl()
、download()
、schedule()
和spider_is_idle()
现在会在open_spider()
之前调用时引发RuntimeError
。(issue 5090)这些方法过去假设
ExecutionEngine.slot
已由先前对open_spider()
的调用定义,因此它们改为引发AttributeError
。如果配置的调度器的API不符合预期,现在会在启动时引发
TypeError
。之前,其他异常会在运行时引发。(issue 3559)序列化后的
Request
对象的_encoding
字段现在命名为encoding
,与所有其他字段保持一致。(issue 5130)
移除弃用功能¶
Scrapy 2.2中已弃用的
scrapy.http.TextResponse.body_as_unicode
现已移除。(issue 5393)Scrapy 2.2中已弃用的
scrapy.item.BaseItem
现已移除。(issue 5398)Scrapy 1.8中已弃用的
scrapy.item.DictItem
现已移除。(issue 5398)Scrapy 1.4中已弃用的
scrapy.Spider.make_requests_from_url
现已移除。(issue 4178,issue 4356)
弃用功能¶
当一个函数被赋值给
FEED_URI_PARAMS
设置时,返回None
或修改params
输入参数现在已被弃用。请改为返回一个新的字典。(issue 4962,issue 4966)scrapy.utils.reqser
已弃用。(issue 5130)请使用新的
Request.to_dict
方法代替request_to_dict()
。请使用新的
scrapy.utils.request.request_from_dict()
函数代替request_from_dict()
。
在
scrapy.squeues
中,以下队列类已弃用:PickleFifoDiskQueueNonRequest
、PickleLifoDiskQueueNonRequest
、MarshalFifoDiskQueueNonRequest
和MarshalLifoDiskQueueNonRequest
。您应该改为使用:PickleFifoDiskQueue
、PickleLifoDiskQueue
、MarshalFifoDiskQueue
和MarshalLifoDiskQueue
。(issue 5117)scrapy.core.engine.ExecutionEngine
中许多来自该类可以同时处理多个Spider
对象时的方面已被弃用。(issue 5090)has_capacity()
方法已弃用。schedule()
方法已弃用,请改为使用crawl()
或download()
。open_spiders
属性已弃用,请改为使用spider
。以下方法的
spider
参数已弃用spider_is_idle()
crawl()
download()
请先调用
open_spider()
来设置Spider
对象。
scrapy.utils.response.response_httprepr()
现已弃用。(issue 4972)
新功能¶
您现在可以使用项目过滤来控制哪些项目导出到每个输出Feed。(issue 4575,issue 5178,issue 5161,issue 5203)
您现在可以对Feed应用后处理,并且提供了用于输出文件压缩的内置后处理插件。(issue 2174,issue 5168,issue 5190)
FEEDS
设置现在支持pathlib.Path
对象作为键。(issue 5383,issue 5384)在使用Windows和Python 3.8或更高版本时启用asyncio将自动将asyncio事件循环切换到允许Scrapy工作的循环。请参阅Windows特定说明。(issue 4976,issue 5315)
genspider
命令现在支持起始URL而不是域名。(issue 4439)scrapy.utils.defer
新增了两个函数,deferred_to_future()
和maybe_deferred_to_future()
,以帮助在使用asyncio反应器时等待Deferred。(issue 5288)Amazon S3 Feed导出存储增加了对临时安全凭证(
AWS_SESSION_TOKEN
)和端点自定义(AWS_ENDPOINT_URL
)的支持。(issue 4998,issue 5210)新增
LOG_FILE_APPEND
设置以允许截断日志文件。(issue 5279)Request.cookies
值为bool
、float
或int
的会被转换为str
。(issue 5252,issue 5253)您现在可以从
spider_idle
信号的处理程序中引发CloseSpider
,以自定义蜘蛛停止的原因。(issue 5191)当使用
HttpProxyMiddleware
时,非HTTPS HTTP/1.1请求的代理URL不再需要包含URL方案。(issue 4505,issue 4649)所有内置队列现在都公开了一个
peek
方法,该方法返回下一个队列对象(类似于pop
),但不会从队列中移除返回的对象。(issue 5112)如果底层队列不支持窥视(例如,因为您没有使用
queuelib
1.6.1或更高版本),则peek
方法会引发NotImplementedError
。Request
和Response
现在都有一个attributes
属性,这使得子类化更容易。对于Request
,它还允许子类与scrapy.utils.request.request_from_dict()
一起使用。(issue 1877,issue 5130,issue 5218)open()
和close()
方法现在对于 scheduler 来说是可选的。(issue 3559)HTTP/1.1
TunnelError
异常现在只截断长度超过 1000 个字符的响应体,而不是超过 32 个字符的响应体,这使得调试此类错误更容易。(issue 4881,issue 5007)ItemLoader
现在支持非文本响应。(issue 5145,issue 5269)
错误修复¶
TWISTED_REACTOR
和ASYNCIO_EVENT_LOOP
设置如果在custom_settings
中定义,将不再被忽略。(issue 4485,issue 5352)删除了一个模块级别的 Twisted reactor 导入,该导入可能会阻止 使用 asyncio reactor。(issue 5357)
startproject
命令可以再次与现有文件夹一起使用。(issue 4665,issue 4676)FEED_URI_PARAMS
设置现在按文档说明的行为。(issue 4962,issue 4966)Request.cb_kwargs
再次允许使用callback
关键字。(issue 5237,issue 5251,issue 5264)使
scrapy.utils.response.open_in_browser()
支持更复杂的 HTML。(issue 5319,issue 5320)修复了
CSVFeedSpider.quotechar
被解释为 CSV 文件编码的问题。(issue 5391,issue 5394)将缺少的 setuptools 添加到依赖项列表中。(issue 5122)
LinkExtractor
现在也可以按预期处理具有逗号分隔的rel
属性值(包括nofollow
)的链接。(issue 5225)修复了在 feed 导出 参数解析期间可能引发的
TypeError
。(issue 5359)
文档¶
asyncio 支持 不再被视为实验性。(issue 5332)
使用最新的最佳实践重写了 使用无头浏览器。(issue 4484,issue 4613)
记录了 媒体管道中的本地文件命名。(issue 5069,issue 5152)
常见问题解答 现在涵盖了蜘蛛文件名称冲突问题。(issue 2680,issue 3669)
提供了更好的上下文和说明,以禁用
URLLENGTH_LIMIT
设置。(issue 5135,issue 5250)记录了 Reppy 解析器不支持 Python 3.9+。(issue 5226,issue 5231)
记录了 调度程序组件。(issue 3537,issue 3559)
记录了 媒体管道 用于 确定文件是否已过期 的方法。(issue 5120,issue 5254)
在同一进程中运行多个蜘蛛 现在包含了
scrapy.utils.project.get_project_settings()
的用法。(issue 5070)在同一进程中运行多个蜘蛛 现在涵盖了当您为某些在运行时无法更改的设置定义不同的每个蜘蛛值时会发生的情况。(issue 4485,issue 5352)
扩展了
StatsMailer
扩展的文档。(issue 5199,issue 5217)将
JOBDIR
添加到 设置 中。(issue 5173,issue 5224)记录了
Spider.attribute
。(issue 5174,issue 5244)将
body_length
参数添加到headers_received
信号的已记录签名中。(issue 5270)澄清了
SelectorList.get
在 教程 中的用法。(issue 5256)文档现在包含了具有多个导入路径的类的最短导入路径。(issue 2733,issue 5099)
quotes.toscrape.com
引用现在使用 HTTPS 而不是 HTTP。(issue 5395,issue 5396)在 获取帮助 中添加了指向 我们的 Discord 服务器 的链接。(issue 5421,issue 5422)
项目名称的发音现已正式确定为/ˈskreɪpaɪ/。(issue 5280,issue 5281)
在 README 中添加了 Scrapy 徽标。(issue 5255,issue 5258)
修复了一些问题并进行了一些小的改进。(issue 3155,issue 4335,issue 5074,issue 5098,issue 5134,issue 5180,issue 5194,issue 5239,issue 5266,issue 5271,issue 5273,issue 5274,issue 5276,issue 5347,issue 5356,issue 5414,issue 5415,issue 5416,issue 5419,issue 5420)
质量保证¶
添加了对 Python 3.10 的支持。(issue 5212,issue 5221,issue 5265)
通过
scrapy.utils.response.response_httprepr()
显著降低了内存使用量,该函数由默认启用的DownloaderStats
下载器中间件使用。(issue 4964,issue 4972)移除了对已弃用的
optparse
模块的使用。(issue 5366,issue 5374)扩展了类型提示。(issue 5077,issue 5090,issue 5100,issue 5108,issue 5171,issue 5215,issue 5334)
改进了测试,修复了 CI 问题,删除了未使用的代码。(issue 5094,issue 5157,issue 5162,issue 5198,issue 5207,issue 5208,issue 5229,issue 5298,issue 5299,issue 5310,issue 5316,issue 5333,issue 5388,issue 5389,issue 5400,issue 5401,issue 5404,issue 5405,issue 5407,issue 5410,issue 5412,issue 5425,issue 5427)
为贡献者实施了改进。(issue 5080,issue 5082,issue 5177,issue 5200)
实施了清理工作。(issue 5095,issue 5106,issue 5209,issue 5228,issue 5235,issue 5245,issue 5246,issue 5292,issue 5314,issue 5322)
Scrapy 2.5.1 (2021-10-05)¶
安全漏洞修复
如果您使用
HttpAuthMiddleware
(即http_user
和http_pass
爬虫属性)进行 HTTP 身份验证,任何请求都会将您的凭据暴露给请求目标。为了防止意外地将身份验证凭据暴露给意外的域名,您现在必须另外设置一个新的爬虫属性
http_auth_domain
,并将其指向必须发送身份验证凭据的特定域名。如果未设置
http_auth_domain
爬虫属性,则第一个请求的域名将被视为 HTTP 身份验证目标,并且仅在目标为该域名的请求中发送身份验证凭据。如果您需要将相同的 HTTP 身份验证凭据发送到多个域名,则可以使用
w3lib.http.basic_auth_header()
来设置请求的Authorization
标头的值。如果您 *确实* 希望您的爬虫将相同的 HTTP 身份验证凭据发送到任何域名,请将
http_auth_domain
爬虫属性设置为None
。最后,如果您是 scrapy-splash 的用户,请注意,此版本的 Scrapy 与 scrapy-splash 0.7.2 及更早版本不兼容。您需要将 scrapy-splash 升级到更高版本才能继续使用。
Scrapy 2.5.0 (2021-04-06)¶
亮点 (Highlights)
正式支持 Python 3.9
实验性的HTTP/2 支持
新的
get_retry_request()
函数,用于从爬虫回调中重试请求新的
headers_received
信号,允许提前停止下载新的
Response.protocol
属性
移除弃用功能¶
删除了所有在 1.7.0 中弃用 且尚未在 2.4.0 中移除 的代码。(issue 4901)
移除了对
SCRAPY_PICKLED_SETTINGS_TO_OVERRIDE
环境变量的支持,该变量在 1.8.0 中弃用。(issue 4912)
弃用功能¶
scrapy.utils.py36
模块现已弃用,建议使用scrapy.utils.asyncgen
。(issue 4900)
新功能¶
通过新的下载处理器实现实验性的HTTP/2 支持,该处理器可以在
DOWNLOAD_HANDLERS
设置中分配给https
协议。(issue 1854,issue 4769,issue 5058,issue 5059,issue 5066)新的
scrapy.downloadermiddlewares.retry.get_retry_request()
函数可用于爬虫回调或中间件,以处理超出RetryMiddleware
支持范围的请求重试。(issue 3590,issue 3685,issue 4902)新的
headers_received
信号可以提前访问响应头,并允许停止下载。(issue 1772,issue 4897)新的
Response.protocol
属性可以访问用于下载响应的协议字符串。(issue 4878)统计信息 现在包含以下条目,用于指示存储 Feed 的成功和失败次数。
feedexport/success_count/<storage type> feedexport/failed_count/<storage type>
其中
<storage type>
是 Feed 存储后端类名,例如FileFeedStorage
或FTPFeedStorage
。现在,
UrlLengthMiddleware
蜘蛛中间件使用INFO
日志级别 记录被忽略的 URL,而不是DEBUG
,并且现在将以下条目添加到 统计信息 中以跟踪被忽略的 URL 数量。urllength/request_ignored_count
现在,
HttpCompressionMiddleware
下载器中间件记录解压缩响应的数量和结果字节的总数。httpcompression/response_bytes httpcompression/response_count
错误修复¶
修复了在 PyPy 上安装时除了 PyPyDispatcher 之外还安装 PyDispatcher 的问题,这可能会阻止 Scrapy 工作,具体取决于哪个包被导入。(issue 4710,issue 4814)
在检查回调以检查它是否是一个也返回值的生成器时,如果回调的文档字符串的缩进小于后续代码,则不再引发异常。(issue 4477,issue 4935)
当使用默认的 HTTP/1.1 下载处理程序时(参见
DOWNLOAD_HANDLERS
),响应中的 Content-Length 标头不再被省略。(issue 5009,issue 5034,issue 5045,issue 5057,issue 5062)将请求元数据键
handle_httpstatus_all
设置为False
现在与根本不设置它具有相同的效果,而不是与将其设置为True
具有相同的效果。(issue 3851,issue 4694)
文档¶
添加了使用 pip 在 Windows 上 安装 Scrapy 的说明。(issue 4715,issue 4736)
日志记录文档现在包含了 其他过滤日志的方法。(issue 4216,issue 4257,issue 4965)
在 FAQ 中介绍了如何处理允许域的长列表。(issue 2263,issue 3667)
在 基准测试 中介绍了 scrapy-bench。(issue 4996,issue 5016)
阐明了每个爬虫会创建一个 扩展 实例。(issue 5014)
修复了一些示例中的错误。(issue 4829,issue 4830,issue 4907,issue 4909,issue 5008)
修复了一些外部链接、错别字等。(issue 4892,issue 4899,issue 4936,issue 4942,issue 5005,issue 5063)
现在 Request.meta 键列表 按字母顺序排序。(issue 5061,issue 5065)
更新了对 Scrapinghub 的引用,现在称为 Zyte。(issue 4973,issue 5072)
在 README 中添加了对贡献者的提及。(issue 4956)
减少了列表的上边距。(issue 4974)
质量保证¶
使 Python 3.9 支持正式化(issue 4757,issue 4759)
扩展类型提示(issue 4895)
修复了 Twisted API 的已弃用用法。(issue 4940,issue 4950,issue 5073)
使我们的测试能够使用新的 pip 解析器运行。(issue 4710,issue 4814)
添加测试以确保 协程支持 已得到测试。(issue 4987)
从 Travis CI 迁移到 GitHub Actions。(issue 4924)
修复了 CI 问题。(issue 4986,issue 5020,issue 5022,issue 5027,issue 5052,issue 5053)
实现了代码重构、样式修复和清理。(issue 4911,issue 4982,issue 5001,issue 5002,issue 5076)
Scrapy 2.4.1 (2020-11-17)¶
修复了 Feed 导出 的覆盖支持(issue 4845,issue 4857,issue 4859)
修复了 AsyncIO 事件循环处理,这可能会导致代码挂起(issue 4855,issue 4872)
修复了用于下载处理程序的 IPv6 兼容 DNS 解析器
CachingHostnameResolver
,该处理程序调用reactor.resolve
(issue 4802,issue 4803)修复了
genspider
命令的输出显示占位符而不是生成的蜘蛛模块的导入路径(issue 4874)将 Windows CI 从 Azure Pipelines 迁移到 GitHub Actions(issue 4869,issue 4876)
Scrapy 2.4.0 (2020-10-11)¶
亮点 (Highlights)
已放弃 Python 3.5 支持。
现在,媒体管道 的
file_path
方法可以访问源 Item。这允许您根据 Item 数据设置下载文件路径。
现在,
FEEDS
设置的新item_export_kwargs
键允许定义要传递给 Item 导出器类 的关键字参数。您现在可以选择 Feed 导出 是覆盖还是追加到输出文件。
如果安装了 zstandard,则现在支持 Zstd 压缩的响应。
在设置中,如果需要类的导入路径,现在可以传递类对象。
修改后的要求¶
现在需要 Python 3.6 或更高版本;已放弃对 Python 3.5 的支持。
结果
当使用 PyPy 时,现在需要 PyPy 7.2.0 或更高版本 is now required
对于 数据导出 或 媒体管道 中的 Amazon S3 存储支持,现在需要 botocore 1.4.87 或更高版本 botocore
(issue 4718,issue 4732,issue 4733,issue 4742,issue 4743,issue 4764)
向后不兼容的更改¶
CookiesMiddleware
再次丢弃在Request.headers
中定义的 Cookie。我们决定撤回在 Scrapy 2.2.0 中引入的此错误修复,因为据报道,当前的实现可能会破坏现有代码。
如果需要为请求设置 Cookie,请使用
Request.cookies
参数。Scrapy 的未来版本将包含此撤回的错误修复的新、更好的实现。
弃用移除¶
scrapy.extensions.feedexport.S3FeedStorage
在未将其传递给其__init__
方法时,不再读取运行项目设置中access_key
和secret_key
的值;您必须将这些参数传递给其__init__
方法或使用S3FeedStorage.from_crawler
(issue 4356,issue 4411,issue 4688)Rule.process_request
不再允许期望单个request
参数的可调用对象,而不是request
和response
两个参数 (issue 4818)
弃用¶
在自定义 媒体管道 中,在 现在支持此参数 的任何方法中,不接受关键字限定的
item
参数的签名现在已弃用 (issue 4628,issue 4686)在自定义 数据存储后端类 中,不接受关键字限定的
feed_options
参数的__init__
方法签名现在已弃用 (issue 547,issue 716,issue 4512)scrapy.utils.python.WeakKeyCache
类现在已弃用 (issue 4684,issue 4701)scrapy.utils.boto.is_botocore()
函数现在已弃用,请改用scrapy.utils.boto.is_botocore_available()
(issue 4734,issue 4776)
新特性¶
媒体管道 的以下方法现在接受一个
item
关键字限定参数,其中包含源 项目在
scrapy.pipelines.files.FilesPipeline
file_downloaded()
media_downloaded()
media_to_download()
在
scrapy.pipelines.images.ImagesPipeline
file_downloaded()
get_images()
image_downloaded()
media_downloaded()
media_to_download()
FEEDS
设置的新item_export_kwargs
键允许定义关键字参数以传递给 项目导出器类 (issue 4606,issue 4768)数据导出 获得了覆盖支持
如果安装了 zstandard,现在支持 Zstd 压缩响应 (issue 4831)
在设置中,如果需要类的导入路径,现在可以传递类对象 (issue 3870,issue 3873)。
这还包括其值的一部分由导入路径组成的设置,例如
DOWNLOADER_MIDDLEWARES
或DOWNLOAD_HANDLERS
。下载中间件 现在可以覆盖
response.request
。如果 下载中间件 从
process_response()
或process_exception()
返回Response
对象,并将其自定义Request
对象分配给response.request
现在,该自定义的
Request
对象作为request
参数发送到response_received
信号,而不是原来的Request
对象。
当使用 FTP 馈送存储后端 时
现在可以将新的
overwrite
馈送选项 设置为False
,以追加到现有文件而不是覆盖它。如果不需要,现在可以省略 FTP 密码。
CsvItemExporter
的__init__
方法现在支持errors
参数来指示如何处理编码错误(issue 4755)。当 使用 asyncio 时,现在可以 设置自定义 asyncio 循环(issue 4306,issue 4414)。
序列化请求(参见 作业:暂停和恢复爬取)现在支持作为蜘蛛方法的回调,这些回调委托给其他可调用对象(issue 4756)。
当响应大于
DOWNLOAD_MAXSIZE
时,记录的消息现在是警告,而不是错误(issue 3874,issue 3886,issue 4752)。
错误修复¶
genspider
命令不再覆盖现有文件,除非使用--force
选项(issue 4561,issue 4616,issue 4623)。具有空值的 Cookie 不再被视为无效 Cookie(issue 4772)。
runspider
命令现在支持具有.pyw
文件扩展名的文件(issue 4643,issue 4646)。HttpProxyMiddleware
中间件现在只需忽略不受支持的代理值(issue 3331,issue 4778)。对具有
return
语句的生成器回调的检查不再警告嵌套函数中的return
语句(issue 4720,issue 4721)。系统文件模式创建掩码不再影响使用
startproject
命令生成的文件的权限(issue 4722)。scrapy.utils.iterators.xmliter()
现在支持命名空间节点名称(issue 861,issue 4746)。Request
对象现在可以具有about:
URL,这在使用无头浏览器时可以工作(issue 4835)。
文档¶
FEED_URI_PARAMS
设置现在已记录在案(issue 4671,issue 4724)。改进了 链接提取器 的文档,其中包含来自蜘蛛回调的用法示例以及
Link
类的参考文档(issue 4751,issue 4775)。阐明了在使用
CloseSpider
扩展时CONCURRENT_REQUESTS
的影响(issue 4836)。删除了对 Python 2 的
unicode
类型的引用(issue 4547,issue 4703)。我们现在有了一个 正式的弃用策略(issue 4705)。
我们的 文档策略 现在涵盖了 Sphinx 的
versionadded
和versionchanged
指令的使用,并且我们已删除了引用 Scrapy 1.4.0 及更早版本的用法(issue 3971,issue 4310)。其他文档清理(issue 4090,issue 4782,issue 4800,issue 4801,issue 4809,issue 4816,issue 4825)。
质量保证¶
扩展类型提示(issue 4243,issue 4691)。
为
check
命令添加了测试(issue 4663)。修复了 Debian 上的测试失败问题(issue 4726,issue 4727,issue 4735)。
改进了 Windows 测试覆盖率(issue 4723)。
尽可能地切换到 格式化字符串字面量(issue 4307,issue 4324,issue 4672)。
现代化了
super()
的用法(issue 4707)。其他代码和测试清理(issue 1790,issue 3288,issue 4165,issue 4564,issue 4651,issue 4714,issue 4738,issue 4745,issue 4747,issue 4761,issue 4765,issue 4804,issue 4817,issue 4820,issue 4822,issue 4839)。
Scrapy 2.3.0 (2020-08-04)¶
亮点 (Highlights)
馈送导出 现在支持 Google Cloud Storage 作为存储后端。
新的
FEED_EXPORT_BATCH_ITEM_COUNT
设置允许以最多指定数量的项目的批次交付输出项目。它也作为 延迟文件交付 的解决方法,当使用某些存储后端(S3、FTP,以及现在的 GCS)时,它会导致 Scrapy 仅在爬取完成后才开始项目交付。
Item Loader 的基础实现已移动到一个单独的库中,itemloaders,允许从 Scrapy 外部使用,并拥有独立的发布计划。
弃用移除¶
从
scrapy.linkextractors
中删除了以下类及其父模块htmlparser.HtmlParserLinkExtractor
regex.RegexLinkExtractor
sgml.BaseSgmlLinkExtractor
sgml.SgmlLinkExtractor
弃用¶
scrapy.utils.python.retry_on_eintr
函数现已弃用(issue 4683)
新功能¶
新的
FEED_EXPORT_BATCH_ITEM_COUNT
设置用于批量交付(issue 4250,issue 4434)parse
命令现在允许指定输出文件(issue 4317,issue 4377)Request.from_curl
和curl_to_request_kwargs()
现在也支持--data-raw
(issue 4612)现在可以在内置蜘蛛子类(例如
CrawlSpider
)中使用parse
回调(issue 712,issue 732,issue 781,issue 4254)
错误修复¶
修复了 CSV 导出 中 dataclass 项目 和 attr.s 项目 的问题(issue 4667,issue 4668)
Request.from_curl
和curl_to_request_kwargs()
现在在指定请求体但未指定请求方法时将请求方法设置为POST
(issue 4612)在 Windows 10.0.14393 及更高版本中启用了 ANSI 转义序列的处理,在这些版本中,彩色输出需要此功能(issue 4393,issue 4403)
文档¶
更新了文档中关于
DOWNLOADER_CLIENT_TLS_CIPHERS
设置的 OpenSSL 密钥列表格式 链接(issue 4653)简化了 使用 dataclass 项目 中的代码示例(issue 4652)
质量保证¶
Item Loader 的基础实现已移动到 itemloaders(issue 4005,issue 4516)
修复了一些调度程序测试中静默的错误(issue 4644,issue 4645)
更新了用于 SSL 测试的本地主机证书(issue 4650)
删除了特定于 Python 2 的 Cookie 处理代码(issue 4682)
停止使用 Python 2 的 Unicode 字面量语法(issue 4704)
停止使用反斜杠进行续行(issue 4673)
从 MyPy 异常列表中删除了不需要的条目(issue 4690)
自动化测试现在作为我们持续集成系统的一部分在 Windows 上通过(issue 4458)
自动化测试现在在我们的持续集成系统中针对受支持的 Python 版本的最新 PyPy 版本通过(issue 4504)
Scrapy 2.2.1 (2020-07-17)¶
startproject
命令不再对目标文件夹中的文件权限进行意外更改,例如删除执行权限(issue 4662,issue 4666)
Scrapy 2.2.0 (2020-06-24)¶
亮点 (Highlights)
现在需要 Python 3.5.2+
dataclass 对象 和 attrs 对象 现在是有效的 项目类型
新的
TextResponse.json
方法新的
bytes_received
信号,允许取消响应下载
向后不兼容的更改¶
已停止支持 Python 3.5.0 和 3.5.1;Scrapy 现在拒绝在低于 3.5.2 的 Python 版本上运行,因为 3.5.2 引入了
typing.Type
(issue 4615)
弃用¶
TextResponse.body_as_unicode
现已弃用,请改用TextResponse.text
(issue 4546,issue 4555,issue 4579)scrapy.item.BaseItem
现已弃用,请改用scrapy.item.Item
(issue 4534)
新功能¶
dataclass 对象 和 attrs 对象 现在是有效的 项目类型,并且新的 itemadapter 库使得编写支持任何项目类型的代码变得容易(issue 2749,issue 2807,issue 3761,issue 3881,issue 4642)
新的
TextResponse.json
方法允许反序列化 JSON 响应(issue 2444,issue 4460,issue 4574)新的
bytes_received
信号允许监控响应下载进度和 停止下载(issue 4205,issue 4559)在媒体管道的结果列表中的字典现在包含一个新的键
status
,它指示文件是否已下载,或者如果文件未下载,则指示未下载的原因;有关更多信息,请参阅FilesPipeline.get_media_requests
(issue 2893,issue 4486)。当使用Google Cloud Storage作为媒体管道时,如果配置的凭据未授予所需的权限,则现在会记录警告(issue 4346,issue 4508)。
链接提取器现在是可序列化的,只要您不使用lambda 表达式作为参数;例如,您现在可以在
Request.cb_kwargs
或Request.meta
中传递链接提取器,以便在持久化计划请求时使用(issue 4554)。将 Scrapy 使用的pickle 协议从协议 2 升级到协议 4,从而提高了序列化能力和性能(issue 4135,issue 4541)。
scrapy.utils.misc.create_instance()
现在如果生成的实例为None
,则会引发TypeError
异常(issue 4528,issue 4532)。
错误修复¶
CookiesMiddleware
不再丢弃在Request.headers
中定义的 Cookie(issue 1992,issue 2400)。CookiesMiddleware
不再重新编码在Request
的__init__
方法的cookies
参数中定义为bytes
类型的 Cookie(issue 2400,issue 3575)。当
FEEDS
定义多个 URI,FEED_STORE_EMPTY
为False
并且爬取未产生任何项目时,Scrapy 不会再在第一个 URI 之后停止 Feed 导出(issue 4621,issue 4626)。Spider
回调使用协程语法定义时,不再需要返回可迭代对象,而是可以返回Request
对象、item或None
(issue 4609)。startproject
命令现在确保生成的项目文件夹和文件具有正确的权限(issue 4604)。修复了
scrapy.utils.datatypes.LocalWeakReferencedCache
有时引发的KeyError
异常(issue 4597,issue 4599)。当
FEEDS
定义多个 URI 时,关于存储项目的日志消息现在包含来自相应 Feed 的信息,而不是始终只包含来自其中一个 Feed 的信息(issue 4619,issue 4629)。
文档¶
添加了一个关于从 errbacks 访问 cb_kwargs的新章节(issue 4598,issue 4634)。
从协程中删除了关于 API 为实验性的警告(issue 4511,issue 4513)。
删除了对Twisted不支持版本的引用(issue 4533)。
更新了截图管道示例的描述,该示例现在使用协程语法而不是返回
Deferred
(issue 4514,issue 4593)。从
scrapy.utils.log.configure_logging()
代码示例中删除了一行误导性的导入行(issue 4510,issue 4587)。内部文档引用的悬停显示行为现在还涵盖了指向命令、
Request.meta
键、设置和信号的链接(issue 4495,issue 4563)。现在可以再次下载文档以供离线阅读(issue 4578,issue 4585)。
删除了一些函数和方法签名中
*args
和**kwargs
之前的反斜杠(issue 4592,issue 4596)。
质量保证¶
进一步调整了代码库以符合我们的样式指南(issue 4237,issue 4525,issue 4538,issue 4539,issue 4540,issue 4542,issue 4543,issue 4544,issue 4545,issue 4557,issue 4558,issue 4566,issue 4568,issue 4572)。
删除了 Python 2 支持的残留部分(issue 4550,issue 4553,issue 4568)。
改进了
crawl
和runspider
命令之间的代码共享 (issue 4548, issue 4552)将
chain(*iterable)
替换为chain.from_iterable(iterable)
(issue 4635)现在可以在任何 Python 版本上使用 Tox 运行
asyncio
测试 (issue 4521)更新了测试需求,以反映与 pytest 5.4 和 5.4.1 的不兼容性 (issue 4588)
改进了
SpiderLoader
的测试覆盖率,以涵盖涉及重复蜘蛛名称的场景 (issue 4549, issue 4560)配置 Travis CI 以使用 Python 3.5.2 运行测试 (issue 4518, issue 4615)
在 Travis CI 中添加了一个 Pylint 任务 (issue 3727)
在 Travis CI 中添加了一个 Mypy 任务 (issue 4637)
在测试中使用了集合字面量 (issue 4573)
清理了 Travis CI 配置 (issue 4517, issue 4519, issue 4522, issue 4537)
Scrapy 2.1.0 (2020-04-24)¶
亮点 (Highlights)
新的
FEEDS
设置,用于导出到多个 Feed新的
Response.ip_address
属性
向后不兼容的更改¶
由 assert 语句触发的
AssertionError
异常已被新的异常类型替换,以支持在优化模式下运行 Python(参见-O
),而不会以任何意外的方式更改 Scrapy 的行为。如果您的代码捕获了来自 Scrapy 的
AssertionError
异常,请更新您的代码以捕获相应的新的异常。
弃用移除¶
LOG_UNSERIALIZABLE_REQUESTS
设置已不再支持,请改用SCHEDULER_DEBUG
(issue 4385)REDIRECT_MAX_METAREFRESH_DELAY
设置已不再支持,请改用METAREFRESH_MAXDELAY
(issue 4385)ChunkedTransferMiddleware
中间件已移除,包括整个scrapy.downloadermiddlewares.chunked
模块;分块传输现在开箱即用 (issue 4431)spiders
属性已从Crawler
中移除,请改用CrawlerRunner.spider_loader
或使用您的设置实例化SPIDER_LOADER_CLASS
(issue 4398)MultiValueDict
、MultiValueDictKeyError
和SiteNode
类已从scrapy.utils.datatypes
中移除 (issue 4400)
弃用¶
FEED_FORMAT
和FEED_URI
设置已被弃用,请改用新的FEEDS
设置 (issue 1336, issue 3858, issue 4507)
新特性¶
一个新的设置
FEEDS
允许配置多个输出 Feed,每个 Feed 都有不同的设置 (issue 1336, issue 3858, issue 4507)crawl
和runspider
命令现在支持多个-o
参数 (issue 1336, issue 3858, issue 4507)crawl
和runspider
命令现在支持通过在输出文件后附加:<format>
来指定输出格式 (issue 1336, issue 3858, issue 4507)新的
Response.ip_address
属性允许访问生成响应的 IP 地址 (issue 3903, issue 3940)当
allowed_domains
中的值包含端口时,现在会发出警告 (issue 50, issue 3198, issue 4413)Zsh 自动补全现在从补全列表中排除了已使用的选项别名 (issue 4438)
错误修复¶
请求序列化 对于作为蜘蛛属性并被分配了不同名称的函数的回调不再中断 (issue 4500)
allowed_domains
中的None
值不再导致TypeError
异常 (issue 4410)Zsh 自动补全不再允许在参数后使用选项 (issue 4438)
现在支持 zope.interface 5.0.0 及更高版本 (issue 4447, issue 4448)
Scrapy 1.4.0 中已弃用的
Spider.make_requests_from_url
现在在使用时会发出警告 (issue 4412)
文档¶
改进了有关允许其处理程序返回
Deferred
的信号的文档 (issue 4295, issue 4390)我们的 PyPI 条目现在包含了我们文档、源代码存储库和问题跟踪器的链接 (issue 4456)
在文档中介绍了 curl2scrapy 服务 (issue 4206, issue 4455)
删除了对 Guppy 库的引用,该库仅在 Python 2 中有效 (issue 4285, issue 4343)
扩展了 InterSphinx 的使用,以链接到 Python 3 文档 (issue 4444, issue 4445)
增加了对 Sphinx 3.0 及更高版本的支持(issue 4475,issue 4480,issue 4496,issue 4503)
质量保证¶
删除了关于使用旧的、已删除的设置的警告(issue 4404)
删除了关于从 Twisted 19.7.0 或更高版本中的
twisted.test.proto_helpers
导入StringTransport
的警告(issue 4409)删除了过时的 Debian 包构建文件(issue 4384)
删除了使用
object
作为基类的代码(issue 4430)删除了添加对我们不再支持的旧版 Twisted 版本支持的代码(issue 4472)
修复了代码风格问题(issue 4468,issue 4469,issue 4471,issue 4481)
删除了
twisted.internet.defer.returnValue()
调用(issue 4443,issue 4446,issue 4489)
Scrapy 2.0.1 (2020-03-18)¶
Response.follow_all
现在支持空 URL 可迭代对象作为输入(issue 4408,issue 4420)删除了顶层
reactor
导入,以防止在使用TWISTED_REACTOR
设置不同的 Twisted reactor 时出现关于安装了错误的 Twisted reactor 的错误(issue 4401,issue 4406)修复了测试(issue 4422)
Scrapy 2.0.0 (2020-03-03)¶
亮点 (Highlights)
已删除 Python 2 支持
新的
Response.follow_all
方法FTP 支持 用于媒体管道
新的
Response.certificate
属性通过
DNS_RESOLVER
支持 IPv6
向后不兼容的更改¶
已删除 Python 2 支持,遵循 2020 年 1 月 1 日的 Python 2 终止支持(issue 4091,issue 4114,issue 4115,issue 4121,issue 4138,issue 4231,issue 4242,issue 4304,issue 4309,issue 4373)
重试放弃(请参阅
RETRY_TIMES
)现在记录为错误,而不是调试信息(issue 3171,issue 3566)LinkExtractor
默认忽略的文件扩展名现在还包括7z
、7zip
、apk
、bz2
、cdr
、dmg
、ico
、iso
、tar
、tar.gz
、webm
和xz
(issue 1837,issue 2067,issue 4066)METAREFRESH_IGNORE_TAGS
设置现在默认为空列表,遵循 Web 浏览器行为(issue 3844,issue 4311)HttpCompressionMiddleware
现在在其设置的Accept-Encoding
标头的值中包含逗号后的空格,遵循 Web 浏览器行为(issue 4293)自定义下载处理程序(请参阅
DOWNLOAD_HANDLERS
)或以下下载处理程序的子类的__init__
方法不再接收settings
参数scrapy.core.downloader.handlers.datauri.DataURIDownloadHandler
scrapy.core.downloader.handlers.file.FileDownloadHandler
使用
from_settings
或from_crawler
类方法向您的自定义下载处理程序公开此类参数。我们重构了
scrapy.core.scheduler.Scheduler
类和相关的队列类(请参阅SCHEDULER_PRIORITY_QUEUE
、SCHEDULER_DISK_QUEUE
和SCHEDULER_MEMORY_QUEUE
),以便于实现自定义调度程序队列类。有关详细信息,请参阅下面的 调度程序队列类的更改。现在以不同的格式记录覆盖的设置。这更符合启动时记录的类似信息(issue 4199)
弃用移除¶
Scrapy shell 不再提供 sel 代理对象,请改用
response.selector
(issue 4347)已删除 LevelDB 支持(issue 4112)
已从
scrapy.utils.python
中删除了以下函数:isbinarytext
、is_writable
、setattr_default
、stringify_dict
(issue 4362)
弃用¶
使用以
SCRAPY_
为前缀的环境变量来覆盖设置已弃用(issue 4300,issue 4374,issue 4375)scrapy.linkextractors.FilteringLinkExtractor
已弃用,请改用scrapy.linkextractors.LinkExtractor
(issue 4045)代理 URL 的
noconnect
查询字符串参数已弃用,应从代理 URL 中删除(issue 4198)scrapy.utils.python.MutableChain
的next
方法已弃用,请使用全局的next()
函数或MutableChain.__next__
代替 (issue 4153)
新功能¶
增加了对 Python 的 协程语法 的 部分支持,以及对
asyncio
和基于asyncio
的库的 实验性支持 (issue 4010, issue 4259, issue 4269, issue 4270, issue 4271, issue 4316, issue 4318)新的
Response.follow_all
方法提供了与Response.follow
相同的功能,但支持可迭代的 URL 作为输入并返回可迭代的请求 (issue 2582, issue 4057, issue 4286)媒体管道 现在支持 FTP 存储 (issue 3928, issue 3961)
新的
Response.certificate
属性将服务器的 SSL 证书作为twisted.internet.ssl.Certificate
对象公开,用于 HTTPS 响应 (issue 2726, issue 4054)新的
DNS_RESOLVER
设置允许启用 IPv6 支持 (issue 1031, issue 4227)新的
SCRAPER_SLOT_MAX_ACTIVE_SIZE
设置允许配置现有的软限制,当正在处理的响应数据总量过高时,该限制会暂停请求下载 (issue 1410, issue 3551)新的
TWISTED_REACTOR
设置允许自定义 Scrapy 使用的reactor
,从而 启用 asyncio 支持 或处理 常见的 macOS 问题 (issue 2905, issue 4294)调度程序的磁盘和内存队列现在可以使用类方法
from_crawler
或from_settings
(issue 3884)新的
Response.cb_kwargs
属性作为Response.request.cb_kwargs
的快捷方式 (issue 4331)Response.follow
现在支持flags
参数,以保持与Request
的一致性 (issue 4277, issue 4279)Item 加载器处理器 现在可以是普通函数,不再需要是方法 (issue 3899)
Rule
现在接受errback
参数 (issue 4000)Request
当指定errback
参数时,不再需要callback
参数 (issue 3586, issue 4008)LogFormatter
现在支持一些额外的方法download_error
用于下载错误item_error
用于 Item 管道 在处理 Item 期间引发的异常spider_error
用于从 Spider 回调 引发的异常
FEED_URI
设置现在支持pathlib.Path
值 (issue 3731, issue 4074)新的
request_left_downloader
信号在请求离开下载器时发送 (issue 4303)当 Scrapy 检测到请求回调或错误回调使用
yield
但也返回值时,它会记录警告,因为返回值将丢失 (issue 3484, issue 3869)Spider
对象现在如果既没有start_urls
属性也没有重新实现start_requests
,但有start_url
属性,则会引发AttributeError
异常 (issue 4133, issue 4170)BaseItemExporter
子类现在可以使用super().__init__(**kwargs)
代替self._configure(kwargs)
在它们的__init__
方法中,如果需要,将dont_fail=True
传递给父__init__
方法,并在调用父__init__
方法后在self._kwargs
访问kwargs
(issue 4193, issue 4370)scrapy.utils.request.request_fingerprint
的新keep_fragments
参数允许为 URL 中具有不同片段的请求生成不同的指纹 (issue 4104)下载处理器(参见
DOWNLOAD_HANDLERS
)现在可以使用from_settings
和from_crawler
类方法,其他 Scrapy 组件已经支持这些方法 (issue 4126)scrapy.utils.python.MutableChain.__iter__
现在返回self
,允许将其用作序列(issue 4153)
错误修复¶
crawl
命令现在在爬取开始前发生异常时也会退出并返回退出代码 1(issue 4175,issue 4207)LinkExtractor.extract_links
不再将来自非 UTF-8 响应的查询字符串或 URL 重新编码为 UTF-8(issue 998,issue 1403,issue 1949,issue 4321)第一个 Spider 中间件(参见
SPIDER_MIDDLEWARES
)现在也处理来自生成器回调引发的异常(issue 4260,issue 4272)现在支持重定向到以三个斜杠(
///
)开头的 URL(issue 4032,issue 4042)Request
不再仅仅因为字符串包含冒号就接受字符串作为url
(issue 2552,issue 4094)现在在
MailSender
中使用正确的编码来表示附件名称(issue 4229,issue 4239)RFPDupeFilter
(默认的DUPEFILTER_CLASS
)不再在 Windows 上的每一行写入额外的\r
字符,这使得requests.seen
文件在该平台上的大小不必要地变大(issue 4283)Z shell 自动补全现在查找
.html
文件,而不是.http
文件,并且涵盖了-h
命令行开关(issue 4122,issue 4291)在未定义
limit
的情况下向scrapy.utils.datatypes.LocalCache
对象添加项不再引发TypeError
异常(issue 4123)修复了当
scrapy.utils.misc.create_instance()
将settings
和crawler
都设置为None
时引发的ValueError
异常消息中的拼写错误(issue 4128)
文档¶
API 文档现在链接到相应的源代码的在线语法高亮视图(issue 4148)
现在,指向不存在的文档页面的链接允许访问侧边栏(issue 4152,issue 4169)
我们文档中的交叉引用现在在悬停时显示工具提示(issue 4173,issue 4183)
改进了关于
LinkExtractor.extract_links
的文档,并简化了 链接提取器(issue 4045)阐明了
ItemLoader.item
的工作原理(issue 3574,issue 4099)阐明了在也使用
CrawlerProcess
时不应使用logging.basicConfig()
(issue 2149,issue 2352,issue 3146,issue 3960)阐明了
Request
对象在使用持久化时的要求(issue 4124,issue 4139)阐明了如何安装 自定义图片管道(issue 4034,issue 4252)
修复了 媒体管道 示例中
file_path
方法的签名(issue 4290)涵盖了 Scrapy 1.7.0 中影响自定义
scrapy.core.scheduler.Scheduler
子类的向后不兼容更改(issue 4274)改进了
README.rst
和CODE_OF_CONDUCT.md
文件(issue 4059)文档示例现在作为我们测试套件的一部分进行检查,我们已经修复了一些检测到的问题(issue 4142,issue 4146,issue 4171,issue 4184,issue 4190)
修复了逻辑问题、断开的链接和拼写错误(issue 4247,issue 4258,issue 4282,issue 4288,issue 4305,issue 4308,issue 4323,issue 4338,issue 4359,issue 4361)
改进了引用对象
__init__
方法时的前后一致性(issue 4086,issue 4088)修复了 Scrapy 概览 中代码和输出之间不一致的问题(issue 4213)
扩展了
intersphinx
的使用(issue 4147,issue 4172,issue 4185,issue 4194,issue 4197)我们现在使用最新版本的 Python 来构建文档(issue 4140,issue 4249)
清理了文档(issue 4143,issue 4275)
质量保证¶
重新启用了代理
CONNECT
测试(issue 2545,issue 4114)在我们的测试套件中添加了 Bandit 安全检查(issue 4162,issue 4181)
在我们的测试套件中添加了 Flake8 样式检查,并应用了许多相应的更改(issue 3944,issue 3945,issue 4137,issue 4157,issue 4167,issue 4174,issue 4186,issue 4195,issue 4238,issue 4246,issue 4355,issue 4360,issue 4365)
改进了测试覆盖率(issue 4097,issue 4218,issue 4236)
开始报告最慢的测试,并提高了其中一些测试的性能(issue 4163,issue 4164)
修复了损坏的测试并重构了一些测试(issue 4014,issue 4095,issue 4244,issue 4268,issue 4372)
修改了tox配置以允许使用任何 Python 版本运行测试,默认运行Bandit和Flake8测试,并以编程方式强制执行最低 tox 版本(issue 4179)
清理了代码(issue 3937,issue 4208,issue 4209,issue 4210,issue 4212,issue 4369,issue 4376,issue 4378)
调度程序队列类的更改¶
以下更改可能会影响所有类型的自定义队列类
push
方法不再接收包含request.priority * -1
的第二个位置参数。如果您需要该值,请改为从第一个位置参数request
中获取,或者使用scrapy.core.scheduler.ScrapyPriorityQueue
子类中的新priority()
方法。
以下更改可能会影响自定义优先级队列类
在
__init__
方法或from_crawler
或from_settings
类方法中以前包含工厂函数
qfactory
的参数现在作为名为downstream_queue_cls
的关键字参数传递。添加了一个新的关键字参数:
key
。它是一个字符串,对于内存队列始终为空字符串,并且指示磁盘队列的JOB_DIR
值。磁盘队列的参数,其中包含来自先前爬取的数据,
startprios
或slot_startprios
,现在作为名为startprios
的关键字参数传递。serialize
参数不再传递。磁盘队列类必须在写入磁盘之前自行处理请求序列化,使用scrapy.utils.reqser
模块中的request_to_dict()
和request_from_dict()
函数。
以下更改可能会影响自定义磁盘和内存队列类
__init__
方法的签名现在为__init__(self, crawler, key)
。
以下更改专门影响scrapy.core.scheduler
中的ScrapyPriorityQueue
和DownloaderAwarePriorityQueue
类,并且可能会影响子类
在
__init__
方法中,上面描述的大多数更改都适用。__init__
可能仍然接收所有参数作为位置参数,但是替换
qfactory
的downstream_queue_cls
必须以不同的方式实例化。qfactory
是用优先级值(整数)实例化的。downstream_queue_cls
的实例应该使用新的ScrapyPriorityQueue.qfactory
或DownloaderAwarePriorityQueue.pqfactory
方法创建。新的
key
参数将startprios
参数向右移动了1个位置。
添加了以下类属性
crawler
downstream_queue_cls
(以上详细信息)key
(以上详细信息)
serialize
属性已被删除(以上详细信息)
以下更改专门影响ScrapyPriorityQueue
类,并且可能会影响子类
添加了一个新的
priority()
方法,该方法在给定请求的情况下返回request.priority * -1
。它在
push()
中使用,以弥补其priority
参数的移除。spider
属性已被删除。请改用crawler.spider
。
以下更改专门影响DownloaderAwarePriorityQueue
类,并且可能会影响子类
新的
pqueues
属性提供了下载器插槽名称到相应downstream_queue_cls
实例的映射。
Scrapy 1.8.4 (2024-02-14)¶
安全漏洞修复 (Security bug fixes)
由于其ReDoS 漏洞,
scrapy.utils.iterators.xmliter
现在已弃用,取而代之的是xmliter_lxml()
,XMLFeedSpider
现在使用它。为了最大程度地减少此更改对现有代码的影响,
xmliter_lxml()
现在支持在节点名称中将节点命名空间指示为前缀,以及在使用 libxml2 2.7+ 时处理具有高度嵌套树的大文件。更多信息,请参阅 cc65-xxvf-f7r9 安全公告。
DOWNLOAD_MAXSIZE
和DOWNLOAD_WARNSIZE
现在也适用于解压缩后的响应主体。更多信息,请参阅 7j7m-v7m3-jqm7 安全公告。同样,与7j7m-v7m3-jqm7 安全公告相关,不建议使用
scrapy.downloadermiddlewares.decompression
模块,并且会触发警告。现在,重定向到不同域名时会丢弃
Authorization
标头。更多信息,请参阅 cw9j-q3vf-hrrv 安全公告。
Scrapy 1.8.3 (2022-07-25)¶
安全漏洞修复
当
HttpProxyMiddleware
处理带有proxy
元数据的请求,并且该proxy
元数据包含代理凭据时,HttpProxyMiddleware
会设置Proxy-Authorization
header,但仅当该 header 未设置时。有一些第三方代理轮换下载中间件,会在每次处理请求时设置不同的
proxy
元数据。由于请求重试和重定向,同一个请求可能会被下载中间件处理多次,包括
HttpProxyMiddleware
和任何第三方代理轮换下载中间件。这些第三方代理轮换下载中间件可能会将请求的
proxy
元数据更改为一个新值,但未能从proxy
元数据的先前值中删除Proxy-Authorization
头,从而导致一个代理的凭据被发送到另一个代理。为了防止意外泄露代理凭据,
HttpProxyMiddleware
在处理请求时的行为现在如下所示如果正在处理的请求定义了包含凭据的
proxy
元数据,则Proxy-Authorization
头将始终更新为包含这些凭据。如果正在处理的请求定义了不包含凭据的
proxy
元数据,则Proxy-Authorization
头将被删除,*除非*它最初是为同一个代理 URL 定义的。要删除代理凭据同时保留相同的代理 URL,请删除
Proxy-Authorization
头。如果请求没有
proxy
元数据,或者该元数据是假值(例如None
),则Proxy-Authorization
头将被删除。现在无法再通过
proxy
元数据设置代理 URL,但通过Proxy-Authorization
头设置凭据。请改为通过proxy
元数据设置代理凭据。
Scrapy 1.8.2 (2022-03-01)¶
安全漏洞修复 (Security bug fixes)
当定义了 Cookie 的
Request
对象收到重定向响应,导致计划创建新的Request
对象时,原始Request
对象中定义的 Cookie 将不再复制到新的Request
对象中。如果您在
Request
对象上手动设置了Cookie
头,并且重定向 URL 的域名与原始Request
对象的 URL 域名不完全匹配,则您的Cookie
头现在将从新的Request
对象中删除。旧的行为可能被攻击者利用来访问您的 Cookie。请参阅cjvr-mfj7-j4j8 安全公告以获取更多信息。
注意
仍然可以通过在定义 Cookie 时将共享的域名后缀(例如
example.com
)定义为 Cookie 域名来启用不同域名之间共享 Cookie 的功能(例如example.com
和任何子域名)。请参阅Request
类的文档以获取更多信息。当 Cookie 的域名(在响应的
Set-Cookie
头中接收或在Request
对象中定义)设置为公共后缀时,现在将忽略该 Cookie,除非 Cookie 域名与请求域名相同。旧的行为可能被攻击者利用,将 cookie 注入到您对其他域的一些请求中。请参阅mfjm-vh54-3f96 安全公告以获取更多信息。
Scrapy 1.8.1 (2021-10-05)¶
安全漏洞修复
如果您使用
HttpAuthMiddleware
(即http_user
和http_pass
爬虫属性)进行 HTTP 身份验证,任何请求都会将您的凭据暴露给请求目标。为了防止意外地将身份验证凭据暴露给意外的域名,您现在必须另外设置一个新的爬虫属性
http_auth_domain
,并将其指向必须发送身份验证凭据的特定域名。如果未设置
http_auth_domain
爬虫属性,则第一个请求的域名将被视为 HTTP 身份验证目标,并且仅在目标为该域名的请求中发送身份验证凭据。如果您需要将相同的 HTTP 身份验证凭据发送到多个域名,则可以使用
w3lib.http.basic_auth_header()
来设置请求的Authorization
标头的值。如果您 *确实* 希望您的爬虫将相同的 HTTP 身份验证凭据发送到任何域名,请将
http_auth_domain
爬虫属性设置为None
。最后,如果您是 scrapy-splash 的用户,请注意,此版本的 Scrapy 与 scrapy-splash 0.7.2 及更早版本不兼容。您需要将 scrapy-splash 升级到更高版本才能继续使用。
Scrapy 1.8.0 (2019-10-28)¶
亮点 (Highlights)
放弃了 Python 3.4 支持并更新了最低要求;使 Python 3.8 支持正式化
新的
Request.from_curl
类方法新的
DOWNLOADER_CLIENT_TLS_CIPHERS
和DOWNLOADER_CLIENT_TLS_VERBOSE_LOGGING
设置
向后不兼容的更改¶
不再支持 Python 3.4,并且 Scrapy 的一些最低要求也已更改
cssselect 0.9.1
cryptography 2.0
lxml 3.5.0
pyOpenSSL 16.2.0
queuelib 1.4.2
service_identity 16.0.0
six 1.10.0
Twisted 17.9.0(Python 2 使用 16.0.0)
zope.interface 4.1.3
JSONRequest
现在称为JsonRequest
,以与类似类保持一致(issue 3929,issue 3982)如果您正在使用自定义上下文工厂(
DOWNLOADER_CLIENTCONTEXTFACTORY
),则其__init__
方法必须接受两个新参数:tls_verbose_logging
和tls_ciphers
(issue 2111,issue 3392,issue 3442,issue 3450)ItemLoader
现在将其输入项目的value转换为列表>>> item = MyItem() >>> item["field"] = "value1" >>> loader = ItemLoader(item=item) >>> item["field"] ['value1']
这需要允许向现有字段添加值(
loader.add_value('field', 'value2')
)。(issue 3804,issue 3819,issue 3897,issue 3976,issue 3998,issue 4036)
另请参阅下面弃用移除。
新特性¶
一个新的
Request.from_curl
类方法允许从 cURL 命令创建请求(issue 2985,issue 3862)一个新的
ROBOTSTXT_PARSER
设置允许选择要使用的robots.txt 解析器。它包括对RobotFileParser、Protego(默认)、Reppy 和Robotexclusionrulesparser的内置支持,并允许您实现对其他解析器的支持(issue 754,issue 2669,issue 3796,issue 3935,issue 3969,issue 4006)一个新的
ROBOTSTXT_USER_AGENT
设置允许定义一个单独的用户代理字符串,用于robots.txt 解析(issue 3931,issue 3966)Rule
不再需要LinkExtractor
参数(issue 781,issue 4016)使用新的
DOWNLOADER_CLIENT_TLS_CIPHERS
设置来自定义默认 HTTP/1.1 下载器使用的 TLS/SSL 密码(issue 3392,issue 3442)将新的
DOWNLOADER_CLIENT_TLS_VERBOSE_LOGGING
设置为True
以在建立 HTTPS 连接后启用有关 TLS 连接参数的调试级别消息(issue 2111,issue 3450)接收关键字参数的回调(请参阅
Request.cb_kwargs
)现在可以使用新的@cb_kwargs
蜘蛛契约进行测试(issue 3985,issue 3988)当
@scrapes
蜘蛛契约失败时,现在会报告所有缺少的字段(issue 766,issue 3939)自定义日志格式现在可以通过使配置的
LOG_FORMATTER
相应方法返回None
来丢弃消息(issue 3984,issue 3987)现在为Zsh提供了改进的完成定义(issue 4069)
错误修复¶
ItemLoader.load_item()
不再使后续对ItemLoader.get_output_value()
或ItemLoader.load_item()
的调用返回空数据(issue 3804,issue 3819,issue 3897,issue 3976,issue 3998,issue 4036)修复了
DummyStatsCollector
引发TypeError
异常的问题(issue 4007,issue 4052)FilesPipeline.file_path
和ImagesPipeline.file_path
不再选择未在 IANA 注册的文件扩展名(issue 1287,issue 3953,issue 3954)当使用botocore在 S3 中持久化文件时,现在会正确映射所有 botocore 支持的标头(issue 3904,issue 3905)
现在已正确解码包含百分比转义字符的
FEED_URI
中的 FTP 密码(issue 3941)scrapy.utils.ssl.get_temp_key_info()
中的内存处理和错误处理问题已修复(issue 3920)
文档¶
文档现在涵盖了如何定义和配置自定义日志格式(issue 3616,issue 3660)
为
MarshalItemExporter
和PythonItemExporter
添加了 API 文档(issue 3973)为
BaseItem
和ItemMeta
添加了 API 文档(issue 3999)次要文档修复(issue 2998,issue 3398,issue 3597,issue 3894,issue 3934,issue 3978,issue 3993,issue 4022,issue 4028,issue 4033,issue 4046,issue 4050,issue 4055,issue 4056,issue 4061,issue 4072,issue 4071,issue 4079,issue 4081,issue 4089,issue 4093)
弃用移除¶
scrapy.xlib
已被移除(issue 4015)
弃用¶
LevelDB存储后端(
scrapy.extensions.httpcache.LeveldbCacheStorage
)HttpCacheMiddleware
已弃用(issue 4085,issue 4092)已弃用使用未记录的
SCRAPY_PICKLED_SETTINGS_TO_OVERRIDE
环境变量(issue 3910)scrapy.item.DictItem
已被弃用,请使用Item
代替 (issue 3999)
其他更改¶
已更新持续集成测试涵盖的可选 Scrapy 依赖项的最低版本
这些可选依赖项的较低版本可能有效,但不保证 (issue 3892)
用于错误报告和功能请求的 GitHub 模板 (issue 3126, issue 3471, issue 3749, issue 3754)
持续集成修复 (issue 3923)
代码清理 (issue 3391, issue 3907, issue 3946, issue 3950, issue 4023, issue 4031)
Scrapy 1.7.4 (2019-10-21)¶
回退了针对 issue 3804 的修复 (issue 3819),该修复有一些不希望出现的副作用 (issue 3897, issue 3976).
因此,当使用项目初始化项目加载器时,ItemLoader.load_item()
再次使后续对 ItemLoader.get_output_value()
或 ItemLoader.load_item()
的调用返回空数据。
Scrapy 1.7.3 (2019-08-01)¶
对于 Python 3.4,强制使用 lxml 4.3.5 或更低版本 (issue 3912, issue 3918).
Scrapy 1.7.2 (2019-07-23)¶
修复 Python 2 支持 (issue 3889, issue 3893, issue 3896).
Scrapy 1.7.1 (2019-07-18)¶
重新打包 Scrapy 1.7.0,PyPI 中缺少一些更改。
Scrapy 1.7.0 (2019-07-18)¶
注意
确保安装 Scrapy 1.7.1。PyPI 中的 Scrapy 1.7.0 包是由于错误的提交标记导致的,不包含下面描述的所有更改。
亮点 (Highlights)
针对多个域进行爬取的改进
一种更简洁的方法来将参数传递给回调函数
一个用于 JSON 请求的新类
基于规则的蜘蛛的改进
供稿导出的新功能
向后不兼容的更改¶
429
现在默认情况下是RETRY_HTTP_CODES
设置的一部分此更改 **向后不兼容**。如果您不想重试
429
,则必须相应地覆盖RETRY_HTTP_CODES
。Crawler
、CrawlerRunner.crawl
和CrawlerRunner.create_crawler
不再接受Spider
子类实例,它们现在只接受Spider
子类。Spider
子类实例从未打算使用,并且它们的工作方式并非人们期望的那样:它们没有使用传递的Spider
子类实例,而是调用了它们的from_crawler
方法来生成一个新实例。SCHEDULER_PRIORITY_QUEUE
设置的非默认值可能会停止工作。调度程序优先级队列类现在需要处理Request
对象,而不是任意 Python 数据结构。Scheduler
类的__init__
方法中添加了一个额外的crawler
参数。由于此更改,自定义调度程序子类(在其__init__
方法中不接受任意参数)可能会出现问题。有关更多信息,请参见
SCHEDULER
。
另请参见下面 弃用移除。
新功能¶
一个新的调度程序优先级队列
scrapy.pqueues.DownloaderAwarePriorityQueue
可以 启用,从而在针对多个 Web 域进行爬取时显著提高调度效率,但代价是不支持CONCURRENT_REQUESTS_PER_IP
(issue 3520)一个新的
Request.cb_kwargs
属性提供了一种更简洁的方法来将关键字参数传递给回调方法 (issue 1138, issue 3563)一个新的
JSONRequest
类提供了一种更方便的方式来构建 JSON 请求 (issue 3504, issue 3505)传递给
Rule
__init__
方法的process_request
回调现在接收生成该请求的Response
对象作为其第二个参数 (issue 3682)LinkExtractor
__init__
方法的一个新的restrict_text
参数允许通过链接文本过滤链接 (issue 3622, issue 3635)一个新的
FEED_STORAGE_S3_ACL
设置允许为导出到 Amazon S3 的供稿定义自定义 ACL (issue 3607)一个新的
FEED_STORAGE_FTP_ACTIVE
设置允许对导出到 FTP 服务器的供稿使用 FTP 的主动连接模式 (issue 3829)一个新的
METAREFRESH_IGNORE_TAGS
设置允许覆盖在响应中搜索触发重定向的 HTML 元标记时忽略哪些 HTML 标记 (issue 1422, issue 3768)一个新的
redirect_reasons
请求元数据键公开了每个跟随重定向背后的原因(状态代码、元刷新)(issue 3581, issue 3687)在运行
check
命令期间,SCRAPY_CHECK
变量现在设置为true
字符串,这允许 从代码中检测契约检查运行 (issue 3704, issue 3739)一个新的
Item.deepcopy()
方法使 深度复制项目 变得更容易 (issue 1493, issue 3671)CoreStats
现在也记录elapsed_time_seconds
(issue 3638)来自
ItemLoader
的 输入和输出处理器 的异常现在更加详细了 (issue 3836, issue 3840)Crawler
,CrawlerRunner.crawl
和CrawlerRunner.create_crawler
现在如果接收的是Spider
子类的实例而不是子类本身,则会优雅地失败 (issue 2283, issue 3610, issue 3872)
错误修复¶
process_spider_exception()
现在也适用于生成器 (issue 220, issue 2061)系统异常(如 KeyboardInterrupt)不再被捕获 (issue 3726)
ItemLoader.load_item()
不再导致后续调用ItemLoader.get_output_value()
或ItemLoader.load_item()
返回空数据 (issue 3804, issue 3819)图片管道 (
ImagesPipeline
) 不再忽略以下 Amazon S3 设置:AWS_ENDPOINT_URL
,AWS_REGION_NAME
,AWS_USE_SSL
,AWS_VERIFY
(issue 3625)修复了
scrapy.pipelines.media.MediaPipeline
中的内存泄漏问题,例如,受非 200 响应和自定义中间件异常影响 (issue 3813)现在可以从磁盘正确反序列化带有私有回调的请求 (issue 3790)
FormRequest.from_response()
现在像主流 Web 浏览器一样处理无效的方法 (issue 3777, issue 3794)
文档¶
新增了一个主题,选择动态加载的内容,涵盖了读取动态加载数据的推荐方法 (issue 3703)
广泛爬取 现在包含了有关内存用量的的信息 (issue 1264, issue 3866)
Rule
的文档现在涵盖了在使用CrawlSpider
时如何访问链接文本 (issue 3711, issue 3712)新增了一个章节,编写自己的存储后端,涵盖了为
HttpCacheMiddleware
编写自定义缓存存储后端 (issue 3683, issue 3692)新增了一个 FAQ 条目,如何在项目管道中将一个项目拆分为多个项目?,解释了当您想从项目管道中将一个项目拆分为多个项目时该怎么做 (issue 2240, issue 3672)
更新了 关于爬取顺序的 FAQ 条目,以解释为什么前几个请求很少按照所需的顺序执行 (issue 1739, issue 3621)
LOGSTATS_INTERVAL
设置 (issue 3730),FilesPipeline.file_path
和ImagesPipeline.file_path
方法 (issue 2253, issue 3609) 以及Crawler.stop()
方法 (issue 3842) 现在已记录在案一些令人困惑或误导的文档部分现在更清晰了 (issue 1347, issue 1789, issue 2289, issue 3069, issue 3615, issue 3626, issue 3668, issue 3670, issue 3673, issue 3728, issue 3762, issue 3861, issue 3882)
次要的文档修复 (issue 3648, issue 3649, issue 3662, issue 3674, issue 3676, issue 3694, issue 3724, issue 3764, issue 3767, issue 3791, issue 3797, issue 3806, issue 3812)
移除弃用功能¶
以下已弃用的 API 已被移除 (issue 3578)
scrapy.conf
(使用Crawler.settings
)来自
scrapy.core.downloader.handlers
http.HttpDownloadHandler
(使用http10.HTTP10DownloadHandler
)
scrapy.loader.ItemLoader._get_values
(使用_get_xpathvalues
)scrapy.loader.XPathItemLoader
(使用ItemLoader
)scrapy.log
(参见 日志记录)来自
scrapy.pipelines
files.FilesPipeline.file_key
(使用file_path
)images.ImagesPipeline.file_key
(使用file_path
)images.ImagesPipeline.image_key
(使用file_path
)images.ImagesPipeline.thumb_key
(使用thumb_path
)
来自
scrapy.selector
和scrapy.selector.lxmlsel
来自
scrapy.selector.csstranslator
ScrapyGenericTranslator
(使用 parsel.csstranslator.GenericTranslator)ScrapyHTMLTranslator
(使用 parsel.csstranslator.HTMLTranslator)ScrapyXPathExpr
(使用 parsel.csstranslator.XPathExpr)
来自
Selector
_root
(__init__
方法的参数和对象属性都使用root
)extract_unquoted
(使用getall
)select
(使用xpath
)
来自
SelectorList
extract_unquoted
(使用getall
)select
(使用xpath
)x
(使用xpath
)
scrapy.spiders.BaseSpider
(使用Spider
)来自
Spider
(及其子类)DOWNLOAD_DELAY
(使用 download_delay)set_crawler
(使用from_crawler()
)
scrapy.spiders.spiders
(使用SpiderLoader
)scrapy.telnet
(使用scrapy.extensions.telnet
)来自
scrapy.utils.python
str_to_unicode
(使用to_unicode
)unicode_to_str
(使用to_bytes
)
scrapy.utils.response.body_or_str
以下已弃用的设置也已移除(issue 3578)
SPIDER_MANAGER_CLASS
(使用SPIDER_LOADER_CLASS
)
弃用功能¶
SCHEDULER_PRIORITY_QUEUE
设置的queuelib.PriorityQueue
值已弃用。请改用scrapy.pqueues.ScrapyPriorityQueue
。传递给
Rule
的process_request
回调函数,如果未接受两个参数,则已弃用。以下模块已弃用
scrapy.utils.http
(使用 w3lib.http)scrapy.utils.markup
(使用 w3lib.html)scrapy.utils.multipart
(使用 urllib3)
对于 Python 3 代码库,
scrapy.utils.datatypes.MergeDict
类已弃用。请改用ChainMap
。(issue 3878)scrapy.utils.gz.is_gzipped
函数已弃用。请改用scrapy.utils.gz.gzip_magic_number
。
其他更改¶
现在可以从同一个 tox 环境中并行运行所有测试;文档现在涵盖了 此方法和其他运行测试的方法(issue 3707)
现在可以生成 API 文档覆盖率报告(issue 3806,issue 3810,issue 3860)
文档策略 现在要求使用 文档字符串(issue 3701),并遵循 PEP 257(issue 3748)
内部修复和清理(issue 3629,issue 3643,issue 3684,issue 3698,issue 3734,issue 3735,issue 3736,issue 3737,issue 3809,issue 3821,issue 3825,issue 3827,issue 3833,issue 3857,issue 3877)
Scrapy 1.6.0 (2019-01-30)¶
亮点 (Highlights)
更好的 Windows 支持;
Python 3.7 兼容性;
大幅改进文档,包括将
.extract_first()
+.extract()
API 更改为.get()
+.getall()
API;改进馈送导出、FilePipeline 和 MediaPipeline;
更好的可扩展性:
item_error
和request_reached_downloader
信号;馈送导出器、馈送存储和重复过滤器都支持from_crawler
。scrapy.contracts
修复和新功能;Telnet 控制台安全改进,首次作为 Scrapy 1.5.2 (2019-01-22) 中的反向移植发布;
清理已弃用的代码;
整个代码库中各种错误修复、小型新功能和可用性改进。
Selector API 更改¶
虽然这些不是 Scrapy 本身的更改,而是 Scrapy 用于 xpath/css 选择器的 parsel 库中的更改,但这些更改值得在这里提及。Scrapy 现在依赖于 parsel >= 1.5,并且 Scrapy 文档已更新为遵循最新的 parsel
API 约定。
最明显的更改是现在更推荐使用 .get()
和 .getall()
选择器方法,而不是 .extract_first()
和 .extract()
。我们认为这些新方法可以使代码更简洁易读。请参阅 extract() 和 extract_first() 以了解更多详细信息。
注意
目前**没有计划**弃用 .extract()
和 .extract_first()
方法。
另一个有用的新功能是引入了 Selector.attrib
和 SelectorList.attrib
属性,这使得获取 HTML 元素的属性变得更加容易。请参阅 选择元素属性。
在 parsel >= 1.5 中,CSS 选择器会被缓存,这使得在多次使用相同的 CSS 路径时速度更快。这在 Scrapy 爬虫中非常常见:回调通常会在不同的页面上被多次调用。
如果您正在使用自定义的 Selector
或 SelectorList
子类,parsel 中的一个**向后不兼容**的更改可能会影响您的代码。请参阅 parsel 变更日志 以获取详细说明以及完整的改进列表。
Telnet 控制台¶
**向后不兼容**: Scrapy 的 telnet 控制台现在需要用户名和密码。请参阅 Telnet 控制台 以获取更多详细信息。此更改修复了一个**安全问题**;请参阅 Scrapy 1.5.2 (2019-01-22) 发行说明以获取详细信息。
新的扩展功能¶
from_crawler
支持已添加到 Feed 导出器和 Feed 存储中。除其他事项外,这允许从自定义 Feed 存储和导出器访问 Scrapy 设置 (issue 1605,issue 3348)。from_crawler
支持已添加到重复过滤器中 (issue 2956);这允许例如从重复过滤器访问设置或蜘蛛。item_error
当管道中发生错误时触发 (issue 3256);request_reached_downloader
当下载器获取新的请求时触发;此信号可用于自定义调度程序 (issue 3393)。新的 SitemapSpider
sitemap_filter()
方法,允许根据 SitemapSpider 子类中站点的属性选择站点条目 (issue 3512)。下载器处理程序的延迟加载现在是可选的;这使得在自定义下载器处理程序中能够更好地处理初始化错误 (issue 3394)。
新的 FilePipeline 和 MediaPipeline 功能¶
公开了更多 S3FilesStore 选项:
AWS_ENDPOINT_URL
、AWS_USE_SSL
、AWS_VERIFY
、AWS_REGION_NAME
。例如,这允许使用替代或自托管的与 AWS 兼容的提供商 (issue 2609,issue 3548)。对 Google Cloud Storage 的 ACL 支持:
FILES_STORE_GCS_ACL
和IMAGES_STORE_GCS_ACL
(issue 3199)。
scrapy.contracts
改进¶
合同代码中的异常处理得更好 (issue 3377);
dont_filter=True
用于合同请求,这允许使用相同 URL 测试不同的回调 (issue 3381);合同子类中的
request_cls
属性允许在合同中使用不同的请求类,例如 FormRequest (issue 3383)。修复了合同中的错误回调处理,例如,对于返回非 200 响应的 URL 执行合同的情况 (issue 3371)。
可用性改进¶
RobotsTxtMiddleware 的更多统计信息 (issue 3100)
使用 INFO 日志级别显示 telnet 主机/端口 (issue 3115)
在 RobotsTxtMiddleware 中的 IgnoreRequest 中添加了一条消息 (issue 3113)
更好地验证
Response.follow
中的url
参数 (issue 3131)当蜘蛛初始化时发生错误时,Scrapy 命令返回非零退出代码 (issue 3226)
链接提取改进:“ftp” 已添加到方案列表中 (issue 3152);“flv” 已添加到常用视频扩展名中 (issue 3165)
当导出器被禁用时,显示更好的错误消息 (issue 3358);
scrapy shell --help
提到了本地文件所需的语法 (./file.html
) - issue 3496。将 Referer 标头值添加到 RFPDupeFilter 日志消息中 (issue 3588)
错误修复¶
修复了 Windows 下 .csv 导出中多余空行的问题 (issue 3039);
在 Python 3 中正确处理序列化磁盘队列对象时的 pickle 错误 (issue 3082)
复制请求时,现在保留标志 (issue 3342);
FormRequest.from_response clickdata 不应忽略带有
input[type=image]
的元素 (issue 3153)。FormRequest.from_response 应保留重复键 (issue 3247)
文档改进¶
文档已重写,建议使用 .get/.getall API 而不是 .extract/.extract_first。此外,选择器 文档已更新并重新结构化以匹配最新的 parsel 文档;它们现在包含更多主题,例如 选择元素属性 或 CSS 选择器的扩展 (issue 3390)。
使用浏览器的开发者工具进行抓取 是一个新的教程,取代了旧的 Firefox 和 Firebug 教程 (issue 3400)。
记录了 SCRAPY_PROJECT 环境变量 (issue 3518);
在安装说明中添加了故障排除部分 (issue 3517);
改进了教程中指向初学者资源的链接 (issue 3367,issue 3468);
修复了文档中
RETRY_HTTP_CODES
的默认值 (issue 3335);从文档中删除未使用的
DEPTH_STATS
选项 (issue 3245);其他清理 (issue 3347,issue 3350,issue 3445,issue 3544,issue 3605)。
弃用移除¶
已删除 1.0 之前 Scrapy 模块名称的兼容性 shim (issue 3318)
scrapy.command
scrapy.contrib
(以及所有子模块)scrapy.contrib_exp
(以及所有子模块)scrapy.dupefilter
scrapy.linkextractor
scrapy.project
scrapy.spider
scrapy.spidermanager
scrapy.squeue
scrapy.stats
scrapy.statscol
scrapy.utils.decorator
请参阅 模块重新定位 以获取更多信息,或使用 Scrapy 1.5.x 弃用警告中的建议来更新您的代码。
其他弃用移除
已删除弃用的 scrapy.interfaces.ISpiderManager;请使用 scrapy.interfaces.ISpiderLoader。
已删除弃用的
CrawlerSettings
类 (issue 3327)。已删除弃用的
Settings.overrides
和Settings.defaults
属性 (issue 3327,issue 3359)。
其他改进和清理¶
所有 Scrapy 测试现在都可以在 Windows 上通过;Scrapy 测试套件在 CI 的 Windows 环境中执行 (issue 3315)。
Python 3.7 支持 (issue 3326,issue 3150,issue 3547)。
测试和 CI 修复 (issue 3526,issue 3538,issue 3308,issue 3311,issue 3309,issue 3305,issue 3210,issue 3299)
scrapy.http.cookies.CookieJar.clear
接受“domain”,“path”和“name”可选参数 (issue 3231).sdist 中包含了额外的文件 (issue 3495);
代码风格修复 (issue 3405,issue 3304);
删除了不必要的 .strip() 调用 (issue 3519);
使用 collections.deque 存储 MiddlewareManager 方法而不是列表 (issue 3476)
Scrapy 1.5.2 (2019-01-22)¶
安全漏洞修复:Telnet 控制台扩展程序很容易被恶意网站利用,通过 POST 内容到 https://127.0.0.1:6023,我们没有找到从 Scrapy 利用它的方法,但很容易诱使浏览器这样做,并提高本地开发环境的风险。
此修复程序与向后不兼容,它默认启用 telnet 用户密码身份验证,并使用随机生成的密码。如果您无法立即升级,请考虑将
TELNETCONSOLE_PORT
设置为非默认值。有关更多信息,请参阅 telnet 控制台 文档
由于 boto 导入错误,回退 CI 构建在 GCE 环境下失败。
Scrapy 1.5.1 (2018-07-12)¶
这是一个维护版本,包含重要的错误修复,但没有新增功能
修复了影响 Python 3 和 PyPy 的
O(N^2)
gzip 解压缩问题 (issue 3281);改进了 TLS 验证错误的跳过 (issue 3166);
修复了 Python 3.5+ 中的 Ctrl-C 处理 (issue 3096);
测试修复 (issue 3092,issue 3263);
文档改进 (issue 3058,issue 3059,issue 3089,issue 3123,issue 3127,issue 3189,issue 3224,issue 3280,issue 3279,issue 3201,issue 3260,issue 3284,issue 3298,issue 3294).
Scrapy 1.5.0 (2017-12-29)¶
此版本在整个代码库中带来了少量的新功能和改进。一些亮点
FilesPipeline 和 ImagesPipeline 支持 Google Cloud Storage。
使用代理服务器进行爬取变得更高效,因为现在可以重用与代理的连接。
改进了警告、异常和日志消息,以便于调试。
scrapy parse
命令现在允许通过--meta
参数设置自定义请求元数据。改进了与 Python 3.6、PyPy 和 PyPy3 的兼容性;PyPy 和 PyPy3 现在通过在 CI 上运行测试正式得到支持。
更好地处理 HTTP 308、522 和 524 状态代码。
像往常一样,文档有所改进。
向后不兼容的更改¶
Scrapy 1.5 不再支持 Python 3.3。
默认的 Scrapy 用户代理现在使用 scrapy.org 的 https 链接 (issue 2983)。**从技术上讲,这与向后不兼容**;如果您依赖旧值,请覆盖
USER_AGENT
。修复了由
custom_settings
覆盖的设置的日志记录;**从技术上讲,这与向后不兼容**,因为日志记录器从[scrapy.utils.log]
更改为[scrapy.crawler]
。如果您正在解析 Scrapy 日志,请更新您的日志解析器 (issue 1343)。LinkExtractor 现在默认忽略
m4v
扩展名,这是行为上的变化。522 和 524 状态代码已添加到
RETRY_HTTP_CODES
(issue 2851)
新功能¶
在
Response.follow
中支持<link>
标签 (issue 2785)支持
ptpython
REPL (issue 2654)FilesPipeline 和 ImagesPipeline 支持 Google Cloud Storage (issue 2923)。
“scrapy parse”命令的新
--meta
选项允许传递额外的 request.meta (issue 2883)使用
shell.inspect_response
时填充 spider 变量 (issue 2812)处理 HTTP 308 永久重定向 (issue 2844)
将 522 和 524 添加到
RETRY_HTTP_CODES
(issue 2851)在启动时记录版本信息 (issue 2857)
scrapy.mail.MailSender
现在可以在 Python 3 中使用(它需要 Twisted 17.9.0)重用与代理服务器的连接 (issue 2743)
添加下载器中间件的模板 (issue 2755)
当未定义解析回调时,显示 NotImplementedError 的显式消息 (issue 2831)
CrawlerProcess 获得了一个禁用安装根日志处理程序的选项 (issue 2921)
LinkExtractor 现在默认忽略
m4v
扩展名改进了超过
DOWNLOAD_WARNSIZE
和DOWNLOAD_MAXSIZE
限制的响应的日志消息 (issue 2927)。将 URL 放入
Spider.allowed_domains
而不是域时显示警告 (issue 2250)。
错误修复¶
修复了由
custom_settings
覆盖的设置的日志记录;**从技术上讲,这与向后不兼容**,因为日志记录器从[scrapy.utils.log]
更改为[scrapy.crawler]
,因此如果需要,请更新您的日志解析器 (issue 1343)默认的 Scrapy 用户代理现在使用 scrapy.org 的 https 链接 (issue 2983)。**从技术上讲,这与向后不兼容**;如果您依赖旧值,请覆盖
USER_AGENT
。修复 PyPy 和 PyPy3 测试失败,正式支持它们 (issue 2793,issue 2935,issue 2990,issue 3050,issue 2213,issue 3048)
修复
DNSCACHE_ENABLED=False
时的 DNS 解析器 (issue 2811)为 Debian Jessie tox 测试环境添加
cryptography
(issue 2848)添加验证以检查 Request 回调是否可调用 (issue 2766)
将
extras/qpsclient.py
移植到 Python 3 (issue 2849)在幕后使用 getfullargspec 用于 Python 3 以停止 DeprecationWarning (issue 2862)
更新已弃用的测试别名 (issue 2876)
修复
SitemapSpider
对备用链接的支持 (issue 2853)
文档¶
为
AUTOTHROTTLE_TARGET_CONCURRENCY
设置添加了缺失的项目符号点。(issue 2756)更新贡献文档,记录新的支持渠道 (issue 2762,issue:3038)
在文档中包含对 Scrapy subreddit 的引用
修复损坏的链接;对外部链接使用
https://
(issue 2978,issue 2982,issue 2958)更好地记录 CloseSpider 扩展 (issue 2759)
在 MongoDB 示例中使用
pymongo.collection.Collection.insert_one()
(issue 2781)拼写错误和错别字 (issue 2828,issue 2837,issue 2884,issue 2924)
澄清
CSVFeedSpider.headers
文档(issue 2826)记录
DontCloseSpider
异常并澄清spider_idle
(issue 2791)更新 README 中的“版本发布”部分(issue 2764)
修复
DOWNLOAD_FAIL_ON_DATALOSS
文档中的 rst 语法(issue 2763)修复 startproject 参数描述中的一个小错误(issue 2866)
澄清 Response.body 文档中的数据类型(issue 2922)
在 DepthMiddleware 文档中添加关于
request.meta['depth']
的注释(issue 2374)在 CookiesMiddleware 文档中添加关于
request.meta['dont_merge_cookies']
的注释(issue 2999)更新项目结构示例(issue 2964,issue 2976)
提供一个更好的 ItemExporters 用法示例(issue 2989)
记录 Spider 和 Downloader 中间件的
from_crawler
方法(issue 3019)
Scrapy 1.4.0 (2017-05-18)¶
Scrapy 1.4 没有带来太多令人惊叹的新功能,但仍然有一些方便的改进。
Scrapy 现在支持匿名 FTP 会话,可以通过新的 FTP_USER
和 FTP_PASSWORD
设置自定义用户和密码。如果您使用的是 Twisted 17.1.0 或更高版本,则 FTP 现在可以在 Python 3 中使用。
有一个新的 response.follow
方法用于创建请求;**现在推荐在 Scrapy Spider 中使用此方法创建请求**。此方法使编写正确的 Spider 变得更容易;response.follow
与直接创建 scrapy.Request
对象相比,具有以下几个优点
它处理相对 URL;
它在非 UTF8 页面上可以正确处理非 ASCII URL;
除了绝对和相对 URL 之外,它还支持选择器;对于
<a>
元素,它还可以提取其 href 值。
例如,而不是这样
for href in response.css('li.page a::attr(href)').extract():
url = response.urljoin(href)
yield scrapy.Request(url, self.parse, encoding=response.encoding)
现在可以这样写
for a in response.css('li.page a'):
yield response.follow(a, self.parse)
链接提取器也得到了改进。它们的工作方式类似于现代浏览器:在构建 Link
对象时,会从属性(例如 href=" http://example.com"
)中删除前导和尾随空格。对于使用 FormRequest
的 action
属性,也会进行此空格去除操作。
**请注意,链接提取器默认不再规范化 URL。**这有时会让用户感到困惑,而且事实上浏览器也不会这样做,因此我们删除了对提取链接的额外转换。
对于那些希望更好地控制 Scrapy 在跟踪链接时发送的 Referer:
标头的用户,您可以设置自己的 Referrer Policy
。在 Scrapy 1.4 之前,默认的 RefererMiddleware
会简单地将其设置为生成 HTTP 请求的响应的 URL(这可能会泄露有关您的 URL 种子的信息)。默认情况下,Scrapy 现在的工作方式与您的普通浏览器非常相似。并且此策略可以通过 W3C 标准值(或者如果您愿意,可以使用您自己的自定义值)完全自定义。有关详细信息,请参阅 REFERRER_POLICY
。
为了使 Scrapy Spider 更易于调试,Scrapy 在 1.4 中默认记录了更多统计信息:内存使用统计信息、详细的重试统计信息、详细的 HTTP 错误代码统计信息。类似的更改是 HTTP 缓存路径现在也显示在日志中。
最后但并非最不重要的一点是,Scrapy 现在可以选择使 JSON 和 XML 项目更易于阅读,在项目之间添加换行符,甚至使用自定义缩进偏移量,使用新的 FEED_EXPORT_INDENT
设置。
尽情享受!(或者继续阅读本版本中其余的更改。)
弃用和向后不兼容的更改¶
在
scrapy.linkextractors.LinkExtractor
中将canonicalize=False
设为默认值(issue 2537,修复了 issue 1941 和 issue 1982):**警告,这在技术上是不兼容的**默认启用 memusage 扩展(issue 2539,修复了 issue 2187);**这在技术上是不兼容的**,因此请检查您是否设置了任何非默认的
MEMUSAGE_***
选项。EDITOR
环境变量现在优先于 settings.py 中定义的EDITOR
选项(issue 1829);Scrapy 默认设置不再依赖于环境变量。**这在技术上是不兼容的更改**。Spider.make_requests_from_url
已弃用(issue 1728,修复了 issue 1495)。
新功能¶
在
proxy
请求元数据键中接受代理凭据(issue 2526)支持 brotli 压缩 内容;需要可选的 brotlipy(issue 2535)
新的 response.follow 创建请求的快捷方式(issue 1940)
向
Request
对象添加了flags
参数和属性(issue 2047)支持匿名 FTP(issue 2342)
向
RetryMiddleware
添加了retry/count
、retry/max_reached
和retry/reason_count/<reason>
统计信息(issue 2543)向
HttpErrorMiddleware
添加了httperror/response_ignored_count
和httperror/response_ignored_status_count/<status>
统计信息(issue 2566)新的
data:
URI 下载处理器(issue 2334,修复了 issue 2156)使用 HTTP 缓存时记录缓存目录(issue 2611,修复了 issue 2604)
当项目包含重复的 Spider 名称时警告用户(修复了 issue 2181)
scrapy.utils.datatypes.CaselessDict
现在接受Mapping
实例,而不仅仅是字典(issue 2646)媒体下载,使用
FilesPipeline
或ImagesPipeline
,现在可以选择使用新的MEDIA_ALLOW_REDIRECTS
设置处理 HTTP 重定向(issue 2616,修复了 issue 2004)使用新的
DOWNLOAD_FAIL_ON_DATALOSS
设置接受来自网站的不完整响应(issue 2590,修复了 issue 2586)通过
FEED_EXPORT_INDENT
设置可选地美化 JSON 和 XML 项目的输出(issue 2456,修复了 issue 1327)当传递
None
值时,允许在FormRequest.from_response
的 formdata 中删除字段(issue 667)使用新的
max_retry_times
元数据键设置每个请求的重试次数(issue 2642)使用
python -m scrapy
作为scrapy
命令的更明确的替代方案(issue 2740)
错误修复¶
LinkExtractor 现在会从属性中去除前导和尾随空格(issue 2547,修复了 issue 1614)
在
FormRequest
中正确处理 action 属性中的空格(issue 2548)缓冲来自代理的 CONNECT 响应字节,直到接收到所有 HTTP 头部(issue 2495,修复了 issue 2491)
FTP 下载器现在可以在 Python 3 上运行,前提是您使用 Twisted>=17.1(issue 2599)
解压缩内容后,使用主体选择响应类型(issue 2393,修复了 issue 2145)
始终在
HttpCompressionMiddleware
阶段解压缩Content-Encoding: gzip
(issue 2391)尊重
Spider.custom_settings
中的自定义日志级别(issue 2581,修复了 issue 1612)macOS 上的“make htmlview”修复(issue 2661)
从命令列表中删除“commands”(issue 2695)
修复了带有空主体的 POST 请求的重复 Content-Length 标头问题(issue 2677)
正确取消大型下载,即超过
DOWNLOAD_MAXSIZE
的下载(issue 1616)ImagesPipeline:修复了使用调色板的透明 PNG 图像的处理问题(issue 2675)
清理和重构¶
测试:删除临时文件和文件夹(issue 2570),修复了 macOS 上的 ProjectUtilsTest(issue 2569),在 Travis CI 上为 Linux 使用可移植的 pypy(issue 2710)
在 CrawlSpider 中将构建请求与
_requests_to_follow
分开(issue 2562)删除“Python 3 进度”徽章(issue 2567)
在
.gitignore
中添加几行内容(issue 2557)删除 bumpversion 预发布配置(issue 2159)
添加 codecov.yml 文件(issue 2750)
根据 Twisted 版本设置上下文工厂实现(issue 2577,修复了 issue 2560)
在默认项目中间件模板中添加省略的
self
参数(issue 2595)删除 ExecutionEngine 中冗余的
slot.add_request()
调用(issue 2617)在
scrapy.pipelines.files.FSFilesStore
中捕获更具体的os.error
异常(issue 2644)更改“localhost”测试服务器证书(issue 2720)
删除未使用的
MEMUSAGE_REPORT
设置(issue 2576)
文档¶
导出器需要二进制模式(issue 2564,修复了 issue 2553)
提及由于 lxml 中的错误导致
FormRequest.from_response
出现的问题(issue 2572)在模板中统一使用单引号(issue 2596)
记录
ftp_user
和ftp_password
元键(issue 2587)删除关于已弃用的
contrib/
的部分(issue 2636)在 Windows 上安装 Scrapy 时推荐使用 Anaconda(issue 2477,修复了 issue 2475)
常见问题解答:重写关于 Windows 上 Python 3 支持的说明(issue 2690)
重新排列选择器部分(issue 2705)
从
SelectorList
文档中删除__nonzero__
(issue 2683)提及如何在
DUPEFILTER_CLASS
设置的文档中禁用请求过滤(issue 2714)将 sphinx_rtd_theme 添加到文档设置自述文件(issue 2668)
在 JSON 项目写入器示例中以文本模式打开文件(issue 2729)
阐明
allowed_domains
示例(issue 2670)
Scrapy 1.3.3 (2017-03-10)¶
错误修复¶
使
SpiderLoader
再次默认情况下为缺少的依赖项和错误的SPIDER_MODULES
抛出ImportError
。从 1.3.0 开始,这些异常被静默为警告。引入了新的设置以在需要时在警告或异常之间切换;有关详细信息,请参阅SPIDER_LOADER_WARN_ONLY
。
Scrapy 1.3.2 (2017-02-13)¶
错误修复¶
在转换为/从字典转换时保留请求类 (utils.reqser)(issue 2510)。
在教程中对作者字段使用一致的选择器(issue 2551)。
修复 Twisted 17+ 中的 TLS 兼容性(issue 2558)
Scrapy 1.3.1 (2017-02-08)¶
新功能¶
支持布尔设置的
'True'
和'False'
字符串值(issue 2519);您现在可以执行类似scrapy crawl myspider -s REDIRECT_ENABLED=False
的操作。支持使用
response.xpath()
的 kwargs 来使用 XPath 变量 和临时命名空间声明;这至少需要 Parsel v1.1(issue 2457)。添加对 Python 3.6 的支持(issue 2485)。
在 PyPy 上运行测试(警告:一些测试仍然失败,因此 PyPy 尚未得到支持)。
错误修复¶
强制执行
DNS_TIMEOUT
设置(issue 2496)。修复
view
命令;这是 v1.3.0 中的回归(issue 2503)。修复与 Files/Images 管道一起使用
*_EXPIRES settings
相关的测试(issue 2460)。修复使用基本项目模板时生成的管道类的名称(issue 2466)。
修复与 Twisted 17+ 的兼容性(issue 2496,issue 2528)。
修复 Python 3.6 上的
scrapy.Item
继承问题(issue 2511)。强制
SPIDER_MIDDLEWARES
、DOWNLOADER_MIDDLEWARES
、EXTENSIONS
和SPIDER_CONTRACTS
中组件顺序的数值(issue 2420)。
文档¶
改写行为准则部分并升级到 Contributor Covenant v1.4(issue 2469)。
阐明传递蜘蛛参数会将其转换为蜘蛛属性(issue 2483)。
记录
formid
参数在FormRequest.from_response()
中的使用(issue 2497)。将 .rst 扩展名添加到 README 文件(issue 2507)。
提及 LevelDB 缓存存储后端(issue 2525)。
在示例回调代码中使用
yield
(issue 2533)。添加关于使用
.re()/.re_first()
解码HTML实体的说明(issue 1704)。拼写错误修复(issue 2512,issue 2534,issue 2531)。
代码清理¶
移除
MetaRefreshMiddleware
中冗余的检查(issue 2542)。在
LinkExtractor
中针对允许/拒绝模式进行更快的检查(issue 2538)。移除支持旧版Twisted版本的冗余代码(issue 2544)。
Scrapy 1.3.0 (2016-12-21)¶
这个版本在1.2.2之后发布得很快,主要原因是:发现从0.18到1.2.2(包含)的版本都使用了从Twisted移植过来的某些代码(scrapy.xlib.tx.*
),即使有更新的Twisted模块可用。Scrapy现在直接使用twisted.web.client
和twisted.internet.endpoints
。(参见下面的代码清理部分。)
由于这是一个重大更改,我们希望快速发布该错误修复,同时不破坏任何使用1.2系列项目的项目。
新特性¶
MailSender
现在接受单个字符串作为to
和cc
参数的值(issue 2272)scrapy fetch url
、scrapy shell url
和Scrapy shell内部的fetch(url)
现在默认情况下会跟随HTTP重定向(issue 2290);请参阅fetch
和shell
了解详细信息。HttpErrorMiddleware
现在使用INFO
级别而不是DEBUG
级别记录错误;从技术上讲,这与向后不兼容,因此请检查您的日志解析器。默认情况下,日志记录器名称现在使用长格式路径,例如
[scrapy.extensions.logstats]
,而不是先前版本中较短的“顶级”变体(例如[scrapy]
);如果您使用的是期望短日志记录器名称部分的日志解析器,则此更改与向后不兼容。您可以使用LOG_SHORT_NAMES
设置为True
将其切换回短日志记录器名称。
依赖项和代码清理¶
Scrapy现在需要Twisted >= 13.1,这在许多Linux发行版中已经是这种情况。
因此,我们去除了
scrapy.xlib.tx.*
模块,该模块复制了一些Twisted代码,供那些使用“旧”Twisted版本的用户使用。ChunkedTransferMiddleware
已弃用,并从默认下载器中间件中删除。
Scrapy 1.2.3 (2017-03-03)¶
打包修复:在setup.py中禁止不支持的Twisted版本。
Scrapy 1.2.2 (2016-12-06)¶
错误修复¶
修复当管道在
open_spider()
上失败时出现的难以理解的回溯(issue 2011)修复嵌入式IPython shell变量(修复在1.2.0中重新出现的issue 396,在issue 2418中已修复)
处理robots.txt时的一些补丁。
处理(非标准)相对sitemap URL(issue 2390)
在Python 2中处理非ASCII URL和用户代理(issue 2373)
文档¶
记录
Request
的meta
字典中的"download_latency"
键(issue 2033)从ToC中删除关于(已弃用且不受支持的)Ubuntu软件包的页面(issue 2335)
修复了一些拼写错误(issue 2346,issue 2369,issue 2369,issue 2380)和澄清说明(issue 2354,issue 2325,issue 2414)
其他更改¶
将conda-forge宣传为Scrapy的官方conda频道(issue 2387)
在尝试对非文本响应使用
.css()
或.xpath()
时提供更有帮助的错误消息(issue 2264)startproject
命令现在生成一个示例middlewares.py
文件(issue 2335)在
scrapy version
详细输出中添加更多依赖项的版本信息(issue 2404)从源代码分发中删除所有
*.pyc
文件(issue 2386)
Scrapy 1.2.1 (2016-10-21)¶
错误修复¶
在建立TLS/SSL连接时包含OpenSSL的更宽松的默认密码(issue 2314)。
修复非ASCII URL重定向时“Location”HTTP标头解码问题(issue 2321)。
文档¶
修复JsonWriterPipeline示例(issue 2302)。
各种说明:关于spider名称的issue 2330,关于中间件方法处理顺序的issue 2329,关于将多值HTTP标头作为列表获取的issue 2327。
其他更改¶
从内置spider模板中的
start_urls
中删除www.
(issue 2299)。
Scrapy 1.2.0 (2016-10-03)¶
新特性¶
新的
FEED_EXPORT_ENCODING
设置用于自定义将项目写入文件时使用的编码。这可以用于关闭JSON输出中的\uXXXX
转义。对于那些希望使用除UTF-8以外的XML或CSV输出的人来说,这也很有用(issue 2034)。startproject
命令现在支持可选的目标目录,以覆盖基于项目名称的默认目录(issue 2005)。新的
SCHEDULER_DEBUG
设置用于记录请求序列化失败(issue 1610)。JSON编码器现在支持
set
实例的序列化(issue 2058)。将
application/json-amazonui-streaming
解释为TextResponse
(issue 1503)。使用shell工具(
shell
,inspect_response)时,默认情况下会导入scrapy
(issue 2248)。
错误修复¶
DefaultRequestHeaders中间件现在在UserAgent中间件之前运行(issue 2088)。**警告:从技术上讲,这与向后不兼容**,但我们认为这是一个错误修复。
使用
.scrapy
数据目录的HTTP缓存扩展和插件现在可以在项目外部工作(issue 1581)。**警告:从技术上讲,这与向后不兼容**,但我们认为这是一个错误修复。Selector
不再允许同时传递response
和text
(issue 2153)。修复使用
scrapy parse
时错误的回调名称日志记录问题(issue 2169)。修复一个奇怪的gzip解压缩错误(issue 1606)。
修复在使用
CrawlSpider
结合scrapy parse
命令时部分回调函数的问题(issue 2225)。修复当 Spider 不产出任何 Item 时导致的无效 JSON 和 XML 文件问题(issue 872)。
为
StreamLogger
实现flush()
方法,避免日志中出现警告(issue 2125)。
重构¶
canonicalize_url
函数已移动到 w3lib.url(issue 2168)。
测试与依赖¶
Scrapy 的新依赖基础版本为 Debian 8 “Jessie”。之前为 Ubuntu 12.04 Precise。这意味着我们至少使用以下主要软件包版本运行持续集成测试:Twisted 14.0、pyOpenSSL 0.14、lxml 3.4。
Scrapy 很有可能与这些软件包的旧版本兼容(例如,代码库中仍然保留了针对旧版 Twisted 的切换),但不能保证(因为不再进行测试)。
文档¶
语法修复:issue 2128、issue 1566。
从 README 中删除下载统计徽章(issue 2160)。
新的 Scrapy 架构图(issue 2165)。
更新了
Response
参数文档(issue 2197)。重新表述了误导性的
RANDOMIZE_DOWNLOAD_DELAY
描述(issue 2190)。添加 StackOverflow 作为支持渠道(issue 2257)。
Scrapy 1.1.4 (2017-03-03)¶
打包修复:在setup.py中禁止不支持的Twisted版本。
Scrapy 1.1.3 (2016-09-22)¶
Bug 修复¶
ImagesPipeline
和FilesPipeline
子类的类属性恢复到 1.1.1 之前的行为(issue 2243,修复了 issue 2198)。
文档¶
概述 和 教程 重新编写,使用 http://toscrape.com 网站作为示例(issue 2236、issue 2249、issue 2252)。
Scrapy 1.1.2 (2016-08-18)¶
Bug 修复¶
引入缺失的
IMAGES_STORE_S3_ACL
设置,用于在将图片上传到 S3 时覆盖默认的 ACL 策略(注意,自 Scrapy 1.1.0 起,默认 ACL 策略为“private”而非“public-read”)。IMAGES_EXPIRES
的默认值恢复为 90(回归问题出现在 1.1.1 中)。
Scrapy 1.1.1 (2016-07-13)¶
Bug 修复¶
在连接到 HTTPS 代理的 CONNECT 请求中添加 “Host” 头(issue 2069)。
在选择响应类时使用响应的
body
(issue 2001,修复了 issue 2000)。规范化 URL 时,不再因错误的 netloc 导致失败(issue 2038,修复了 issue 2010)。
对
HttpCompressionMiddleware
(以及SitemapSpider
)进行了一些修复。不再解码 HEAD 响应(issue 2008,修复了 issue 1899)。
处理 gzip 内容类型头中的字符集参数(issue 2050,修复了 issue 2049)。
不再解压缩 gzip octet-stream 响应(issue 2065,修复了 issue 2063)。
捕获(并以警告方式忽略)在针对 IP 地址主机验证证书时发生的异常(issue 2094,修复了 issue 2092)。
使
FilesPipeline
和ImagesPipeline
再次向后兼容,关于使用旧版类属性进行自定义(issue 1989,修复了 issue 1985)。
新特性¶
启用在项目文件夹外部使用 genspider 命令(issue 2052)。
默认情况下重试 HTTPS CONNECT
TunnelError
(issue 1974)。
文档¶
FEED_TEMPDIR
设置在词典顺序位置(commit 9b3c72c)。在概述中使用惯用的
.extract_first()
(issue 1994)。更新版权声明中的年份(commit c2c8036)。
添加关于 errbacks 的信息和示例(issue 1995)。
在下载器中间件示例中使用 “url” 变量(issue 2015)。
语法修复(issue 2054、issue 2120)。
新增关于在 Spider 回调函数中使用 BeautifulSoup 的常见问题解答条目(issue 2048)。
添加关于 Scrapy 在 Windows 上与 Python 3 不兼容的说明(issue 2060)。
鼓励在拉取请求中使用完整的标题(issue 2026)。
测试¶
升级 Travis CI 上的 py.test 依赖项,并将 pytest-cov 固定到 2.2.1(issue 2095)。
Scrapy 1.1.0 (2016-05-11)¶
这个 1.1 版本带来了许多有趣的特性和 Bug 修复。
Scrapy 1.1 提供了 Beta 版的 Python 3 支持(需要 Twisted >= 15.5)。有关更多详细信息和一些限制,请参阅 Beta 版 Python 3 支持。
热门新特性
Item 加载器现在支持嵌套加载器(issue 1467)。
FormRequest.from_response
改进(issue 1382、issue 1137)。添加了
AUTOTHROTTLE_TARGET_CONCURRENCY
设置并改进了 AutoThrottle 文档(issue 1324)。添加了
response.text
用于获取以 Unicode 编码的响应体(issue 1730)。匿名 S3 连接(issue 1358)。
下载器中间件中的 Deferreds(issue 1473)。这使得更好的 robots.txt 处理成为可能(issue 1471)。
HTTP 缓存现在更严格地遵循 RFC2616,添加了
HTTPCACHE_ALWAYS_STORE
和HTTPCACHE_IGNORE_RESPONSE_CACHE_CONTROLS
设置(issue 1151)。选择器已提取到 parsel 库中(issue 1409)。这意味着您可以在没有 Scrapy 的情况下使用 Scrapy 选择器,并且还可以升级选择器引擎而无需升级 Scrapy。
HTTPS 下载器现在默认执行 TLS 协议协商,而不是强制使用 TLS 1.0。您还可以使用新的
DOWNLOADER_CLIENT_TLS_METHOD
设置 SSL/TLS 方法。
这些 Bug 修复可能需要您关注
默认情况下不再重试错误请求(HTTP 400)(issue 1289)。如果您需要旧的行为,请将
400
添加到RETRY_HTTP_CODES
中。修复了 shell 文件参数处理(issue 1710、issue 1550)。如果您尝试
scrapy shell index.html
,它将尝试加载 URLhttp://index.html
,请使用scrapy shell ./index.html
加载本地文件。现在默认情况下为新创建的项目启用 robots.txt 兼容性(issue 1724)。Scrapy 还会在继续爬取之前等待 robots.txt 下载完成(issue 1735)。如果您想禁用此行为,请在创建新项目后更新
settings.py
文件中的ROBOTSTXT_OBEY
设置。导出器现在默认使用 Unicode 而不是字节进行工作(issue 1080)。如果您使用
PythonItemExporter
,您可能需要更新您的代码以禁用现在已弃用的二进制模式。接受包含点的 XML 节点名称作为有效名称(issue 1533)。
当将文件或图像上传到 S3(使用
FilesPipeline
或ImagesPipeline
)时,默认的 ACL 策略现在为“private”(私有)而不是“public”(公开)**警告:不兼容!**。您可以使用FILES_STORE_S3_ACL
进行更改。我们重新实现了
canonicalize_url()
以获得更正确的输出,尤其是在包含非 ASCII 字符的 URL 中(issue 1947)。这可能会改变链接提取器的输出,与之前的 Scrapy 版本相比。这还可能使您可能仍然保留的来自 1.1 之前版本的某些缓存条目失效。**警告:不兼容!**。
继续阅读以获取有关其他改进和错误修复的更多详细信息。
Python 3 支持 Beta版¶
我们一直在 努力使 Scrapy 在 Python 3 上运行。因此,您现在可以在 Python 3.3、3.4 和 3.5 上运行爬虫(需要 Twisted >= 15.5)。某些功能仍然缺失(并且某些功能可能永远不会移植)。
几乎所有内置扩展/中间件都应该可以工作。但是,我们意识到 Python 3 中存在一些限制。
Scrapy 在 Python 3 的 Windows 上无法运行。
不支持发送电子邮件。
不支持 FTP 下载处理器。
不支持 Telnet 控制台。
其他新功能和增强功能¶
Scrapy 现在有了一个 行为准则(issue 1681)。
命令行工具现在具有 zsh 的自动补全功能(issue 934)。
对
scrapy shell
的改进。支持 bpython 并通过
SCRAPY_PYTHON_SHELL
配置首选的 Python shell(issue 1100,issue 1444)。支持没有 scheme 的 URL(issue 1498)**警告:不兼容!**
恢复对相对文件路径的支持(issue 1710,issue 1550)。
添加了
MEMUSAGE_CHECK_INTERVAL_SECONDS
设置以更改默认检查间隔(issue 1282)。下载处理器现在在第一次使用其 scheme 的请求时延迟加载(issue 1390,issue 1421)。
HTTPS 下载处理器不再强制使用 TLS 1.0;而是使用 OpenSSL 的
SSLv23_method()/TLS_method()
,允许尝试与远程主机协商它可以使用的最高 TLS 协议版本(issue 1794,issue 1629)。RedirectMiddleware
现在会跳过 spider 属性或Request
的meta
键中handle_httpstatus_list
中的状态代码(issue 1334,issue 1364,issue 1447)。表单提交
现在也适用于
<button>
元素(issue 1469)。现在对于没有值的提交按钮使用空字符串(issue 1472)。
类似字典的设置现在具有每个键的优先级(issue 1135,issue 1149 和 issue 1586)。
发送非 ASCII 电子邮件(issue 1662)。
CloseSpider
和SpiderState
扩展现在如果未设置相关设置将被禁用(issue 1723,issue 1725)。添加了方法
ExecutionEngine.close
(issue 1423)。添加了方法
CrawlerRunner.create_crawler
(issue 1528)。调度程序优先级队列现在可以通过
SCHEDULER_PRIORITY_QUEUE
进行自定义(issue 1822)。.pps
链接现在在链接提取器中默认被忽略(issue 1835)。FTP 和 S3 feed 存储的临时数据文件夹可以使用新的
FEED_TEMPDIR
设置进行自定义(issue 1847)。FilesPipeline
和ImagesPipeline
设置现在是实例属性而不是类属性,从而可以实现特定于爬虫的行为(issue 1891)。JsonItemExporter
现在在自己的行上格式化开始和结束方括号(输出文件的第 1 行和最后一行)(issue 1950)。如果可用,
botocore
将用于S3FeedStorage
、S3DownloadHandler
和S3FilesStore
(issue 1761,issue 1883)。大量的文档更新和相关修复(issue 1291,issue 1302,issue 1335,issue 1683,issue 1660,issue 1642,issue 1721,issue 1727,issue 1879)。
其他重构、优化和清理(issue 1476,issue 1481,issue 1477,issue 1315,issue 1290,issue 1750,issue 1881)。
弃用和移除¶
添加了
to_bytes
和to_unicode
,弃用了str_to_unicode
和unicode_to_str
函数(issue 778)。binary_is_text
已引入,以替换isbinarytext
的使用(但返回值相反)(issue 1851)。已删除
optional_features
集(issue 1359)。已删除
--lsprof
命令行选项(issue 1689)。**警告:不兼容**,但不会破坏用户代码。以下数据类型已弃用(issue 1720)。
scrapy.utils.datatypes.MultiValueDictKeyError
scrapy.utils.datatypes.MultiValueDict
scrapy.utils.datatypes.SiteNode
之前捆绑的
scrapy.xlib.pydispatch
库已弃用,并替换为 pydispatcher。
重新定位¶
telnetconsole
已重新定位到extensions/
(issue 1524)。注意:Python 3 上未启用 telnet(https://github.com/scrapy/scrapy/pull/1524#issuecomment-146985595)。
错误修复¶
Scrapy 现在不再重试收到
HTTP 400 Bad Request
响应的请求(issue 1289)。**警告:不兼容!**支持 http_proxy 配置的空密码(issue 1274)。
将
application/x-json
解释为TextResponse
(issue 1333)。支持具有多个值的 link rel 属性(issue 1201)。
修复了当存在 `
` 标签时 scrapy.http.FormRequest.from_response
的问题(issue 1564)。修复了
TEMPLATES_DIR
的处理(issue 1575)。修复了多个
FormRequest
相关问题(issue 1595,issue 1596,issue 1597)。使
_monkeypatches
更加健壮(issue 1634)。修复了
XMLItemExporter
在项目中处理非字符串字段时的错误(issue 1738)。修复了 macOS 上的 startproject 命令(issue 1635)。
修复了
PythonItemExporter
和 CSVExporter 在处理非字符串项目类型时的错误(issue 1737)。修复了多个与日志相关的错误(issue 1294,issue 1419,issue 1263,issue 1624,issue 1654,issue 1722,issue 1726 和 issue 1303)。
修复了
utils.template.render_templatefile()
中的错误(issue 1212)。现在从
robots.txt
中提取站点地图时不区分大小写(issue 1902)。使用多个代理连接到同一远程主机时,HTTPS+CONNECT 隧道可能会发生混淆(issue 1912)。
Scrapy 1.0.7 (2017-03-03)¶
打包修复:在setup.py中禁止不支持的Twisted版本。
Scrapy 1.0.6 (2016-05-04)¶
修复:RetryMiddleware 现在可以更稳健地处理非标准 HTTP 状态码(issue 1857)
修复:Filestorage HTTP 缓存正在检查错误的修改时间(issue 1875)
文档:支持 Sphinx 1.4+(issue 1893)
文档:选择器示例的一致性(issue 1869)
Scrapy 1.0.5 (2016-02-04)¶
修复:[回退] 忽略 LinkExtractor 中的虚假链接(修复 issue 907,commit 108195e)
测试:将 buildbot makefile 更改为使用“pytest”(commit 1f3d90a)
文档:修复教程和媒体管道中的错别字(commit 808a9ea 和 commit 803bd87)
文档:在 settings 文档中将 AjaxCrawlMiddleware 添加到 DOWNLOADER_MIDDLEWARES_BASE 中(commit aa94121)
Scrapy 1.0.4 (2015-12-30)¶
根据 Twisted 版本忽略 xlib/tx 文件夹。(commit 7dfa979)
在新的 travis-ci 基础设施上运行(commit 6e42f0b)
拼写修复(commit 823a1cc)
在 xmliter 正则表达式中转义节点名称(commit da3c155)
使用点测试 xml 节点名称(commit 4418fc3)
测试不要在测试中使用损坏的 Pillow 版本(commit a55078c)
禁用版本命令中的日志。关闭 #1426(commit 86fc330)
禁用 startproject 命令中的日志(commit db4c9fe)
添加 PyPI 下载统计徽章(commit df2b944)
如果从 scrapy/scrapy 分支创建 PR,则不要在 Travis 上运行两次测试(commit a83ab41)
将 Python 3 移植状态徽章添加到自述文件(commit 73ac80d)
修复 RFPDupeFilter 持久性(commit 97d080e)
测试一个测试,以表明 dupefilter 持久性不起作用(commit 97f2fb3)
在 file:// 方案处理程序上显式关闭文件(commit d9b4850)
在 shell 中禁用 dupefilter(commit c0d0734)
文档:为出现在侧边栏中的 toctrees 添加标题(commit aa239ad)
文档已从安装说明中删除 pywin32,因为它已被声明为依赖项。(commit 10eb400)
添加了有关在 Windows 和其他操作系统上使用 Conda 进行安装的说明。(commit 1c3600a)
修复了轻微的语法问题。(commit 7f4ddd5)
修复了文档中的错别字。(commit b71f677)
版本 1 现已存在(commit 5456c0e)
修复另一个无效的 xpath 错误(commit 0a1366e)
修复 selectors.rst 上的 ValueError: Invalid XPath: //div/[id=”not-exists”]/text()(commit ca8d60f)
错别字更正(commit 7067117)
修复 downloader-middleware.rst 和 exceptions.rst 中的错别字,middlware -> middleware(commit 32f115c)
在 Ubuntu 安装部分添加关于 Debian 兼容性的说明(commit 23fda69)
将 macOS 安装的替代解决方法替换为 virtualenv(commit 98b63ee)
参考 Homebrew 的主页以获取安装说明(commit 1925db1)
将最旧的支持的 tox 版本添加到贡献文档中(commit 5d10d6d)
在安装文档中说明 pip 已包含在 python>=2.7.9 中(commit 85c980e)
将非 Python 依赖项添加到文档中的 Ubuntu 安装部分(commit fbd010d)
将 macOS 安装部分添加到文档中(commit d8f4cba)
文档(增强):显式指定 rtd 主题的路径(commit de73b1a)
次要:scrapy.Spider 文档语法(commit 1ddcc7b)
使常见实践示例代码与注释匹配(commit 1b85bcf)
nextcall 重复调用(心跳)。(commit 55f7104)
回退修复与 Twisted 15.4.0 的兼容性(commit b262411)
将 pytest 固定到 2.7.3(commit a6535c2)
合并拉取请求 #1512 来自 mgedmin/patch-1(commit 8876111)
合并拉取请求 #1513 来自 mgedmin/patch-2(commit 5d4daf8)
错别字(commit f8d0682)
修复列表格式(commit 5f83a93)
在最近对 queuelib 进行更改后修复 Scrapy squeue 测试(commit 3365c01)
合并拉取请求 #1475 来自 rweindl/patch-1(commit 2d688cd)
更新 tutorial.rst(commit fbc1f25)
合并拉取请求 #1449 来自 rhoekman/patch-1(commit 7d6538c)
小的语法更改(commit 8752294)
将 openssl 版本添加到版本命令(commit 13c45ac)
Scrapy 1.0.3 (2015-08-11)¶
将 service_identity 添加到 Scrapy install_requires(commit cbc2501)
解决 travis#296 的问题(commit 66af9cd)
Scrapy 1.0.2 (2015-08-06)¶
Twisted 15.3.0 在序列化 lambda 函数时不会引发 PicklingError(commit b04dd7d)
轻微的方法名称修复(commit 6f85c7f)
次要:scrapy.Spider 语法和清晰度(commit 9c9d2e0)
在 CONTRIBUTING 中添加关于支持渠道的简短说明(commit c63882b)
修复错别字(commit a9ae7b0)
修复文档引用。(commit 7c8a4fe)
Scrapy 1.0.1 (2015-07-01)¶
在传递给 FTPClient 之前取消引用请求路径,它已经转义了路径(commit cc00ad2)
在 MANIFEST.in 中包含 tests/ 到源发行版(commit eca227e)
文档修复 SelectJmes 文档(commit b8567bc)
文档将 Ubuntu 和 Archlinux 移出 Windows 子部分(commit 392233f)
文档从 Ubuntu 包中删除版本后缀(commit 5303c66)
文档更新 1.0 的发布日期(commit c89fa29)
Scrapy 1.0.0 (2015-06-19)¶
在这个主要版本中,您将发现许多新功能和错误修复。请务必查看我们更新的概述,以快速了解一些更改,以及我们改进的教程。
支持在 Spider 中返回字典¶
不再需要声明和返回 Scrapy Item 来收集 Spider 抓取的数据,您现在可以改为返回显式的字典。
经典版本
class MyItem(scrapy.Item):
url = scrapy.Field()
class MySpider(scrapy.Spider):
def parse(self, response):
return MyItem(url=response.url)
新版本
class MySpider(scrapy.Spider):
def parse(self, response):
return {'url': response.url}
每个 Spider 的设置 (GSoC 2014)¶
最后一个 Google Summer of Code 项目完成了一个重要的重新设计,该设计重新设计了用于填充设置的机制,引入了显式优先级以覆盖任何给定的设置。作为该目标的扩展,我们添加了一个新的优先级级别,用于专门针对单个 Spider 的设置,允许它们重新定义项目设置。
通过在您的 Spider 中定义一个custom_settings
类变量来开始使用它
class MySpider(scrapy.Spider):
custom_settings = {
"DOWNLOAD_DELAY": 5.0,
"RETRY_ENABLED": False,
}
阅读有关设置填充的更多信息:设置
Python 日志记录¶
Scrapy 1.0 已停止使用 Twisted 日志记录,并支持 Python 内置的日志记录系统作为默认日志记录系统。我们正在维护大多数旧自定义接口的后向兼容性以调用日志记录函数,但您会收到警告,提示您完全切换到 Python 日志记录 API。
旧版本
from scrapy import log
log.msg('MESSAGE', log.INFO)
新版本
import logging
logging.info('MESSAGE')
使用 Spider 进行日志记录保持不变,但在log()
方法之上,您还可以访问为 Spider 创建的自定义logger
来发出日志事件
class MySpider(scrapy.Spider):
def parse(self, response):
self.logger.info('Response received')
在日志记录文档中阅读更多内容:日志记录
Crawler API 重构 (GSoC 2014)¶
上一个 Google Summer of Code 的另一个里程碑是内部 API 的重构,旨在寻求更简单易用的方式。查看以下内容中的新核心接口:核心 API
当您从脚本运行 Scrapy 时,您将遇到这些更改的常见情况。以下是如何使用新 API 手动运行 Spider 的快速示例
from scrapy.crawler import CrawlerProcess
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})
process.crawl(MySpider)
process.start()
请记住,此功能仍在开发中,其 API 可能会更改,直到达到稳定状态。
查看更多运行 Scrapy 脚本的示例:常见实践
模块重定位¶
对模块进行了一次大规模的重新排列,试图改进 Scrapy 的整体结构。主要更改包括将各种子包分离到新的项目中,并将scrapy.contrib
和scrapy.contrib_exp
都分解成顶级包。在内部重定位之间保持了向后兼容性,而导入已弃用的模块则会发出警告,指示其新的位置。
重定位的完整列表¶
外包的包
注意
这些扩展进行了一些细微的更改,例如,一些设置名称已更改。请查看每个新存储库中的文档,以熟悉新的用法。
旧位置 |
新位置 |
---|---|
scrapy.commands.deploy |
scrapyd-client (在此处查看其他替代方案:部署 Spider) |
scrapy.contrib.djangoitem |
|
scrapy.webservice |
scrapy.contrib_exp
和scrapy.contrib
的解散
旧位置 |
新位置 |
---|---|
scrapy.contrib_exp.downloadermiddleware.decompression |
scrapy.downloadermiddlewares.decompression |
scrapy.contrib_exp.iterators |
scrapy.utils.iterators |
scrapy.contrib.downloadermiddleware |
scrapy.downloadermiddlewares |
scrapy.contrib.exporter |
scrapy.exporters |
scrapy.contrib.linkextractors |
scrapy.linkextractors |
scrapy.contrib.loader |
scrapy.loader |
scrapy.contrib.loader.processor |
scrapy.loader.processors |
scrapy.contrib.pipeline |
scrapy.pipelines |
scrapy.contrib.spidermiddleware |
scrapy.spidermiddlewares |
scrapy.contrib.spiders |
scrapy.spiders |
|
scrapy.extensions.* |
复数重命名和模块统一
旧位置 |
新位置 |
---|---|
scrapy.command |
scrapy.commands |
scrapy.dupefilter |
scrapy.dupefilters |
scrapy.linkextractor |
scrapy.linkextractors |
scrapy.spider |
scrapy.spiders |
scrapy.squeue |
scrapy.squeues |
scrapy.statscol |
scrapy.statscollectors |
scrapy.utils.decorator |
scrapy.utils.decorators |
类重命名
旧位置 |
新位置 |
---|---|
scrapy.spidermanager.SpiderManager |
scrapy.spiderloader.SpiderLoader |
设置重命名
旧位置 |
新位置 |
---|---|
SPIDER_MANAGER_CLASS |
SPIDER_LOADER_CLASS |
变更日志¶
新功能和增强功能
Python 日志记录 (问题 1060,问题 1235,问题 1236,问题 1240,问题 1259,问题 1278,问题 1286)
Dns 缓存大小和超时选项 (问题 1132)
支持 xmliter_lxml 中的命名空间前缀 (问题 963)
Reactor 线程池最大大小设置 (问题 1123)
允许 Spider 返回字典。(问题 1081)
添加 Response.urljoin() 助手 (问题 1086)
在 ~/.config/scrapy.cfg 中查找用户配置 (问题 1098)
处理 TLS SNI (问题 1101)
添加了 JmesSelect (问题 1016)
将 gzip 压缩添加到文件系统 http 缓存后端 (问题 1020)
链接提取器中的 CSS 支持 (问题 983)
httpcache dont_cache 元数据 #19 #689 (问题 821)
添加信号,在调度程序丢弃请求时发送 (问题 961)
避免下载大型响应 (问题 946)
允许在 CSVFeedSpider 中指定 quotechar (问题 882)
将引用者添加到“Spider 错误处理”日志消息中 (问题 795)
处理 robots.txt 一次 (问题 896)
GSoC 每个 Spider 的设置 (问题 854)
添加项目名称验证 (问题 817)
GSoC API 清理 (问题 816,问题 1128,问题 1147,问题 1148,问题 1156,问题 1185,问题 1187,问题 1258,问题 1268,问题 1276,问题 1285,问题 1284)
在关闭时对 httpcache 执行 leveldb 压缩 (问题 1297)
弃用和移除 (Deprecations and Removals)
弃用 htmlparser 链接提取器 (问题 1205)
从 FeedExporter 中删除已弃用的代码 (问题 1155)
for.15 兼容性的残留 (问题 925)
停止支持 CONCURRENT_REQUESTS_PER_SPIDER (问题 895)
删除旧的引擎代码 (问题 911)
弃用 SgmlLinkExtractor (问题 777)
重新定位 (Relocations)
将 exporters/__init__.py 移动到 exporters.py (问题 1242)
将 SpiderManager 重命名为 SpiderLoader (问题 1166)
删除 djangoitem (问题 1177)
删除 scrapy 部署命令 (问题 1102)
解散 contrib_exp (问题 1134)
删除根目录下的 bin 文件夹,修复了 #913 (问题 914)
删除基于 jsonrpc 的 Web 服务 (问题 859)
修复了设置中重定位路径的后向不兼容性 (问题 1267)
文档 (Documentation)
CrawlerProcess 文档 (问题 1190)
在描述中优先考虑网页抓取而不是屏幕抓取 (问题 1188)
对 Scrapy 教程进行了一些改进 (问题 1180)
将文件管道与图像管道一起记录 (问题 1150)
部署文档调整(issue 1164)
添加了涵盖 scrapyd-deploy 和 shub 的部署部分(issue 1124)
向项目模板添加更多设置(issue 1073)
对概述页面进行了一些改进(issue 1106)
更新了 docs/topics/architecture.rst 中的链接(issue 647)
文档重新排序主题(issue 1022)
更新 Request.meta 特殊键列表(issue 1071)
文档记录 download_timeout(issue 898)
文档简化扩展文档(issue 893)
内存泄漏文档(issue 894)
文档记录 Item Pipeline 的 from_crawler 方法(issue 904)
Spider_error 不支持 Deferreds(issue 1292)
修正和 Sphinx 相关的修复(issue 1220,issue 1219,issue 1196,issue 1172,issue 1171,issue 1169,issue 1160,issue 1154,issue 1127,issue 1112,issue 1105,issue 1041,issue 1082,issue 1033,issue 944,issue 866,issue 864,issue 796,issue 1260,issue 1271,issue 1293,issue 1298)
错误修复 (Bugfixes)
Item 多重继承修复(issue 353,issue 1228)
ItemLoader.load_item: 迭代字段的副本(issue 722)
修复 Deferred 中的未处理错误(RobotsTxtMiddleware)(issue 1131,issue 1197)
强制将 DOWNLOAD_TIMEOUT 读取为整数(issue 954)
scrapy.utils.misc.load_object 应该打印完整的回溯信息(issue 902)
修复“.local”主机名的错误(issue 878)
修复启用的扩展、中间件、管道信息不再打印的错误(issue 879)
修复 dont_merge_cookies 在 meta 中设置为 false 时行为异常的错误(issue 846)
Python 3 支持正在进行中
如果 twisted.conch 不可用,则禁用 scrapy.telnet(issue 1161)
修复 ajaxcrawl.py 中的 Python 3 语法错误(issue 1162)
针对 urllib 的更多 Python 3 兼容性更改(issue 1121)
在 Python 3 中,assertItemsEqual 重命名为 assertCountEqual。(issue 1070)
如果可用,导入 unittest.mock。(issue 1066)
将已弃用的 cgi.parse_qsl 更新为使用 six 的 parse_qsl(issue 909)
防止 Python 3 端口出现回归(issue 830)
PY3: 对于 Python 3,使用 MutableMapping(issue 810)
PY3: 使用 six.BytesIO 和 six.moves.cStringIO(issue 803)
PY3: 修复 xmlrpclib 和 email 导入(issue 801)
PY3: 对于 robotparser 和 urlparse,使用 six(issue 800)
PY3: 使用 six.iterkeys、six.iteritems 和 tempfile(issue 799)
PY3: 修复 has_key 并使用 six.moves.configparser(issue 798)
PY3: 使用 six.moves.cPickle(issue 797)
PY3 使在 Python3 中运行一些测试成为可能(issue 776)
测试 (Tests)
从 py3-ignores 中删除不必要的行(issue 1243)
修复在收集测试时 pytest 发出的剩余警告(issue 1206)
将文档构建添加到 travis(issue 1234)
TST 不要从已弃用的模块中收集测试。(issue 1165)
在测试中安装 service_identity 包以防止出现警告(issue 1168)
修复测试中已弃用的设置 API(issue 1152)
添加对使用 POST 方法且未提供主体内容的 webclient 的测试(issue 1089)
py3-ignores.txt 支持注释(issue 1044)
使一些断言现代化(issue 835)
selector.__repr__ 测试(issue 779)
代码重构
CSVFeedSpider 清理:使用 iterate_spider_output(issue 1079)
从 scrapy.utils.spider.iter_spider_output 中删除不必要的检查(issue 1078)
Pydispatch pep8(issue 992)
从 walk_modules() 中删除未使用的“load=False”参数(issue 871)
为了一致性,在
SpiderState
扩展中使用job_dir
帮助程序。(issue 805)将“sflo”局部变量重命名为不太神秘的“log_observer”(issue 775)
Scrapy 0.24.6 (2015-04-20)¶
在 PY2 下使用 unicode_escape 对无效 xpath 进行编码(commit 07cb3e5)
修复 IPython shell 范围问题并加载 IPython 用户配置(commit 2c8e573)
修复文档中的一个小错误(commit d694019)
修复一个小错误(commit f92fa83)
在“提取数据”中将 sel.xpath() 调用转换为 response.xpath()(commit c2c6d15)
Scrapy 0.24.5 (2015-02-25)¶
支持 Twisted 15.0.0 上新的 _getEndpoint Agent 签名(commit 540b9bc)
文档修复了几个引用(commit b4c454b)
文档修复了一个引用(commit e3c1260)
t.i.b.ThreadedResolver 现在是一个新式类(commit 9e13f42)
S3DownloadHandler: 修复带有带引号的路径/查询参数的请求的认证(commit cdb9a0b)
修复了 mailsender 文档中的变量类型(commit bb3a848)
重置 items_scraped 而不是 item_count(commit edb07a4)
关于贡献者应阅读哪些文档的初步注意事项消息(commit 7ee6f7a)
mitmproxy 0.10.1 也需要 netlib 0.10.1(commit 874fcdd)
将 mitmproxy 固定为 0.10.1,因为 >0.11 与测试不兼容(commit c6b21f0)
在本地测试 parse 命令而不是针对外部 url 测试(commit c3a6628)
修复 HTTPDownloadHandler 关闭连接池时 Twisted 出现的问题(commit d0bf957)
更新了关于动态 Item 类别的文档。(commit eeb589a)
合并拉取请求 #943 来自 Lazar-T/patch-3(commit 5fdab02)
错别字(commit b0ae199)
Twisted 需要 pywin32。关闭 #937(commit 5cb0cfb)
更新 install.rst(commit 781286b)
合并拉取请求 #928 来自 Lazar-T/patch-1(commit b415d04)
逗号代替句号(commit 627b9ba)
合并拉取请求 #885 来自 jsma/patch-1(commit de909ad)
更新 request-response.rst(commit 3f3263d)
SgmlLinkExtractor - 修复解析包含 Unicode 的 <area> 标签的错误(commit 49b40f0)
Scrapy 0.24.4 (2014-08-09)¶
mockserver 使用 pem 文件,并且 scrapy bench 需要它(commit 5eddc68b63)
scrapy bench 需要 scrapy.tests*(commit d6cb999)
Scrapy 0.24.3 (2014-08-09)¶
无需浪费 travis-ci 时间在 0.24 的 py3 上(commit 8e080c1)
更新安装文档(commit 1d0c096)
Scrapy 框架有一个 trove 分类器!(commit 4c701d7)
更新其他提到 w3lib 版本的地方(commit d109c13)
将 w3lib 需求更新到 1.8.0(commit 39d2ce5)
使用 w3lib.html.replace_entities()(remove_entities() 已弃用)(commit 180d3ad)
设置 zip_safe=False (提交 a51ee8b)
不再打包测试包 (提交 ee3b371)
scrapy.bat 文件不再需要 (提交 c3861cf)
现代化 setup.py (提交 362e322)
headers 不能处理非字符串值 (提交 94a5c65)
修复 ftp 测试用例 (提交 a274a7f)
travis-ci 构建的总时间大约需要 50 分钟才能完成 (提交 ae1e2cc)
更新 shell.rst 的错别字 (提交 e49c96a)
移除 shell 结果中奇怪的缩进 (提交 1ca489d)
改进了解释,澄清了博客文章作为来源,并在规范中添加了 XPath 字符串函数的链接 (提交 65c8f05)
重命名 UserTimeoutError 和 ServerTimeouterror #583 (提交 037f6ab)
在选择器文档中添加一些 XPath 提示 (提交 2d103e0)
修复测试以考虑 https://github.com/scrapy/w3lib/pull/23 (提交 f8d366a)
修复 get_func_args 最大递归问题 #728 (提交 81344ea)
根据 #560 更新输入/输出处理器示例。(提交 f7c4ea8)
修复教程中的 Python 语法。(提交 db59ed9)
添加隧道代理的测试用例 (提交 f090260)
修复使用隧道时将 Proxy-Authorization 标头泄漏到远程主机的错误 (提交 d8793af)
从 MIME 类型为“application/xml”的 XHTML 文档中提取链接 (提交 ed1f376)
合并来自 roysc/patch-1 的拉取请求 #793 (提交 91a1106)
修复 commands.rst 中的错别字 (提交 743e1e2)
为 settings.overrides.setdefault 提供更好的测试用例 (提交 e22daaf)
根据 http 1.1 定义使用 CRLF 作为行标记 (提交 5ec430b)
Scrapy 0.24.2 (2014-07-08)¶
使用可变映射代理已弃用的 settings.overrides 和 settings.defaults 属性 (提交 e5e8133)
目前尚不支持 python3 (提交 3cd6146)
更新 Debian 软件包的 Python 兼容版本集 (提交 fa5d76b)
文档修复发行说明中的格式 (提交 c6a9e20)
Scrapy 0.24.1 (2014-06-27)¶
修复已弃用的 CrawlerSettings 并提高与 .defaults 属性的向后兼容性 (提交 8e3f20a)
Scrapy 0.24.0 (2014-06-26)¶
增强功能¶
添加新的基于 lxml 的 LinkExtractor 以替换未维护的 SgmlLinkExtractor (问题 559,问题 761,问题 763)
清理设置 API - 每个蜘蛛设置的一部分 **GSoC 项目** (问题 737)
Telnet 控制台现在默认绑定到 127.0.0.1 (问题 699)
在 lxml XPath 评估中禁用智能字符串 (问题 535)
在 Scrapy shell 中公开当前爬虫 (问题 557)
改进测试套件,比较 CSV 和 XML 导出器 (问题 570)
新的
offsite/filtered
和offsite/domains
统计信息 (问题 566)在 CrawlSpider 中支持 process_links 作为生成器 (问题 555)
详细日志记录和 DupeFilter 的新统计计数器 (问题 553)
向
MailSender.send()
添加 mimetype 参数 (问题 602)泛化文件管道日志消息 (问题 622)
在 SGMLLinkExtractor 中用 html 实体替换不可编码的代码点 (问题 565)
将 SEP 文档转换为 rst 格式 (问题 629,问题 630,问题 638,问题 632,问题 636,问题 640,问题 635,问题 634,问题 639,问题 637,问题 631,问题 633,问题 641,问题 642)
允许像其他任何组件一样禁用下载器处理程序 (问题 650)
在请求由于太多重定向而被丢弃时记录日志 (问题 654)
使用来自 ppa 的最新 pypi 运行 pypy 测试 (问题 674)
使用 pytest 而不是 trial 运行测试套件 (问题 679)
在 tox 环境中构建文档并检查死链接 (问题 687)
在
url_is_from_any_domain()
中支持不区分大小写的域名 (问题 693)删除项目和蜘蛛模板中的 pep8 警告 (问题 698)
request_fingerprint
函数的测试和文档 (问题 597)更新 SEP-19 以用于 GSoC 项目
per-spider settings
(问题 705)当合约失败时将退出代码设置为非零 (问题 727)
添加一个设置来控制将哪个类实例化为 Downloader 组件 (问题 738)
在
item_dropped
信号中传递响应 (问题 724)记录
spider.closed()
快捷方式 (问题 719)记录
request_scheduled
信号 (问题 746)添加关于报告安全问题的说明 (问题 697)
对
scrapy list
命令的蜘蛛列表输出进行排序 (问题 742)多个文档增强和修复 (issue 575,issue 587,issue 590,issue 596,issue 610,issue 617,issue 618,issue 627,issue 613,issue 643,issue 654,issue 675,issue 663,issue 711,issue 714)
错误修复¶
在 RegexLinkExtractor 中创建链接时对 unicode URL 值进行编码 (issue 561)
在 ItemLoader 处理器中忽略 None 值 (issue 556)
修复 SGMLLinkExtractor 和 HtmlParserLinkExtractor 中存在内部标签时的链接文本 (issue 485,issue 574)
处理由 inspect.stack() 失败导致的错误 (issue 582)
修复动态 itemclass 示例中 type() 的用法 (issue 603)
使用 lucasdemarchi/codespell 修复错别字 (issue 628)
修复 SgmlLinkExtractor 中 attrs 参数的默认值为元组 (issue 661)
修复站点地图读取器中的 XXE 漏洞 (issue 676)
修复引擎以支持过滤后的起始请求 (issue 707)
修复 url 没有主机名时 offsite 中间件的情况 (issue 745)
测试套件不再需要 PIL (issue 585)
Scrapy 0.22.2 (发布日期:2014-02-14)¶
修复对不存在的 engine.slots 的引用。关闭 #593 (commit 13c099a)
downloaderMW 文档错别字 (spiderMW 文档复制残余) (commit 8ae11bf)
更正错别字 (commit 1346037)
Scrapy 0.22.1 (发布日期:2014-02-08)¶
localhost666 在某些情况下可以解析 (commit 2ec2279)
测试 inspect.stack 失败 (commit cc3eda3)
处理 inspect.stack() 失败的情况 (commit 8cb44f9)
修复对已弃用类子类的错误检查。关闭 #581 (commit 46d98d6)
文档:最终蜘蛛示例使用 4 个空格缩进 (commit 13846de)
合并 #485 后修复 HtmlParserLinkExtractor 和测试 (commit 368a946)
BaseSgmlLinkExtractor:修复链接具有内部标签时缺少空格的问题 (commit b566388)
BaseSgmlLinkExtractor:添加具有内部标签的链接单元测试 (commit c1cb418)
BaseSgmlLinkExtractor:修复 unknown_endtag(),使其仅在结束标签与开始标签匹配时设置 current_link=None (commit 7e4d627)
修复 Travis-CI 构建的测试 (commit 76c7e20)
将不可编码的代码点替换为 html 实体。修复 #562 和 #285 (commit 5f87b17)
RegexLinkExtractor:在创建链接时对 URL unicode 值进行编码 (commit d0ee545)
使用最新输出更新教程抓取输出。 (commit 8da65de)
使用爬虫引用更新 shell 文档,并修复了实际的 shell 输出。 (commit 875b9ab)
PEP8 小幅修改。 (commit f89efaf)
在 Scrapy shell 中公开当前爬虫。 (commit 5349cec)
未使用的 re 导入和 PEP8 小幅修改。 (commit 387f414)
使用 ItemLoader 时忽略 None 值。 (commit 0632546)
文档:修复 HTTPCACHE_STORAGE 默认值中的错别字,现在为 Filesystem 而不是 Dbm。 (commit cde9a8c)
将 Ubuntu 设置说明显示为代码字面量 (commit fb5c9c5)
更新 Ubuntu 安装说明 (commit 70fb105)
合并拉取请求 #550 来自 stray-leone/patch-1 (commit 6f70b6a)
修改 Scrapy Ubuntu 软件包的版本 (commit 725900d)
修复 0.22.0 发布日期 (commit af0219a)
修复 news.rst 中的错别字并删除 (尚未发布) 标题 (commit b7f58f4)
Scrapy 0.22.0 (发布日期:2014-01-17)¶
增强功能¶
[**向后不兼容**] 将 HTTPCacheMiddleware 后端切换到文件系统 (issue 541) 要恢复旧后端,请将
HTTPCACHE_STORAGE
设置为scrapy.contrib.httpcache.DbmCacheStorage
添加一个中间件来根据 google 定义的规则抓取 ajax 可抓取页面 (issue 343)
将 scrapy.spider.BaseSpider 重命名为 scrapy.spider.Spider (issue 510,issue 519)
选择器默认注册 EXSLT 命名空间 (issue 472)
统一项加载器,类似于选择器重命名 (issue 461)
使
RFPDupeFilter
类易于子类化 (issue 533)提高测试覆盖率并支持即将推出的 Python 3 (issue 525)
将设置和中间件中的启动信息提升到 INFO 级别 (issue 520)
在
get_func_args
实用程序中支持部分应用 (issue 506,issue:504)允许通过 tox 运行单个测试 (issue 503)
更新链接提取器忽略的扩展 (issue 498)
添加中间件方法以获取文件/图像/缩略图路径 (issue 490)
改进 offsite 中间件测试 (issue 478)
添加一种方法来跳过 RefererMiddleware 设置的默认 Referer 标头 (issue 475)
不要在默认的
Accept-Encoding
标头中发送x-gzip
(issue 469)支持使用设置定义 http 错误处理 (issue 466)
在发现遗留代码时使用现代 python 习惯用法 (issue 497)
改进和更正文档 (issue 527,issue 524,issue 521,issue 517,issue 512,issue 505,issue 502,issue 489,issue 465,issue 460,issue 425,issue 536)
修复¶
更新 CrawlSpider 模板中的 Selector 类导入 (issue 484)
修复对
engine.slots
的不存在引用 (issue 464)不要尝试在非 TextResponse 实例上调用
body_as_unicode()
(issue 462)在子类化 XPathItemLoader 时发出警告,以前它仅在实例化时发出警告。 (issue 523)
在子类化 XPathSelector 时发出警告,以前它仅在实例化时发出警告。 (issue 537)
修复
FormRequest.from_response()
中的 url 覆盖 (issue 507)修复 pip 1.5 下的测试运行程序 (issue 513)
修复蜘蛛名称为 unicode 时的日志记录错误 (issue 479)
Scrapy 0.20.2 (发布日期:2013-12-09)¶
使用 Selector 更改更新 CrawlSpider 模板 (commit 6d1457d)
修复教程中的方法名称。关闭 GH-480 (commit b4fc359
Scrapy 0.20.1 (发布日期 2013-11-28)¶
需要 `include_package_data` 从已发布的源代码构建 wheel 文件 (commit 5ba1ad5)
`process_parallel` 在其内部延迟对象中泄漏了错误。关闭 #458 (commit 419a780)
Scrapy 0.20.0 (发布日期 2013-11-08)¶
增强功能¶
Request/Response 的 url/body 属性现在是不可变的(修改它们已被弃用很长时间了)
ITEM_PIPELINES
现在定义为字典(而不是列表)站点地图爬虫可以获取备用 URL (issue 360)
Selector.remove_namespaces()
现在从元素的属性中删除命名空间。(issue 416)为 Python 3.3+ 铺平道路 (issue 435,issue 436,issue 431,issue 452)
新的项目导出器使用带嵌套支持的原生 Python 类型 (issue 366)
调整 HTTP1.1 池大小,使其与设置中定义的并发性匹配 (commit b43b5f575)
`scrapy.mail.MailSender` 现在可以通过 TLS 连接或使用 STARTTLS 升级 (issue 327)
新的 FilesPipeline,其功能从 ImagesPipeline 中分解出来 (issue 370,issue 409)
建议使用 Pillow 而不是 PIL 进行图像处理 (issue 317)
为 Ubuntu Quantal 和 Raring 添加了 Debian 软件包 (commit 86230c0)
模拟服务器(用于测试)可以监听 HTTPS 请求 (issue 410)
从多个核心组件中删除多爬虫支持 (issue 422,issue 421,issue 420,issue 419,issue 423,issue 418)
Travis-CI 现在针对
w3lib
和queuelib
Python 包的开发版本测试 Scrapy 的更改。将 pypy 2.1 添加到持续集成测试中 (commit ecfa7431)
使用 importlib 进行参数化导入 (issue 445)
处理 Python 2.7.5 中引入的影响 XmlItemExporter 的回归 (issue 372)
修复 SIGINT 信号下爬取的关闭问题 (issue 450)
不要在 FormRequest.from_response 中提交 `reset` 类型的输入 (commit b326b87)
当请求错误回调引发异常时,不要抑制下载错误 (commit 684cfc0)
错误修复¶
修复 Django 1.6 下的测试 (commit b6bed44c)
许多错误修复,用于在使用 HTTP 1.1 下载处理程序断开连接时重试中间件
修复 Twisted 版本之间的不一致 (issue 406)
修复 setup.py 中的无效变量名 (issue 429)
修复教程引用 (issue 387)
改进请求-响应文档 (issue 391)
改进 Django 集成文档 (issue 404)
记录
bindaddress
请求元数据 (commit 37c24e01d7)改进
Request
类文档 (issue 226)
其他¶
致谢¶
感谢所有为本次发布做出贡献的人!
按提交次数排序的贡献者列表
69 Daniel Graña <dangra@...>
37 Pablo Hoffman <pablo@...>
13 Mikhail Korobov <kmike84@...>
9 Alex Cepoi <alex.cepoi@...>
9 alexanderlukanin13 <alexander.lukanin.13@...>
8 Rolando Espinoza La fuente <darkrho@...>
8 Lukasz Biedrycki <lukasz.biedrycki@...>
6 Nicolas Ramirez <nramirez.uy@...>
3 Paul Tremberth <paul.tremberth@...>
2 Martin Olveyra <molveyra@...>
2 Stefan <misc@...>
2 Rolando Espinoza <darkrho@...>
2 Loren Davie <loren@...>
2 irgmedeiros <irgmedeiros@...>
1 Stefan Koch <taikano@...>
1 Stefan <cct@...>
1 scraperdragon <dragon@...>
1 Kumara Tharmalingam <ktharmal@...>
1 Francesco Piccinno <stack.box@...>
1 Marcos Campal <duendex@...>
1 Dragon Dave <dragon@...>
1 Capi Etheriel <barraponto@...>
1 cacovsky <amarquesferraz@...>
1 Berend Iwema <berend@...>
Scrapy 0.18.4 (发布日期 2013-10-10)¶
IPython 拒绝更新命名空间。修复 #396 (commit 3d32c4f)
修复在 shell 命令中替换请求时的 AlreadyCalledError。关闭 #407 (commit b1d8919)
修复 start_requests 的延迟加载和早期挂起 (commit 89faf52)
Scrapy 0.18.3 (发布日期 2013-10-03)¶
修复 start requests 延迟计算的回归 (commit 12693a5)
表单:不要提交重置输入 (commit e429f63)
增加单元测试超时时间以减少 travis 误报失败 (commit 912202e)
将主分支修复反向移植到 json 导出器 (commit cfc2d46)
修复权限并在生成 sdist tarball 之前设置 umask (commit 06149e0)
Scrapy 0.18.2 (发布日期 2013-09-03)¶
反向移植
scrapy check
命令修复和向后兼容的多爬虫进程(issue 339)
Scrapy 0.18.1 (发布日期 2013-08-27)¶
删除 cherry-pick 更改添加的额外导入 (commit d20304e)
修复 Twisted 11.0.0 之前的版本下的爬取测试 (commit 1994f38)
py26 无法格式化零长度字段 {} (commit abf756f)
测试未绑定响应上的 PotentiaDataLoss 错误 (commit b15470d)
将没有内容长度或传输编码的响应视为良好响应 (commit c4bf324)
如果未启用 http11 处理程序,则不包含 ResponseFailed (commit 6cbe684)
新的 HTTP 客户端将连接丢失包装在 ResponseFailed 异常中。修复 #373 (commit 1a20bba)
限制 travis-ci 构建矩阵 (commit 3b01bb8)
合并拉取请求 #375 来自 peterarenot/patch-1 (commit fa766d7)
修复使其引用正确的文件夹 (commit 3283809)
添加 Quantal 和 Raring 以支持 Ubuntu 版本 (commit 1411923)
修复重试中间件,该中间件在升级到 http1 客户端后未重试某些连接错误,关闭 GH-373 (commit bb35ed0)
修复 Python 2.7.4 和 2.7.5 中的 XmlItemExporter (commit de3e451)
0.18 版发行说明的次要更新 (commit c45e5f1)
修复贡献者列表格式 (commit 0b60031)
Scrapy 0.18.0 (发布日期 2013-08-09)¶
对使用 Tox 运行的测试套件进行了大量改进,包括在 pypi 上进行测试的方法
处理 AJAX 可爬取 URL 的 GET 参数 (commit 3fe2a32)
使用 lxml recover 选项解析站点地图 (issue 347)
修复按主机名而不是按 netloc 合并 cookie 的错误 (issue 352)
支持使用标志设置禁用
HttpCompressionMiddleware
(issue 359)在
XMLFeedSpider
中使用iternodes
解析器支持 xml 命名空间 (issue 12)支持
dont_cache
请求元数据标志 (issue 19)修复 Python 2.7.4 中
scrapy.utils.gz.gunzip
由于更改而导致的错误 (commit 4dc76e)修复
SgmlLinkExtractor
上的 URL 编码错误 (issue 24)修复
TakeFirst
处理器不应丢弃零 (0) 值的错误 (issue 59)支持 xml 导出器中的嵌套项目 (issue 66)
改进 cookie 处理性能 (issue 77)
仅记录一次重复过滤的请求 (issue 105)
将重定向中间件拆分为基于状态和元数据的中间件 (issue 78)
支持在
FormRequest.from_response
中使用 xpath 表达式选择表单 (issue 185)修复
SgmlLinkExtractor
中的 Unicode 解码错误 (issue 199)修复 pypi 解释器上的信号分发错误 (issue 205)
改进请求延迟和并发处理 (issue 206)
将 RFC2616 缓存策略添加到
HttpCacheMiddleware
(issue 212)允许自定义引擎记录的消息 (issue 214)
使用 setuptools 入口点扩展 Scrapy 命令 (issue 260)
允许蜘蛛的
allowed_domains
值设置为集合或元组 (issue 261)支持
settings.getdict
(issue 269)简化内部
scrapy.core.scraper
槽位处理 (issue 271)添加
Item.copy
(issue 290)收集空闲下载器槽位 (issue 297)
添加
ftp://
方案的下载处理器 (issue 329)添加下载器基准测试 Web 服务器和蜘蛛工具 基准测试
将持久性(磁盘上)队列移至一个单独的项目 (queuelib),Scrapy 现在依赖于它
使用外部库添加 Scrapy 命令 (issue 260)
为
scrapy
命令行工具添加了--pdb
选项添加了
XPathSelector.remove_namespaces
,它允许为了方便(使用无命名空间的 XPath)从 XML 文档中删除所有命名空间。在 选择器 中有文档记录。对蜘蛛契约进行了一些改进
新的默认中间件名为 MetaRefreshMiddleware,它处理元刷新 html 标签重定向,
MetaRefreshMiddleware 和 RedirectMiddleware 具有不同的优先级以解决 #62
为蜘蛛添加了 from_crawler 方法
添加了使用模拟服务器的系统测试
对 macOS 兼容性进行了更多改进(感谢 Alex Cepoi)
对单例和多蜘蛛支持进行了更多清理(感谢 Nicolas Ramirez)
支持自定义下载槽位
为“shell”命令添加了 –spider 选项。
Scrapy 启动时记录覆盖的设置
感谢所有为本次发布做出贡献的人。以下是按提交次数排序的贡献者列表
130 Pablo Hoffman <pablo@...>
97 Daniel Graña <dangra@...>
20 Nicolás Ramírez <nramirez.uy@...>
13 Mikhail Korobov <kmike84@...>
12 Pedro Faustino <pedrobandim@...>
11 Steven Almeroth <sroth77@...>
5 Rolando Espinoza La fuente <darkrho@...>
4 Michal Danilak <mimino.coder@...>
4 Alex Cepoi <alex.cepoi@...>
4 Alexandr N Zamaraev (aka tonal) <tonal@...>
3 paul <paul.tremberth@...>
3 Martin Olveyra <molveyra@...>
3 Jordi Llonch <llonchj@...>
3 arijitchakraborty <myself.arijit@...>
2 Shane Evans <shane.evans@...>
2 joehillen <joehillen@...>
2 Hart <HartSimha@...>
2 Dan <ellisd23@...>
1 Zuhao Wan <wanzuhao@...>
1 whodatninja <blake@...>
1 vkrest <v.krestiannykov@...>
1 tpeng <pengtaoo@...>
1 Tom Mortimer-Jones <tom@...>
1 Rocio Aramberri <roschegel@...>
1 Pedro <pedro@...>
1 notsobad <wangxiaohugg@...>
1 Natan L <kuyanatan.nlao@...>
1 Mark Grey <mark.grey@...>
1 Luan <luanpab@...>
1 Libor Nenadál <libor.nenadal@...>
1 Juan M Uys <opyate@...>
1 Jonas Brunsgaard <jonas.brunsgaard@...>
1 Ilya Baryshev <baryshev@...>
1 Hasnain Lakhani <m.hasnain.lakhani@...>
1 Emanuel Schorsch <emschorsch@...>
1 Chris Tilden <chris.tilden@...>
1 Capi Etheriel <barraponto@...>
1 cacovsky <amarquesferraz@...>
1 Berend Iwema <berend@...>
Scrapy 0.16.5 (发布于 2013-05-30)¶
当 Scrapy 部署重定向到新端点时,遵守请求方法 (commit 8c4fcee)
修复不准确的下载器中间件文档。refs #280 (commit 40667cb)
文档:删除指向 diveintopython.org 的链接,该链接不再可用。closes #246 (commit bd58bfa)
在无效的 html5 文档中查找表单节点 (commit e3d6945)
修复将 attrs 类型标记为 bool 而不是列表的拼写错误 (commit a274276)
Scrapy 0.16.4 (发布于 2013-01-23)¶
修复文档中的拼写错误 (commit 6d2b3aa)
添加关于禁用扩展的文档。refs #132 (commit c90de33)
修复错误消息格式。log.err() 不支持酷炫格式,并且当发生错误时,消息为:“ERROR: Error processing %(item)s” (commit c16150c)
整理并改进图像管道错误日志 (commit 56b45fc)
修复文档中的错别字 (commit 243be84)
添加文档主题:广泛抓取和常见实践 (commit 1fbb715)
修复 Scrapy parse 命令在未显式指定蜘蛛时的错误。closes #209 (commit c72e682)
更新 docs/topics/commands.rst (commit 28eac7a)
Scrapy 0.16.3 (发布于 2012-12-07)¶
使用下载延迟时删除并发限制,并确保仍然强制执行请求间延迟 (commit 487b9b5)
图像管道失败时添加错误详细信息 (commit 8232569)
改进 macOS 兼容性 (commit 8dcf8aa)
setup.py:使用 README.rst 填充 long_description (commit 7b5310d)
文档:删除对 ClientForm 的过时引用 (commit 80f9bb6)
更正默认存储后端的文档 (commit 2aa491b)
文档:从常见问题解答中删除损坏的 proxyhub 链接 (commit bdf61c4)
修复 SpiderOpenCloseLogging 示例中的文档错别字 (commit 7184094)
Scrapy 0.16.2 (发布于 2012-11-09)¶
Scrapy 契约:python2.6 兼容性 (commit a4a9199)
Scrapy 契约详细选项 (commit ec41673)
为 Scrapy 契约提供正确的类似 unittest 的输出 (commit 86635e4)
将 open_in_browser 添加到调试文档中 (commit c9b690d)
从设置文档中删除对全局 Scrapy 统计信息的引用 (commit dd55067)
修复 Windows 平台上的 SpiderState 错误 (commit 58998f4)
Scrapy 0.16.1 (发布于 2012-10-26)¶
修复 LogStats 扩展,它在 0.16 版本之前的错误合并后被破坏 (commit 8c780fd)
更好的 scrapy.conf.settings 向后兼容性 (commit 3403089)
扩展了有关如何从扩展访问爬虫统计信息的文档 (commit c4da0b5)
删除 .hgtags(Scrapy 现在使用 git,因此不再需要)(commit d52c188)
修复 rst 标题下的破折号 (commit fa4f7f9)
在新闻中设置 0.16.0 的发布日期 (commit e292246)
Scrapy 0.16.0 (发布于 2012-10-18)¶
Scrapy 更改
添加了 蜘蛛契约,这是一种以正式/可重现的方式测试蜘蛛的机制
为
runspider
命令添加了-o
和-t
选项记录了 自动节流扩展 并将其添加到默认安装的扩展中。您仍然需要使用
AUTOTHROTTLE_ENABLED
启用它主要的统计信息收集重构:删除了全局/每个蜘蛛统计信息的划分,删除了与统计信息相关的信号(
stats_spider_opened
等)。统计信息现在变得简单多了,在统计信息收集器 API 和信号上保持了向后兼容性。为蜘蛛中间件添加了
process_start_requests()
方法删除了 Signals 单例。现在应通过 Crawler.signals 属性访问 Signals。有关更多信息,请参阅信号文档。
删除了 Stats Collector 单例。现在可以通过 Crawler.stats 属性访问 Stats。有关更多信息,请参阅统计信息收集文档。
记录了 核心 API
lxml
现在是默认的选择器后端,而不是libxml2
移植了 FormRequest.from_response() 以使用 lxml 而不是 ClientForm
删除了模块:
scrapy.xlib.BeautifulSoup
和scrapy.xlib.ClientForm
SitemapSpider:添加了对以 .xml 和 .xml.gz 结尾的站点地图 URL 的支持,即使它们宣传了错误的内容类型 (commit 10ed28b)
StackTraceDump 扩展:还转储 trackref 活动引用 (commit fe2ce93)
嵌套项现在在 JSON 和 JSONLines 导出器中得到完全支持
添加了
cookiejar
Request 元数据键以支持每个蜘蛛的多个 Cookie 会话将编码检测代码分离到 w3lib.encoding,并将 Scrapy 代码移植到使用该模块
放弃对 Python 2.5 的支持。请参阅 https://www.zyte.com/blog/scrapy-0-15-dropping-support-for-python-2-5/
放弃对 Twisted 2.5 的支持
添加了
REFERER_ENABLED
设置,以控制推荐来源中间件将默认用户代理更改为:
Scrapy/VERSION (+https://scrapy.net.cn)
从
scrapy.contrib.linkextractors.image
中删除了(未记录的)HTMLImageLinkExtractor
类删除了每个蜘蛛的设置(将由实例化多个爬虫对象替换)
USER_AGENT
蜘蛛属性将不再起作用,请改用user_agent
属性DOWNLOAD_TIMEOUT
蜘蛛属性将不再起作用,请改用download_timeout
属性删除了
ENCODING_ALIASES
设置,因为编码自动检测已移至w3lib库将DjangoItem提升到主contrib
LogFormatter方法现在返回字典(而不是字符串),以支持延迟格式化(issue 164,commit dcef7b0)
下载器处理器(
DOWNLOAD_HANDLERS
设置)现在接收设置作为__init__
方法的第一个参数用(更可移植的)resource模块替换内存使用情况统计,删除了
scrapy.utils.memory
模块删除信号:
scrapy.mail.mail_sent
删除了
TRACK_REFS
设置,现在trackrefs始终启用DBM现在是HTTP缓存中间件的默认存储后端
日志消息数量(每个级别)现在通过Scrapy统计信息进行跟踪(统计信息名称:
log_count/LEVEL
)接收到的响应数量现在通过Scrapy统计信息进行跟踪(统计信息名称:
response_received_count
)删除了
scrapy.log.started
属性
Scrapy 0.14.4¶
添加了对支持的Ubuntu发行版的精确版本(commit b7e46df)
修复了在https://groups.google.com/forum/#!topic/scrapy-users/qgVBmFybNAQ/discussion中报告的json-rpc网络服务中的错误。还从extras/scrapy-ws.py中删除了不再支持的“run”命令(commit 340fbdb)
内容类型http等效的元标记属性可以按任意顺序排列。#123(commit 0cb68af)
用更标准的“from PIL import Image”替换“import Image”。关闭#88(commit 4d17048)
将试验状态作为bin/runtests.sh退出值返回。#118(commit b7b2e7f)
Scrapy 0.14.3¶
忘记包含pydispatch许可证。#118(commit fd85f9c)
在源代码分发版中包含测试套件使用的egg文件。#118(commit c897793)
更新项目模板中的文档字符串,以避免与genspider命令混淆,genspider命令可能被视为高级功能。引用#107(commit 2548dcc)
在docs/topics/firebug.rst中添加了关于Google目录关闭的注释(commit 668e352)
当为空时不要丢弃插槽,只需保存在另一个字典中,以便在需要时再次循环使用。(commit 8e9f607)
在libxml2支持的选择器中,不要在处理Unicode XPath时失败(commit b830e95)
修复了Request对象文档中的一个小错误(commit bf3c9ee)
修复了链接提取器文档中的一个小缺陷(commit ba14f38)
删除了一些与Scrapy中SQLite支持相关的老旧代码(commit 0665175)
Scrapy 0.14.2¶
在计算校验和之前,将缓冲区指向文件的开头。引用#92(commit 6a5bef2)
在持久化图像之前计算图像校验和。关闭#92(commit 9817df1)
删除缓存故障中的泄漏引用(commit 673a120)
修复了MemoryUsage扩展中的错误:get_engine_status() 恰好需要1个参数(给出0个)(commit 11133e9)
修复了HTTP压缩中间件上的struct.error。关闭#87(commit 1423140)
AJAX爬取对于Unicode URL没有扩展(commit 0de3fb4)
捕获start_requests迭代器错误。引用#83(commit 454a21d)
加速libxml2 XPathSelector(commit 2fbd662)
根据最近的更改更新了版本控制文档(commit 0a070f5)
scrapyd:修复了文档链接(commit 2b4e4c3)
extras/makedeb.py:不再从git获取版本(commit caffe0e)
Scrapy 0.14.1¶
extras/makedeb.py:不再从git获取版本(commit caffe0e)
将版本提升到0.14.1(commit 6cb9e1c)
修复了对教程目录的引用(commit 4b86bd6)
文档:从Request.replace()中删除了重复的回调参数(commit 1aeccdd)
修复了scrapyd文档的格式(commit 8bf19e6)
转储所有正在运行线程的堆栈,并修复StackTraceDump扩展转储的引擎状态(commit 14a8e6e)
添加了关于为什么我们在boto图像上传中禁用ssl的注释(commit 5223575)
当对S3进行太多并行连接时,SSL握手挂起(commit 63d583d)
更改教程以遵循dmoz网站上的更改(commit bcb3198)
避免Twisted>=11.1.0中的_disconnectedDeferred AttributeError异常(commit 98f3f87)
允许蜘蛛设置自动节流最大并发数(commit 175a4b5)
Scrapy 0.14¶
新功能和设置¶
支持可爬取AJAX的URL
新的持久调度程序,将请求存储在磁盘上,允许暂停和恢复爬取(r2737)
为
scrapy crawl
添加了-o
选项,这是将抓取的项目转储到文件(或使用-
转储到标准输出)的快捷方式添加了对S3下载器处理程序的boto 2.0支持(r2763)
在请求错误回调中,现在可以在
failure.request
属性中接收到有问题的请求(r2738)- 对下载器进行了重大重构,以支持每个域/IP的并发限制(r2732)
CONCURRENT_REQUESTS_PER_SPIDER
设置已被弃用,并替换为
查看文档以了解更多详细信息
添加了内置缓存DNS解析器(r2728)
将与Amazon AWS相关的组件/扩展(SQS蜘蛛队列,SimpleDB统计信息收集器)移至单独的项目:[scaws](https://github.com/scrapinghub/scaws)(r2706,r2714)
将蜘蛛队列移至scrapyd:
scrapy.spiderqueue
->scrapyd.spiderqueue
(r2708)将sqlite实用程序移至scrapyd:
scrapy.utils.sqlite
->scrapyd.sqlite
(r2781)真正支持在
start_requests()
方法中返回迭代器。当蜘蛛空闲时,迭代器现在在爬取过程中被消耗(r2704)添加了
REDIRECT_ENABLED
设置以快速启用/禁用重定向中间件(r2697)添加了
RETRY_ENABLED
设置以快速启用/禁用重试中间件(r2694)添加了
CloseSpider
异常以手动关闭蜘蛛(r2691)通过添加对HTML5元字符集声明的支持来改进编码检测(r2690)
重构了关闭爬虫的行为,使其在关闭爬虫之前等待所有下载完成并被爬虫处理(r2688)。
添加了
SitemapSpider
(请参阅“爬虫”页面中的文档)(r2658)。添加了
LogStats
扩展,用于定期记录基本统计信息(例如已抓取的页面和提取的项目)(r2657)。使压缩响应的处理更加健壮(#319,r2643)。现在 Scrapy 将尝试尽可能地解压缩压缩响应,而不是因
IOError
而失败。简化了 !MemoryDebugger 扩展,使其使用统计信息来转储内存调试信息(r2639)。
添加了用于编辑爬虫的新命令:
scrapy edit
(r2636)和-e
标志到genspider
命令中使用它(r2653)。将项目的默认表示形式更改为漂亮打印的字典。(r2631)。这通过使日志在默认情况下更易读来改善了默认日志记录,适用于“Scraped”和“Dropped”行。
添加了
spider_error
信号(r2628)。添加了
COOKIES_ENABLED
设置(r2625)。统计信息现在被转储到 Scrapy 日志中(
STATS_DUMP
设置的默认值已更改为True
)。这样做是为了让 Scrapy 用户更加了解 Scrapy 统计信息以及在那里收集的数据。添加了对动态调整下载延迟和最大并发请求的支持(r2599)。
添加了新的 DBM HTTP 缓存存储后端(r2576)。
向 Scrapyd 添加了
listjobs.json
API(r2571)。CsvItemExporter
:添加了join_multivalued
参数(r2578)。向
xmliter_lxml
添加了命名空间支持(r2552)。通过使
COOKIES_DEBUG
更友好并对其进行文档化来改进了 Cookie 中间件(r2579)。对 Scrapyd 和链接提取器进行了多项改进。
代码重排并删除¶
- 合并了传递的项目和提取的项目概念,因为它们在过去经常造成混淆。这意味着:(r2630)。
删除了原始的
item_scraped
信号。将原始的
item_passed
信号重命名为item_scraped
。删除了旧的日志行
Scraped Item...
。将旧的日志行
Passed Item...
重命名为Scraped Item...
行,并将其降级到DEBUG
级别。
删除了未使用的函数:
scrapy.utils.request.request_info()
(r2577)。从
examples/googledir
中删除了 googledir 项目。现在 GitHub 上有一个名为dirbot
的新示例项目:https://github.com/scrapy/dirbot。删除了 Scrapy 项目中默认字段值的支持(r2616)。
删除了实验性的 CrawlSpider v2(r2632)。
删除了调度程序中间件以简化架构。重复项过滤器现在在调度程序本身中完成,使用与之前相同的重复项过滤类(
DUPEFILTER_CLASS
设置)(r2640)。删除了将 URL 传递给
scrapy crawl
命令的支持(请改用scrapy parse
)(r2704)。删除了已弃用的执行队列(r2704)。
删除了(未记录的)爬虫上下文扩展(来自 scrapy.contrib.spidercontext)(r2780)。
删除了
CONCURRENT_SPIDERS
设置(请改用 scrapyd maxproc)(r2789)。重命名了核心组件的属性:downloader.sites -> downloader.slots,scraper.sites -> scraper.slots(r2717,r2718)。
将设置
CLOSESPIDER_ITEMPASSED
重命名为CLOSESPIDER_ITEMCOUNT
(r2655)。保留了向后兼容性。
Scrapy 0.12¶
类似 #NNN 的数字引用了旧问题跟踪器 (Trac) 中的工单,该跟踪器已不再可用。
新功能和改进¶
传递的项目现在在
item_passed
的item
参数中发送(#273)。向
scrapy version
命令添加了详细选项,对错误报告很有用(#298)。HTTP 缓存现在默认存储在项目数据目录中(#279)。
添加了项目数据存储目录(#276,#277)。
记录了 Scrapy 项目的文件结构(请参阅命令行工具文档)。
XPath 选择器的新 lxml 后端(#147)。
每个爬虫的设置(#245)。
支持退出代码以在 Scrapy 命令中发出错误信号(#248)。
向
scrapy shell
命令添加了-c
参数。使
libxml2
可选(#260)。新的
deploy
命令(#261)。添加了
CLOSESPIDER_PAGECOUNT
设置(#253)。添加了
CLOSESPIDER_ERRORCOUNT
设置(#254)。
Scrapyd 更改¶
Scrapyd 现在每个爬虫使用一个进程。
它为每个爬虫运行存储一个日志文件,并轮换它们,保留每个爬虫的最新 5 个日志(默认情况下)。
添加了一个最小的 Web UI,默认情况下可在 https://127.0.0.1:6800 访问。
现在有一个
scrapy server
命令来启动当前项目的 Scrapyd 服务器。
设置更改¶
添加了
HTTPCACHE_ENABLED
设置(默认为 False)以启用 HTTP 缓存中间件。更改了
HTTPCACHE_EXPIRATION_SECS
的语义:现在零表示“永不过期”。
已弃用/过时的功能¶
已弃用
runserver
命令,而支持server
命令,该命令启动 Scrapyd 服务器。另请参阅:Scrapyd 更改。已弃用
queue
命令,而支持使用 Scrapyd 的schedule.json
API。另请参阅:Scrapyd 更改。删除了 !LxmlItemLoader(从未升级到主 contrib 的实验性 contrib)。
Scrapy 0.10¶
类似 #NNN 的数字引用了旧问题跟踪器 (Trac) 中的工单,该跟踪器已不再可用。
新功能和改进¶
名为
scrapyd
的新 Scrapy 服务,用于在生产环境中部署 Scrapy 爬虫(#218)(文档可用)。简化了 Images 管道的使用,现在不需要子类化自己的 Images 管道了(#217)。
Scrapy shell 现在默认显示 Scrapy 日志(#206)。
在公共基础代码和称为“爬虫队列”的可插拔后端中重构了执行队列(#220)。
新的持久性爬虫队列(基于 SQLite)(#198),默认情况下可用,允许在服务器模式下启动 Scrapy,然后安排爬虫运行。
添加了 Scrapy 命令行工具及其所有可用子命令的文档。(文档可用)。
带有可插拔后端的 Feed 导出器(#197)(文档可用)。
延迟信号(#193)。
向项目管道添加了两个新方法 open_spider()、close_spider(),并支持延迟(#195)。
支持按爬虫覆盖默认请求标头(#181)。
用具有类似功能但不依赖于 Twisted 插件的管理器替换了默认的爬虫管理器(#186)。
将 Debian 包拆分为两个包——库和服务(#187)。
Scrapy 日志重构(#188)。
用于在不同运行之间保持持久性爬虫上下文的新的扩展(#203)。
添加了
dont_redirect
request.meta 密钥以避免重定向(#233)。添加了
dont_retry
request.meta 密钥以避免重试(#234)。
命令行工具更改¶
新增了
scrapy
命令,取代了旧的scrapy-ctl.py
(#199) - 现在只有一个全局的scrapy
命令,而不是每个项目一个scrapy-ctl.py
- 为 Windows 添加了scrapy.bat
脚本,方便在 Windows 上运行。为命令行工具添加了 bash 自动补全功能 (#210)
将命令
start
重命名为runserver
(#209)
API 更改¶
Request 对象的
url
和body
属性现在是只读的 (#230)Request.copy()
和Request.replace()
现在也复制它们的callback
和errback
属性 (#231)从
scrapy.contrib
中删除了UrlFilterMiddleware
(默认情况下已禁用)如果一个 spider 没有 allowed_domains 属性,则 Offsite 中间件不会过滤掉来自该 spider 的任何请求 (#225)
删除了 Spider Manager 的
load()
方法。现在 spiders 在__init__
方法本身中加载。- Scrapy Manager(现称为“Crawler”)的更改
scrapy.core.manager.ScrapyManager
类重命名为scrapy.crawler.Crawler
scrapy.core.manager.scrapymanager
单例移动到scrapy.project.crawler
移动模块:
scrapy.contrib.spidermanager
移动到scrapy.spidermanager
Spider Manager 单例从
scrapy.spider.spiders
移动到spiders` attribute of ``scrapy.project.crawler
单例。- 移动了 Stats Collector 类:(#204)
scrapy.stats.collector.StatsCollector
移动到scrapy.statscol.StatsCollector
scrapy.stats.collector.SimpledbStatsCollector
移动到scrapy.contrib.statscol.SimpledbStatsCollector
默认的每个命令设置现在在命令对象类的
default_settings
属性中指定 (#201)- 将 Item Pipeline 的
process_item()
方法的参数从(spider, item)
更改为(item, spider)
保留了向后兼容性(并带有弃用警告)
- 将 Item Pipeline 的
- 将
scrapy.core.signals
模块移动到scrapy.signals
保留了向后兼容性(并带有弃用警告)
- 将
- 将
scrapy.core.exceptions
模块移动到scrapy.exceptions
保留了向后兼容性(并带有弃用警告)
- 将
为
BaseSpider
添加了handles_request()
类方法删除了
scrapy.log.exc()
函数(请改用scrapy.log.err()
)删除了
scrapy.log.msg()
函数的component
参数删除了
scrapy.log.log_level
属性为 Spider Manager 和 Item Pipeline Manager 添加了
from_settings()
类方法
设置更改¶
添加了
HTTPCACHE_IGNORE_SCHEMES
设置,以忽略 !HttpCacheMiddleware 上的某些方案 (#225)添加了
SPIDER_QUEUE_CLASS
设置,用于定义要使用的 spider 队列 (#220)添加了
KEEP_ALIVE
设置 (#220)删除了
SERVICE_QUEUE
设置 (#220)删除了
COMMANDS_SETTINGS_MODULE
设置 (#201)将
REQUEST_HANDLERS
重命名为DOWNLOAD_HANDLERS
,并将下载处理程序设为类(而不是函数)
Scrapy 0.9¶
类似 #NNN 的数字引用了旧问题跟踪器 (Trac) 中的工单,该跟踪器已不再可用。
新功能和改进¶
为 scrapy.mail 添加了 SMTP-AUTH 支持
添加了新的设置:
MAIL_USER
、MAIL_PASS
(r2065 | #149)添加了新的 scrapy-ctl view 命令 - 在浏览器中查看 Scrapy 所看到的 URL (r2039)
添加了用于控制 Scrapy 进程的 Web 服务(这也弃用了 Web 控制台)。(r2053 | #167)
支持将 Scrapy 作为服务运行,用于生产系统 (r1988、r2054、r2055、r2056、r2057 | #168)
添加了包装归纳库(目前仅在源代码中提供文档)。(r2011)
添加了
LOG_ENCODING
设置 (r1956,文档可用)添加了
RANDOMIZE_DOWNLOAD_DELAY
设置(默认启用)(r1923,文档可用)MailSender
不再是 IO 阻塞的 (r1955 | #146)Linkextractors 和新的 Crawlspider 现在处理相对 base 标签 url (r1960 | #148)
对 Item Loaders 和处理器进行了一些改进 (r2022、r2023、r2024、r2025、r2026、r2027、r2028、r2029、r2030)
添加了向 telnet 控制台添加变量的支持 (r2047 | #165)
支持没有回调的请求 (r2050 | #166)
API 更改¶
将
Spider.domain_name
更改为Spider.name
(SEP-012,r1975)Response.encoding
现在是检测到的编码 (r1961)HttpErrorMiddleware
现在返回 None 或引发异常 (r2006 | #157)添加了
ExecutionQueue
用于为 spiders 提供抓取内容 (r2034)删除了
ExecutionEngine
单例 (r2039)移植了
S3ImagesStore
(图像管道),以使用 boto 和线程 (r2033)移动模块:
scrapy.management.telnet
移动到scrapy.telnet
(r2047)
默认设置更改¶
将默认的
SCHEDULER_ORDER
更改为DFO
(r1939)
Scrapy 0.8¶
类似 #NNN 的数字引用了旧问题跟踪器 (Trac) 中的工单,该跟踪器已不再可用。
新功能¶
向后不兼容的更改¶
更改了
scrapy.utils.response.get_meta_refresh()
的签名 (r1804)删除了已弃用的
scrapy.item.ScrapedItem
类 - 请改用scrapy.item.Item instead
(r1838)删除了已弃用的
scrapy.xpath
模块 - 请改用scrapy.selector
。(r1836)删除了已弃用的
core.signals.domain_open
信号 - 请改用core.signals.domain_opened
(r1822)log.msg()
现在接收一个spider
参数 (r1822)旧的 domain 参数已弃用,将在 0.9 版本中移除。对于 spider,您应该始终使用
spider
参数并传递 spider 引用。如果您确实想传递字符串,请改用component
参数。
更改了核心信号
domain_opened
、domain_closed
、domain_idle
- 更改了 Item Pipeline 以使用 spider 而不是 domain
process_item()
Item Pipeline 方法的domain
参数已更改为spider
,新的签名为:process_item(spider, item)
(r1827 | #105)要快速移植您的代码(使其与 Scrapy 0.8 兼容),只需在以前使用
domain
的地方使用spider.domain_name
。
- 更改了 Stats API 以使用 spider 而不是 domain (r1849 | #113)
StatsCollector
已更改为在其方法(set_value
、inc_value
等)中接收 spider 引用(而不是 domain)。添加了
StatsCollector.iter_spider_stats()
方法移除了
StatsCollector.list_domains()
方法此外,Stats 信号已重命名,现在传递 spider 引用(而不是 domain)。以下是更改摘要
要快速移植您的代码(使其与 Scrapy 0.8 兼容),只需在以前使用
domain
的地方使用spider.domain_name
。spider_stats
包含与domain_stats
完全相同的数据。
CloseDomain
扩展已移动到scrapy.contrib.closespider.CloseSpider
(r1833)- 其设置也已重命名
CLOSEDOMAIN_TIMEOUT
重命名为CLOSESPIDER_TIMEOUT
CLOSEDOMAIN_ITEMCOUNT
重命名为CLOSESPIDER_ITEMCOUNT
已移除弃用的
SCRAPYSETTINGS_MODULE
环境变量 - 请改用SCRAPY_SETTINGS_MODULE
(r1840)重命名设置:
REQUESTS_PER_DOMAIN
重命名为CONCURRENT_REQUESTS_PER_SPIDER
(r1830,r1844)重命名设置:
CONCURRENT_DOMAINS
重命名为CONCURRENT_SPIDERS
(r1830)重构了 HTTP 缓存中间件
HTTP 缓存中间件已进行了大量重构,保留了相同的功能,除了已移除的 domain 分区功能。( r1843 )
重命名异常:
DontCloseDomain
重命名为DontCloseSpider
(r1859 | #120)重命名扩展:
DelayedCloseDomain
重命名为SpiderCloseDelay
(r1861 | #121)已移除过时的
scrapy.utils.markup.remove_escape_chars
函数 - 请改用scrapy.utils.markup.replace_escape_chars
(r1865)
Scrapy 0.7¶
Scrapy 的第一个版本。