发布说明¶
Scrapy 2.12.0 (2024-11-18)¶
亮点:
放弃了对 Python 3.8 的支持,增加了对 Python 3.13 的支持
start_requests()现在可以生成项目添加了
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请求的cookies将设置
secure标志为True,除非显式设置为False。这在HTTP请求中重用这些cookies时非常重要,例如在重定向到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__()来创建实例。如果不从MediaPipeline.from_crawler()中调用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()调用来创建它们。
response_body参数在ImagesPipeline.convert_image中现在是仅限位置的,因为它从可选变为必需。 (issue 6500)convert参数在scrapy.utils.conf.build_component_list()中现在仅为位置参数,因为前面的参数 (custom) 已被移除。 (issue 6500)overwrite_output参数在scrapy.utils.conf.feed_process_params_from_cli()中现在 是仅位置参数,因为前面的参数 (output_format) 已被移除。 (issue 6500)
弃用移除¶
移除了在Scrapy 2.7.0中已弃用的
scrapy.utils.request.request_fingerprint()函数。 (issue 6212, issue 6213)移除了对设置
REQUEST_FINGERPRINTER_IMPLEMENTATION的值"2.6"的支持,该值在 Scrapy 2.7.0 中已被弃用。 (issue 6212, issue 6213)RFPDupeFilter子类现在需要在它们的__init__方法中支持fingerprinter参数,这是在 Scrapy 2.7.0 中引入的。 (issue 6102, issue 6113)移除了
scrapy.downloadermiddlewares.decompression模块, 该模块在Scrapy 2.7.0中已被弃用。 (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参数。 (问题 6107, 问题 6113)__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。 (issue 6500): 在同一个
Crawler实例上多次运行crawl(),在Scrapy 2.11.0中已弃用,现在会引发异常。 (issue 6500)子类化
HttpCompressionMiddleware而不支持__init__()中的crawler参数,并且没有自定义的from_crawler()方法,在Scrapy 2.5.0中已被弃用,不再允许。 (issue 6500)移除了在Scrapy 2.10.0中已弃用的
RetryMiddleware的EXCEPTIONS_TO_RETRY属性。 (issue 6500)移除了在没有安装boto3包的情况下对S3 feed exports的支持,该功能在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)response_body参数在ImagesPipeline.convert_image中现在是必需的, 在 Scrapy 2.8.0 中不传递它已被弃用。 (issue 6500)移除了
custom参数,该参数在Scrapy 2.10.0中已被弃用。 (issue 6500)移除了在Scrapy 2.9.0中已弃用的
scrapy.utils.reactor.get_asyncio_event_loop_policy()函数。请使用asyncio.get_event_loop()及相关标准库函数代替。 (issue 6500)
弃用¶
具有
from_settings()方法的Scrapy组件现在已被弃用。现在应该使用from_crawler()代替。受影响的组件:scrapy.dupefilters.RFPDupeFilterscrapy.middleware.MiddlewareManagerscrapy.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扩展现在在蜘蛛关闭时向 stats 添加了items_per_minute和responses_per_minute。 (issue 4110, issue 4111)添加了
CLOSESPIDER_PAGECOUNT_NO_ITEM,它允许在设定的时间内如果没有抓取到任何项目时关闭爬虫。 (issue 6434)用户定义的cookies现在可以包含
secure字段。 (issue 6357)向
Crawler添加了组件获取器:get_addon(),get_downloader_middleware(),get_extension(),get_item_pipeline(),get_spider_middleware(). (issue 6181)现在可以通过
autothrottle_dont_adjust_delay元键为特定请求禁用由 AutoThrottle 扩展 基于响应延迟进行的时隙延迟更新。 (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不再安装默认的反应器。 (issue 6432)减少了在2.11.2版本中增加的丢弃请求的日志冗长性。 (issue 6433, issue 6475)
文档¶
添加了
SECURITY.md,该文件记录了安全策略。 (issue 5364, issue 6051)用于从脚本运行Scrapy的示例代码不再在顶层导入
twisted.internet.reactor,这在使用未修改的代码时会导致非默认反应器的问题。 (问题6361, 问题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安全公告以获取更多信息。 (问题767)Spider.allowed_domains现在 对所有请求都强制执行,而不仅仅是来自蜘蛛回调的请求。 (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 的网页浏览器中不会被跟随的重定向。(issue 6342, issue 6347)在feed export期间,不要从内置的后处理插件关闭底层文件。 (issue 5932, issue 6178, issue 6239)
LinkExtractor现在正确地应用了unique和canonicalize参数。 (issue 3273, issue 6221)如果
JOBDIR是一个空字符串,请不要初始化调度器磁盘队列。(issue 6121, issue 6124)修复
Spider.logger不记录自定义额外信息的问题。(issue 6323, issue 6324)robots.txt文件使用非UTF-8编码不再阻止解析文档中与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)
文档¶
添加一个关于创建空白请求的FAQ条目。 (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)¶
亮点:
安全漏洞修复。
支持 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)
文档¶
改进了
Crawler初始化的文档 在2.11.0版本中所做的更改。(issue 6057, issue 6147)Request.meta的扩展文档。 (issue 5565)修复了
dont_merge_cookies的文档。(issue 5936, issue 6077)在feed exports文档中添加了指向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)
质量保证¶
在CI配置中添加了Python 3.12,重新启用了在添加预发布支持时被禁用的测试。(issue 5985, issue 6083, issue 6098)
修复了PyPy 7.3.14上的一个测试问题。(issue 6204, issue 6205)
Scrapy 2.11.0 (2023-09-18)¶
亮点:
蜘蛛现在可以在它们的
from_crawler()方法中修改 设置,例如基于 蜘蛛参数。定期记录统计信息。
向后不兼容的更改¶
大多数
scrapy.crawler.Crawler实例的初始化现在在crawl()中完成,因此在该方法调用之前实例的状态与旧版Scrapy相比有所不同。我们不建议在调用crawl()之前使用Crawler实例。(issue 6038)scrapy.Spider.from_crawler()现在在之前初始化的各种组件之前调用,并且在设置最终确定和冻结之前。这一更改是为了允许在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)
弃用移除¶
移除了在Scrapy 1.1.0中已弃用的
PythonItemExporter的二进制导出模式。 (issue 6006, issue 6007)注意
如果您在Scrapy Cloud上使用此Scrapy版本,并且堆栈中包含较旧的Scrapy版本,并遇到“TypeError: Unexpected options: binary”错误,您可能需要将
scrapinghub-entrypoint-scrapy >= 0.14.1添加到您的项目需求中,或者切换到包含Scrapy 2.11的堆栈。移除了在Scrapy 1.0.0中已弃用的
CrawlerRunner.spiders属性,改用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文件的链接现在被link extractors忽略。(issue 6021)
错误修复¶
修复了启用日志记录的附加组件。(issue 6036)
修复了当
charset参数传递给send()时,MailSender生成无效消息体的问题。(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)¶
亮点:
增加了对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 现在推荐用于导出到 S3,而不是 botocore。 (issue 5833).
向后不兼容的更改¶
FEED_STORE_EMPTY设置的值现在为True,而不是False。在早期的 Scrapy 版本中,即使此设置为False,也会创建空文件(这是一个现已修复的错误),因此新的默认值应保持旧的行为。(issue 872, issue 5847)
弃用移除¶
当一个函数被分配给
FEED_URI_PARAMS设置时, 返回None或修改params输入参数,在Scrapy 2.6中已弃用, 不再支持。(issue 5994, issue 5996)在Scrapy 2.6中已弃用的
scrapy.utils.reqser模块已被移除。 (issue 5994, issue 5996)scrapy.squeues类中的PickleFifoDiskQueueNonRequest、PickleLifoDiskQueueNonRequest、MarshalFifoDiskQueueNonRequest和MarshalLifoDiskQueueNonRequest在 Scrapy 2.6 中已被弃用,现已被移除。(issue 5994,issue 5996)属性
open_spiders和方法has_capacity以及schedule在scrapy.core.engine.ExecutionEngine中, 已在 Scrapy 2.6 中弃用,现已被移除。(issue 5994, issue 5998)将
spider参数传递给spider_is_idle()、crawl()和download()方法scrapy.core.engine.ExecutionEngine,在Scrapy 2.6中已弃用,不再支持。(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)增加了对
AWS_REGION_NAME设置的支持,用于导出数据。 (issue 5980)增加了在
FEEDS设置中使用pathlib.Path对象来引用绝对Windows路径的支持。(issue 5939)
错误修复¶
修复了即使
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)
文档¶
记录了
scrapy.Spider.update_settings()。 (issue 5745, issue 5846)记录了早期Twisted反应器安装可能遇到的问题及其解决方案。(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-pinnedtox环境。(问题 5948)实施了清理工作。(issue 5965, issue 5986)
Scrapy 2.9.0 (2023-05-08)¶
亮点:
每个域的下载设置。
兼容新的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)
静默了来自覆盖率的
include-ignored警告。(issue 5820)修复了
test_feedexport.test_batch_path_differ测试的随机失败问题。(issue 5855, issue 5898)其他CI和预提交改进。(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.utils.python.to_native_str函数在 Scrapy 2.0 中已被弃用,现已被移除。请改用scrapy.utils.python.to_unicode()。 (issue 5719)在Scrapy 2.0中已弃用的
scrapy.utils.python.MutableChain.next方法,现已被移除。请改用__next__()。 (issue 5719)scrapy.linkextractors.FilteringLinkExtractor类在 Scrapy 2.0 中已被弃用,现已被移除。请使用LinkExtractor代替。 (issue 5720)支持使用以
SCRAPY_为前缀的环境变量来覆盖设置的功能,已在Scrapy 2.0中弃用,现已被移除。 (issue 5724)支持在代理URL中使用
noconnect查询字符串参数的功能,已在Scrapy 2.0中弃用,现已被移除。我们预计以前需要它的代理现在无需此参数也能正常工作。 (issue 5731)在Scrapy 2.3中已弃用的
scrapy.utils.python.retry_on_eintr函数现已被移除。 (issue 5719)在Scrapy 2.4中已弃用的
scrapy.utils.python.WeakKeyCache类,现已被移除。 (issue 5719)scrapy.utils.boto.is_botocore()函数,已在 Scrapy 2.4 中弃用,现已被移除。 (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区分开来,因为后者表示将使用默认的蜘蛛回调函数 (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)
修复了在某些情况下使用asyncio时,
shell命令引发的异常。 (issue 5740, issue 5742, issue 5748, issue 5759, issue 5760, issue 5771)当使用
CrawlSpider时,在Rule的process_request回调中添加到请求的回调关键字参数(cb_kwargs)将不再被忽略。 (issue 5699)images pipeline 不再重新编码 JPEG 文件。 (issue 3055, issue 3689, issue 4753)
修复了images pipeline对透明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)
文档¶
记录了如何从Visual Studio Code调试爬虫。 (issue 5721)
记录了
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).替换了已弃用的
asyncioAPI,这些API隐式使用当前事件循环,改为使用显式从事件循环策略请求循环的代码(问题 5685, 问题 5689)。修复了已弃用的Pillow API的使用(issue 5684, issue 5692)。
改进了检查生成器是否返回值的代码,使其不再在装饰方法和部分方法上失败(问题 5323, 问题 5592, 问题 5599, 问题 5691)。
文档¶
升级了行为准则至贡献者契约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)¶
亮点:
增加了对Python 3.11的支持,取消了对Python 3.6的支持
改进了对异步回调的支持
Asyncio support 默认在新项目中启用
项目字段的输出名称现在可以是任意字符串
现在可以集中配置请求指纹
修改后的需求¶
现在需要 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)。定义为coroutines的
Request回调的输出现在被异步处理 (issue 4978)。CrawlSpider现在支持 异步回调 (issue 5657)。使用
startproject命令创建的新项目默认启用了asyncio支持(issue 5590,issue 5679)。现在可以将
FEED_EXPORT_FIELDS设置定义为字典,以自定义项目字段的输出名称,从而解除了要求输出名称必须是有效的Python标识符的限制,例如,防止它们包含空格(问题 1008,问题 3266,问题 3696)。你现在可以通过新的
REQUEST_FINGERPRINTER_CLASS设置来自定义请求指纹,而不必在每个依赖请求指纹的Scrapy组件上进行更改(问题 900, 问题 3420, 问题 4113, 问题 4762, 问题 4524)。jsonl现在被支持并推荐作为 JSON Lines 文件的扩展名(issue 4848)。ImagesPipeline.thumb_path现在接收源 item (issue 5504, issue 5508).
错误修复¶
当使用Google Cloud Storage与媒体管道时,
FILES_EXPIRES现在也可以在FILES_STORE不指向Google Cloud Storage存储桶的根目录时工作(问题5317,问题5318)。parse命令现在支持 异步回调 (issue 5424, issue 5577).当使用
parse命令处理一个没有可用爬虫的URL时,不再抛出异常(issue 3264, issue 3265, issue 5375, issue 5376, issue 5497)。TextResponse现在在确定响应正文的文本编码时,优先考虑 字节顺序标记,遵循 HTML 现行标准 (问题 5601, 问题 5611)。MIME嗅探在FTP和HTTP/1.0请求中以及缓存请求中考虑响应体(问题4873)。
MIME嗅探现在可以检测到有效的HTML 5文档,即使缺少
html标签 (issue 4873)。如果
ASYNCIO_EVENT_LOOP的值与实际上安装的asyncio事件循环不匹配,现在会引发异常 (issue 5529)。修复了
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也已添加(问题4978)。
移除了过时的文档 (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头,但仅在该头尚未设置的情况下。有一些第三方代理轮换下载器中间件,每次处理请求时都会设置不同的
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反应器(例如在模块级别导入
twisted.internet.reactor)不再阻止Scrapy启动,只要在TWISTED_REACTOR中没有指定不同的反应器(问题5525, 问题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)¶
亮点:
Python 3.10 支持
asyncio 支持 不再被视为实验性功能,并且无论您的 Python 版本如何,都可以在 Windows 上开箱即用。
Feed 导出现在支持
pathlib.Path输出路径和每个 feed 的 项目过滤 以及 后处理
安全漏洞修复¶
当一个定义了cookies的
Request对象收到一个重定向响应,导致一个新的Request对象被调度时,原始Request对象中定义的cookies将不再复制到新的Request对象中。如果你在
Request对象上手动设置了Cookie头,并且重定向URL的域名与原始Request对象的URL域名不完全匹配,那么你的Cookie头将从新的Request对象中删除。攻击者可以利用旧行为来获取您的cookies。请参阅cjvr-mfj7-j4j8安全公告以获取更多信息。
注意
仍然可以通过在定义cookie时将共享域后缀(例如
example.com和任何子域)定义为cookie域来启用不同域之间的cookie共享。有关更多信息,请参阅Request类的文档。当cookie的域,无论是在响应的
Set-Cookie头中接收到的,还是在Request对象中定义的,被设置为公共后缀时,除非cookie域与请求域相同,否则现在将忽略该cookie。攻击者可以利用旧行为从受控域注入cookie到您的cookiejar中,这些cookie可能会被发送到攻击者未控制的其他域。请参阅mfjm-vh54-3f96安全公告以获取更多信息。
修改后的需求¶
h2 依赖现在是可选的,仅在需要启用 HTTP/2 支持时才需要。(issue 5113)
向后不兼容的更改¶
formdata参数在FormRequest中,如果为非 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而不是其他错误。如果配置的scheduler的API不符合预期,现在会在启动时抛出
TypeError。在此之前,其他异常会在运行时抛出。(issue 3559)序列化的
Request对象的_encoding字段现在命名为encoding,以与其他所有字段保持一致(issue 5130)
弃用移除¶
scrapy.http.TextResponse.body_as_unicode,在Scrapy 2.2中已弃用,现在已被移除。(issue 5393)scrapy.item.BaseItem,在Scrapy 2.2中已弃用,现已被移除。 (issue 5398)scrapy.item.DictItem,在Scrapy 1.8中已弃用,现已被移除。 (issue 5398)scrapy.Spider.make_requests_from_url,在Scrapy 1.4中已弃用,现已被移除。(issue 4178, issue 4356)
弃用¶
当一个函数被分配给
FEED_URI_PARAMS设置时, 返回None或修改params输入参数现在已被弃用。请返回一个新的字典。(issue 4962, issue 4966)scrapy.utils.reqser已被弃用。 (issue 5130)不要使用
request_to_dict(),而是使用新的Request.to_dict方法。而不是使用
request_from_dict(),请使用新的scrapy.utils.request.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)
新功能¶
你现在可以使用项目过滤来控制哪些项目被导出到每个输出源。(问题 4575, 问题 5178, 问题 5161, 问题 5203)
您现在可以对feeds应用后处理,并且提供了内置的后处理插件用于输出文件压缩。(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 反应器时等待 Deferreds。 (issue 5288)Amazon S3 导出存储 增加了对 临时安全凭证 的支持 (
AWS_SESSION_TOKEN) 和端点自定义 (AWS_ENDPOINT_URL)。 (问题 4998, 问题 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)如果底层队列不支持窥视(例如,因为您没有使用
queuelib1.6.1 或更高版本),peek方法会引发NotImplementedError。Request和Response现在有一个attributes属性,使得子类化更加容易。对于Request,它还允许子类与scrapy.utils.request.request_from_dict()一起工作。(issue 1877, issue 5130, issue 5218)open()和close()方法现在是可选的。 (issue 3559)HTTP/1.1
TunnelError异常现在只会截断超过1000个字符的响应体,而不是超过32个字符的响应体,这使得调试此类错误更加容易。(issue 4881, issue 5007)ItemLoader现在支持非文本响应。 (issue 5145, issue 5269)
错误修复¶
如果在
custom_settings中定义了TWISTED_REACTOR和ASYNCIO_EVENT_LOOP设置,它们将不再被忽略。 (issue 4485, issue 5352)移除了一个模块级的Twisted反应器导入,该导入可能会阻止使用asyncio反应器。(问题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。(问题 5319, 问题 5320)修复了
CSVFeedSpider.quotechar被解释为CSV文件编码的问题。(issue 5391, issue 5394)在依赖项列表中添加了缺失的setuptools。(问题 5122)
LinkExtractor现在也可以正常处理包含逗号分隔的rel属性值的链接,包括nofollow。 (issue 5225)修复了在feed export参数解析过程中可能引发的
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)已记录的
Spider.attribute。 (issue 5174, issue 5244)记录了
TextResponse.urljoin. (issue 1582)在
headers_received信号的文档签名中添加了body_length参数。(issue 5270)在教程中澄清了
SelectorList.get的用法。(issue 5256)文档现在展示了具有多个导入路径的类的最短导入路径。(issue 2733, issue 5099)
quotes.toscrape.com现在使用 HTTPS 而不是 HTTP。 (issue 5395, issue 5396)添加了一个链接到我们的Discord服务器 到获取帮助。 (问题 5421, 问题 5422)
在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)¶
亮点:
官方 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 支持 通过一个新的下载处理器 可以分配给
https协议在DOWNLOAD_HANDLERS设置中。 (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)Stats 现在包括以下条目,这些条目指示存储feeds的成功和失败次数:
feedexport/success_count/<storage type> feedexport/failed_count/<storage type>
其中
是feed存储后端的类名,例如type> 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下载处理器时,Content-Length头部不再从响应中省略(参见
DOWNLOAD_HANDLERS)。 (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。 (问题 4996, 问题 5016)
澄清了每个爬虫都会创建一个extension实例。 (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)
从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 exports覆盖支持 (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)¶
亮点:
Python 3.5 支持已被放弃。
-
这允许您根据项目数据设置下载文件路径。
您现在可以选择feed exports是覆盖还是追加到输出文件。
如果安装了zstandard,现在支持Zstd压缩的响应。
在需要类导入路径的设置中,现在可以传递类对象来代替。
修改后的需求¶
现在需要 Python 3.6 或更高版本;对 Python 3.5 的支持已被取消
结果是:
使用PyPy时,现在需要PyPy 7.2.0或更高版本is now required
对于feed exports或media pipelines中的Amazon S3存储支持,现在需要botocore 1.4.87或更高版本
要使用images pipeline,现在需要Pillow 4.0.0或更高版本
(issue 4718, issue 4732, issue 4733, issue 4742, issue 4743, issue 4764)
向后不兼容的更改¶
CookiesMiddleware再次 丢弃在Request.headers中定义的 cookies。我们决定撤销这个在Scrapy 2.2.0中引入的错误修复,因为有报告称当前的实现可能会破坏现有代码。
如果您需要为请求设置cookies,请使用
Request.cookies参数。Scrapy的未来版本将包含一个新的、更好的实现,以修复被回滚的错误。
弃用移除¶
scrapy.extensions.feedexport.S3FeedStorage不再从运行的项目设置中读取access_key和secret_key的值,当它们没有传递给其__init__方法时;你必须将这些参数传递给其__init__方法或使用S3FeedStorage.from_crawler(issue 4356, issue 4411, issue 4688)Rule.process_request不再接受只期望一个request参数的可调用对象, 而不是同时期望request和response(issue 4818)
弃用¶
在自定义的媒体管道中,任何方法中不接受关键字参数
item的签名现在已被弃用,这些方法现在支持此参数(问题 4628, 问题 4686)在自定义的feed storage backend classes中, 不接受关键字参数
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()
新的
item_export_kwargs键在FEEDS设置中允许定义关键字参数传递给项目导出类 (问题 4606, 问题 4768)Feed exports 获得了覆盖支持:
你可以使用
FEEDS设置中的overwrite键来配置是否覆盖输出文件(True)或追加到其内容(False)__init__和from_crawler方法现在接收一个新的仅关键字参数feed_options,它是一个包含 feed options 的字典。
如果安装了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对象
-
现在可以将新的
overwritefeed option设置为False,以追加到现有文件而不是覆盖它如果不需要,现在可以省略FTP密码
CsvItemExporter的__init__方法现在支持一个errors参数,用于指示如何处理编码错误 (issue 4755)当使用 asyncio时,现在可以 设置自定义的 asyncio 循环 (issue 4306, issue 4414)
序列化请求(参见作业:暂停和恢复爬取)现在支持回调,这些回调是蜘蛛方法,可以委托给其他可调用对象(问题 4756)
当响应大于
DOWNLOAD_MAXSIZE时,记录的消息现在是警告,而不是错误(issue 3874, issue 3886, issue 4752)
错误修复¶
genspider命令不再覆盖现有文件,除非使用了--force选项 (issue 4561, issue 4616, issue 4623)值为空的 Cookies 不再被视为无效 Cookies (issue 4772)
runspider命令现在支持带有.pyw文件扩展名的文件 (issue 4643, issue 4646)HttpProxyMiddleware中间件现在简单地忽略不支持的代理值 (issue 3331, issue 4778)系统文件模式创建掩码不再影响使用
startproject命令生成的文件权限(问题4722)scrapy.utils.iterators.xmliter()现在支持命名空间的节点名称 (issue 861, issue 4746)Request对象现在可以拥有about:类型的 URL,这些 URL 在使用无头浏览器时可以正常工作(issue 4835)
文档¶
FEED_URI_PARAMS设置现已记录在案 (问题 4671, 问题 4724)阐明了在使用
CloseSpider扩展时CONCURRENT_REQUESTS的影响 (issue 4836)移除了对Python 2的
unicode类型的引用(issue 4547, issue 4703)我们现在有一个官方弃用政策 (issue 4705)
我们的文档政策现在涵盖了Sphinx的
versionadded和versionchanged指令的使用,并且我们已经删除了引用Scrapy 1.4.0及更早版本的用法(问题3971,问题4310)其他文档清理工作 (issue 4090, issue 4782, issue 4800, issue 4801, issue 4809, issue 4816, issue 4825)
质量保证¶
扩展类型提示 (issue 4243, issue 4691)
修复了在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)¶
亮点:
Feed exports 现在支持 Google Cloud Storage 作为存储后端
新的
FEED_EXPORT_BATCH_ITEM_COUNT设置允许以最多指定数量的项目批次交付输出项目。它还可以作为延迟文件交付的解决方案,当使用某些存储后端时(S3、FTP,以及现在的GCS),Scrapy 只会在爬取完成后才开始项目交付。
项目加载器的基本实现已被移至一个单独的库,itemloaders,允许在Scrapy之外使用,并拥有独立的发布计划。
弃用移除¶
从
scrapy.linkextractors中移除了以下类及其父模块:htmlparser.HtmlParserLinkExtractorregex.RegexLinkExtractorsgml.BaseSgmlLinkExtractorsgml.SgmlLinkExtractor
使用
LinkExtractor代替 (issue 4356, issue 4679)
弃用¶
scrapy.utils.python.retry_on_eintr函数现已弃用 (issue 4683)
新功能¶
Feed exports 支持 Google Cloud Storage (issue 685, issue 3608)
新增
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)现在可以在内置的爬虫子类中使用
parse回调函数,例如CrawlSpider(issue 712, issue 732, issue 781, issue 4254 )
错误修复¶
修复了CSV导出的 dataclass项目和attr.s项目(问题4667, 问题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加密列表格式链接(问题4653)
质量保证¶
项目加载器的基本实现已被移至itemloaders (问题 4005, 问题 4516)
修复了某些调度程序测试中的静默错误 (issue 4644, issue 4645)
更新了用于SSL测试的localhost证书 (issue 4650)
移除了特定于Python 2的cookie处理代码(issue 4682)
停止使用 Python 2 的 unicode 字面量语法 (issue 4704)
停止使用反斜杠进行行继续(issue 4673)
从MyPy异常列表中移除了不需要的条目(issue 4690)
自动化测试现在在Windows上通过,作为我们持续集成系统的一部分(issue 4458)
自动化测试现在在我们的持续集成系统中支持的最新PyPy版本上通过了支持的Python版本(问题 4504)
Scrapy 2.2.1 (2020-07-17)¶
startproject命令不再对目标文件夹中的文件权限进行意外更改,例如移除执行权限 (issue 4662, issue 4666)
Scrapy 2.2.0 (2020-06-24)¶
亮点:
现在需要 Python 3.5.2+
dataclass 对象 和 attrs 对象 现在是有效的 项目类型
新增
TextResponse.json方法新的
bytes_received信号,允许取消响应下载
向后不兼容的更改¶
对 Python 3.5.0 和 3.5.1 的支持已被放弃;Scrapy 现在拒绝在低于 3.5.2 的 Python 版本上运行,该版本引入了
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 库使得编写支持任何项目类型的代码变得容易 (问题 2749, 问题 2807, 问题 3761, 问题 3881, 问题 4642)
一个新的
TextResponse.json方法 允许反序列化JSON响应(issue 2444, issue 4460, issue 4574)一个新的
bytes_received信号允许监控响应下载进度和停止下载 (issue 4205, issue 4559)在媒体管道的结果列表中的字典现在包含一个新键
status,它指示文件是否已下载,或者如果文件未下载,未下载的原因;更多信息请参见FilesPipeline.get_media_requests(问题 2893,问题 4486)当使用Google Cloud Storage作为媒体管道时,如果配置的凭据未授予所需的权限,现在会记录警告(问题4346,问题4508)
链接提取器 现在可序列化, 只要你不使用 lambda 作为参数; 例如,你现在可以在
Request.cb_kwargs或Request.meta中传递链接提取器,当 持久化 计划请求 时 (issue 4554)scrapy.utils.misc.create_instance()现在如果生成的实例是None则会引发TypeError异常 (issue 4528, issue 4532)
错误修复¶
CookiesMiddleware不再 丢弃在Request.headers中定义的 cookies (issue 1992, issue 2400)CookiesMiddleware不再 重新编码在Request的__init__方法的cookies参数中 定义为bytes的 cookies (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异常(问题 4597,问题 4599)当
FEEDS定义了多个URI时,关于项目存储的日志消息现在包含来自相应feed的信息,而不是总是只包含其中一个feed的信息(问题 4619,问题 4629)
文档¶
新增了一个关于从errbacks访问cb_kwargs的部分 (issue 4598, issue 4634)
从Coroutines中移除了关于API处于实验阶段的警告(issue 4511, issue 4513)
移除了对不支持的Twisted版本的引用(issue 4533)
更新了截图管道示例的描述,现在使用协程语法而不是返回一个
Deferred(issue 4514, issue 4593)从
scrapy.utils.log.configure_logging()代码示例中删除了一个误导性的导入行(issue 4510, issue 4587)内部文档引用的悬停显示行为现在也涵盖了指向命令、
Request.meta键、设置和 信号的链接(问题 4495,问题 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的测试覆盖率,针对涉及重复蜘蛛名称的场景(问题4549,问题4560)配置了Travis CI以使用Python 3.5.2运行测试 (issue 4518, issue 4615)
在测试中使用了集合字面量 (issue 4573)
清理了Travis CI配置 (issue 4517, issue 4519, issue 4522, issue 4537)
Scrapy 2.1.0 (2020-04-24)¶
亮点:
新的
FEEDS设置,用于导出到多个feeds新的
Response.ip_address属性
向后不兼容的更改¶
AssertionError异常由 assert 语句触发,已被新的异常类型取代,以支持在优化模式下运行 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,允许配置多个输出源,每个输出源可以有不同的设置(问题 1336,问题 3858,问题 4507)crawl和runspider命令现在支持多个-o参数 (issue 1336, issue 3858, issue 4507)crawl和runspider命令现在支持通过在输出文件后附加:来指定输出格式 (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)
错误修复¶
None值在allowed_domains中不再导致TypeError异常 (issue 4410)Zsh 补全不再允许在参数后使用选项 (issue 4438)
现在支持 zope.interface 5.0.0 及更高版本 (issue 4447, issue 4448)
Spider.make_requests_from_url,在Scrapy 1.4.0中已弃用,现在使用时将发出警告(issue 4412)
文档¶
改进了关于信号的文档,这些信号允许它们的处理程序返回一个
Deferred(issue 4295, issue 4390)我们的PyPI条目现在包括我们的文档、源代码仓库和问题跟踪器的链接(issue 4456)
在文档中涵盖了curl2scrapy服务(问题4206,问题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反应器时安装错误的Twisted反应器导致的错误(issue 4401, issue 4406)修复测试 (issue 4422)
Scrapy 2.0.0 (2020-03-03)¶
亮点:
Python 2 支持已被移除
新的
Response.follow_all方法FTP支持 用于媒体管道
新的
Response.certificate属性通过
DNS_RESOLVER支持 IPv6
向后不兼容的更改¶
Python 2 支持已被移除,遵循 Python 2 于 2020 年 1 月 1 日结束生命周期 (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设置现在默认是一个空列表,遵循网页浏览器的行为 (issue 3844, issue 4311)现在,
HttpCompressionMiddleware在它设置的Accept-Encoding头部的值中,逗号后面包含了空格,这遵循了网页浏览器的行为 (issue 4293)自定义下载处理程序的
__init__方法(参见DOWNLOAD_HANDLERS)或以下下载处理程序的子类 不再接收settings参数:scrapy.core.downloader.handlers.datauri.DataURIDownloadHandlerscrapy.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)next方法在scrapy.utils.python.MutableChain中已被弃用,请使用全局的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支持 (问题 1031, 问题 4227)一个新的
SCRAPER_SLOT_MAX_ACTIVE_SIZE设置允许配置现有的软限制,当正在处理的总响应数据过高时,暂停请求下载(issue 1410, issue 3551)一个新的
TWISTED_REACTOR设置允许自定义reactor,Scrapy使用的,允许 启用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 loader processors 现在可以是 普通函数,它们不再需要是方法 (issue 3899)
Rule现在接受一个errback参数 (issue 4000)Request不再需要callback参数 当指定了errback参数时 (issue 3586, issue 4008)LogFormatter现在支持一些额外的方法:download_error用于 下载错误item_error用于处理由 项目管道 在处理项目时引发的异常spider_error用于处理从 spider callbacks 引发的异常
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的子类现在可以在它们的__init__方法中使用super().__init__(**kwargs)而不是self._configure(kwargs),如果需要的话,可以向父类的__init__方法传递dont_fail=True,并在调用父类的__init__方法后通过self._kwargs访问kwargs(issue 4193, issue 4370)一个新的
keep_fragments参数在scrapy.utils.request.request_fingerprint中允许为URL中带有不同片段的请求生成 不同的指纹 (issue 4104)下载处理器(参见
DOWNLOAD_HANDLERS)现在可以使用其他Scrapy组件已经支持的from_settings和from_crawler类方法(问题4126)scrapy.utils.python.MutableChain.__iter__现在返回self, 允许它被用作序列 (问题 4153)
错误修复¶
crawl命令现在在爬虫开始之前发生异常时也会以退出代码 1 退出 (issue 4175, issue 4207)LinkExtractor.extract_links不再 将非UTF-8响应的查询字符串或URL重新编码为UTF-8 (issue 998, issue 1403, issue 1949, issue 4321)第一个蜘蛛中间件(参见
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文档现在链接到相应源代码的在线语法高亮视图(问题 4148)
现在可以访问不存在的文档页面的侧边栏链接 (issue 4152, issue 4169)
在我们的文档中,交叉引用现在在悬停时会显示一个工具提示(issue 4173, issue 4183)
改进了关于
LinkExtractor.extract_links的文档,并简化了Link Extractors (issue 4045)澄清了
ItemLoader.item的工作原理(问题3574, 问题4099)澄清了在使用
CrawlerProcess时不应使用logging.basicConfig()(issue 2149, issue 2352, issue 3146, issue 3960)明确了在使用持久化时对
Request对象的要求 当使用持久化时 (issue 4124, issue 4139)阐明了如何安装自定义图像管道 (issue 4034, issue 4252)
修复了media pipeline示例中
file_path方法的签名(issue 4290)涵盖了Scrapy 1.7.0中影响自定义
scrapy.core.scheduler.Scheduler子类的向后不兼容更改(问题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)在我们的测试套件中添加了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中获取,或者使用priority()方法在scrapy.core.scheduler.ScrapyPriorityQueue子类中。
以下更改可能会影响自定义优先级队列类:
在
__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__仍然可以接收所有参数作为位置参数,但是:downstream_queue_cls,它取代了qfactory,必须以不同的方式实例化。qfactory实例化时带有一个优先级值(整数)。downstream_queue_cls的实例应使用新的ScrapyPriorityQueue.qfactory或DownloaderAwarePriorityQueue.pqfactory方法来创建。新的
key参数将startprios参数向右移动了1个位置。
以下类属性已被添加:
crawlerdownstream_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)¶
安全漏洞修复:
由于其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头,但仅在该头尚未设置的情况下。有一些第三方代理轮换下载器中间件,每次处理请求时都会设置不同的
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)¶
安全漏洞修复:
当一个定义了cookies的
Request对象收到一个重定向响应,导致一个新的Request对象被调度时,原始Request对象中定义的cookies将不再复制到新的Request对象中。如果你在
Request对象上手动设置了Cookie头,并且重定向URL的域名与原始Request对象的URL域名不完全匹配,那么你的Cookie头将从新的Request对象中删除。攻击者可以利用旧行为来获取您的cookies。请参阅cjvr-mfj7-j4j8安全公告以获取更多信息。
注意
仍然可以通过在定义cookie时将共享域后缀(例如
example.com和任何子域)定义为cookie域来启用不同域之间的cookie共享。有关更多信息,请参阅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)¶
亮点:
放弃了对Python 3.4的支持并更新了最低要求;正式支持Python 3.8
新的
Request.from_curl类方法新的
ROBOTSTXT_PARSER和ROBOTSTXT_USER_AGENT设置新增
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 (16.0.0 使用 Python 2)
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现在将其输入项的值转换为列表:>>> 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解析(问题3931,问题3966)Rule不再需要LinkExtractor参数 (issue 781, issue 4016)使用新的
DOWNLOADER_CLIENT_TLS_CIPHERS设置来自定义 默认HTTP/1.1下载器使用的TLS/SSL加密套件(问题3392, 问题3442)将新的
DOWNLOADER_CLIENT_TLS_VERBOSE_LOGGING设置设为True以在建立HTTPS连接后启用关于TLS连接参数的调试级别消息 (issue 2111, issue 3450)接收关键字参数的回调函数 (参见
Request.cb_kwargs) 现在可以使用新的@cb_kwargs爬虫合约 进行测试 (issue 3985, issue 3988)自定义日志格式 现在可以通过配置的
LOG_FORMATTER的相应方法返回None来丢弃消息 (issue 3984, issue 3987)
错误修复¶
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注册的文件扩展名(问题1287, 问题3953, 问题3954)当使用botocore将文件持久化到S3时,所有botocore支持的头部现在都已正确映射(问题3904,问题3905)
在
FEED_URI中包含百分号转义字符的FTP密码现在已正确解码 (issue 3941)在
scrapy.utils.ssl.get_temp_key_info()中的内存处理和错误处理问题已修复(问题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)¶
撤销对问题3804的修复(问题3819),该修复有一些不希望的副作用(问题3897,问题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包是由于错误的提交标记导致的,并不包含以下描述的所有更改。
亮点:
针对多域名爬取的改进
一种更清晰的方式将参数传递给回调函数
用于JSON请求的新类
基于规则的爬虫的改进
Feed导出的新功能
向后不兼容的更改¶
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,可以 启用 以显著 提高针对多个网络域的爬取调度效率,但代价是不支持CONCURRENT_REQUESTS_PER_IP(问题 3520)一个新的
Request.cb_kwargs属性 提供了一种更简洁的方式来向回调方法传递关键字参数 (issue 1138, issue 3563)一个新的
JSONRequest类提供了一种更方便的方式来构建JSON请求(issue 3504, issue 3505)传递给
Rule的__init__方法的process_request回调现在接收作为其第二个参数的Response对象,该对象是请求的起源(issue 3682)一个新的
restrict_text参数用于LinkExtractor__init__方法允许通过链接文本过滤链接(问题3622, 问题3635)一个新的
FEED_STORAGE_S3_ACL设置允许为导出到Amazon S3的feeds定义自定义ACL (issue 3607)一个新的
FEED_STORAGE_FTP_ACTIVE设置允许使用FTP的主动连接模式来导出到FTP服务器的feeds(issue 3829)一个新的
METAREFRESH_IGNORE_TAGS设置允许覆盖在搜索响应中触发重定向的HTML元标签时忽略哪些HTML标签(问题1422, 问题3768)一个新的
redirect_reasons请求元键暴露了每次跟随重定向背后的原因(状态码,元刷新)(问题3581,问题3687)SCRAPY_CHECK变量现在在运行check命令时被设置为true字符串,这允许 从代码中检测合同检查运行 (issue 3704, issue 3739)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这样的系统异常不再被捕获 (问题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()现在可以处理像主要网络浏览器那样的无效方法(issue 3777, issue 3794)
文档¶
Broad Crawls 现在包含有关内存使用的信息 (issue 1264, issue 3866)
Rule的文档现在涵盖了在使用CrawlSpider时如何访问链接的文本 (issue 3711, issue 3712)一个新的部分,编写你自己的存储后端,涵盖了为
HttpCacheMiddleware编写自定义缓存存储后端的内容 (issue 3683, issue 3692)一个新的FAQ条目,如何在项目管道中将一个项目拆分为多个项目?,解释了当你想从项目管道中将一个项目拆分为多个项目时该怎么做 (issue 2240, issue 3672)
更新了关于爬取顺序的FAQ条目,以解释为什么前几个请求很少遵循期望的顺序(问题1739,问题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(参见 Logging)来自
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)
弃用¶
queuelib.PriorityQueue值用于SCHEDULER_PRIORITY_QUEUE设置已被弃用。请使用scrapy.pqueues.ScrapyPriorityQueue代替。传递给
Rule的process_request回调函数如果不接受两个参数,则已被弃用。以下模块已弃用:
scrapy.utils.http(使用 w3lib.http)scrapy.utils.markup(使用 w3lib.html)scrapy.utils.multipart(使用 urllib3)
scrapy.utils.datatypes.MergeDict类在 Python 3 代码库中已被弃用。请改用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 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)¶
亮点:
更好的Windows支持;
Python 3.7 兼容性;
大幅改进的文档,包括从
.extract_first()+.extract()API切换到.get()+.getall()API;feed 导出,FilePipeline 和 MediaPipeline 的改进;
更好的扩展性:
item_error和request_reached_downloader信号;from_crawler支持 用于feed导出器、feed存储和去重过滤器。scrapy.contracts修复和新功能;telnet控制台安全改进,首次作为向后移植在Scrapy 1.5.2 (2019-01-22)中发布;
清理已弃用的代码;
各种错误修复,代码库中的小新功能和可用性改进。
选择器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元素的属性变得更加容易。参见选择元素属性。
CSS选择器在parsel >= 1.5中被缓存,这使得当相同的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支持已添加到 dupefilters (issue 2956); 这允许从 dupefilter 访问例如设置或蜘蛛。item_error在管道中发生错误时触发 (issue 3256);request_reached_downloader当下载器接收到一个新的请求时触发;这个信号对于自定义调度器非常有用(issue 3393)。新的SitemapSpider
sitemap_filter()方法允许 在SitemapSpider子类中根据其属性选择站点地图条目 (issue 3512).现在,下载处理器的懒加载是可选的;这使得在自定义下载处理器中能够更好地处理初始化错误(问题 3394)。
新文件管道和媒体管道功能¶
为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属性在 Contract 子类中允许使用不同的请求类,例如 FormRequest (issue 3383)。修复了合约中的错误回调处理,例如针对返回非200响应的URL执行合约的情况(问题 3371)。
可用性改进¶
更多关于RobotsTxtMiddleware的统计信息 (issue 3100)
INFO 日志级别用于显示 telnet 主机/端口 (issue 3115)
在RobotsTxtMiddleware中添加了一条消息到IgnoreRequest(issue 3113)
更好地验证
Response.follow中的url参数 (issue 3131)当蜘蛛初始化时发生错误时,Scrapy命令会返回非零退出代码(问题 3226)
当导出器被禁用时,显示更好的错误消息(issue 3358);
scrapy shell --help提到了本地文件所需的语法 (./file.html) - issue 3496.Referer 头值被添加到 RFPDupeFilter 日志消息中 (issue 3588)
错误修复¶
修复了在Windows下导出的.csv文件中出现额外空白行的问题 (issue 3039);
在Python 3中序列化对象以用于磁盘队列时正确处理pickling错误(issue 3082)
在复制请求时,现在会保留标志(问题 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的默认值(问题 3335);从文档中移除未使用的
DEPTH_STATS选项(issue 3245);其他清理工作 (issue 3347, issue 3350, issue 3445, issue 3544, issue 3605).
弃用移除¶
移除了对1.0版本之前Scrapy模块名称的兼容性填充(issue 3318):
scrapy.commandscrapy.contrib(包含所有子模块)scrapy.contrib_exp(包含所有子模块)scrapy.dupefilterscrapy.linkextractorscrapy.projectscrapy.spiderscrapy.spidermanagerscrapy.squeuescrapy.statsscrapy.statscolscrapy.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).
测试和持续集成修复 (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中(问题 3495);
代码风格修复 (issue 3405, issue 3304);
不需要的 .strip() 调用被移除 (issue 3519);
collections.deque 用于存储 MiddlewareManager 方法,而不是使用列表 (issue 3476)
Scrapy 1.5.2 (2019-01-22)¶
安全漏洞修复:Telnet控制台扩展容易被恶意网站通过向http://localhost:6023发送POST内容来利用,我们尚未找到从Scrapy中利用它的方法,但很容易诱使浏览器这样做,从而增加了本地开发环境的风险。
此修复是向后不兼容的,它默认启用了telnet用户密码认证,并使用随机生成的密码。如果您不能立即升级,请考虑将
TELNETCONSOLE_PORT设置为其默认值之外的值。查看 telnet console 文档以获取更多信息
由于boto导入错误,在GCE环境下回退CI构建失败。
Scrapy 1.5.1 (2018-07-12)¶
这是一个维护版本,包含重要的错误修复,但没有新功能:
O(N^2)影响 Python 3 和 PyPy 的 gzip 解压缩问题已修复(问题 3281);跳过TLS验证错误的改进(issue 3166);
Ctrl-C 处理在 Python 3.5+ 中已修复(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)¶
此版本带来了代码库中的一些小新功能和改进。 一些亮点:
Google Cloud Storage 在 FilesPipeline 和 ImagesPipeline 中得到支持。
使用代理服务器进行爬取变得更加高效,因为现在可以重用与代理的连接。
警告、异常和日志消息已改进,以使调试更容易。
scrapy parse命令现在允许通过--meta参数设置自定义请求元数据。与Python 3.6、PyPy和PyPy3的兼容性得到了改进;通过在CI上运行测试,现在正式支持PyPy和PyPy3。
更好地默认处理HTTP 308、522和524状态码。
文档一如既往地得到了改进。
向后不兼容的更改¶
Scrapy 1.5 放弃了对 Python 3.3 的支持。
默认的Scrapy User-Agent现在使用指向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中使用标签 (issue 2785)支持
ptpythonREPL (issue 2654)Google Cloud Storage 对 FilesPipeline 和 ImagesPipeline 的支持 (issue 2923).
新的
--meta选项允许在“scrapy parse”命令中传递额外的 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限制的响应提供更好的日志消息(问题 2927)当URL被放入
Spider.allowed_domains而不是域名时显示警告(问题2250)。
错误修复¶
修复由
custom_settings覆盖的设置的日志记录; 这在技术上是向后不兼容的,因为日志记录器从[scrapy.utils.log]更改为[scrapy.crawler],因此如果需要,请更新您的日志解析器(issue 1343)默认的Scrapy User-Agent现在使用指向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)在Python 3中使用getfullargspec来停止DeprecationWarning (issue 2862)
更新已弃用的测试别名 (issue 2876)
修复
SitemapSpider对备用链接的支持 (issue 2853)
文档¶
为
AUTOTHROTTLE_TARGET_CONCURRENCY设置添加了缺失的项目符号点。(issue 2756)更新贡献文档,记录新的支持渠道 (issue 2762, issue:3038)
在文档中包含对Scrapy子版块的引用
修复损坏的链接;外部链接使用
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)
文档
from_crawler方法用于爬虫和下载器中间件 (issue 3019)
Scrapy 1.4.0 (2017-05-18)¶
Scrapy 1.4 并没有带来许多令人惊叹的新功能,但仍然有一些方便的改进。
Scrapy 现在支持通过新的 FTP_USER 和 FTP_PASSWORD 设置进行匿名 FTP 会话,并且可以自定义用户名和密码。
如果你使用的是 Twisted 17.1.0 或更高版本,FTP 现在也可以在 Python 3 中使用。
有一个新的response.follow方法
用于创建请求;现在这是在Scrapy爬虫中创建请求的推荐方式。这种方法使得编写正确的爬虫更加容易;response.follow相比于直接创建
scrapy.Request对象有几个优势:
例如,而不是这样:
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爬虫更易于调试,Scrapy在1.4版本中默认记录了更多的统计信息:内存使用统计、详细的重试统计、详细的HTTP错误代码统计。一个类似的变化是,HTTP缓存路径现在也在日志中可见。
最后但同样重要的是,Scrapy现在可以选择使JSON和XML项目更易于人类阅读,项目之间有换行,甚至可以使用新的FEED_EXPORT_INDENT设置自定义缩进偏移量。
享受吧!(或者继续阅读本版本中的其他更改。)
弃用和向后不兼容的更改¶
默认设置为
canonicalize=False在scrapy.linkextractors.LinkExtractor(issue 2537, 修复了 issue 1941 和 issue 1982): 警告,这在技术上是向后不兼容的默认启用内存使用扩展(问题2539,修复了问题2187); 这在技术上是向后不兼容的,因此请检查您是否设置了任何非默认的
MEMUSAGE_***选项。EDITOR环境变量现在优先于在 settings.py 中定义的EDITOR选项(问题 1829);Scrapy 的默认设置不再依赖于环境变量。这在技术上是一个向后不兼容的更改。Spider.make_requests_from_url已被弃用 (issue 1728, 修复 issue 1495).
新功能¶
在
proxy请求元键中接受代理凭据(issue 2526)支持 brotli-compressed 内容;需要可选的 brotlipy (issue 2535)
新增 response.follow 快捷方式 用于创建请求 (issue 1940)
向
Request对象添加了flags参数和属性(issue 2047)支持匿名FTP (issue 2342)
添加了
retry/count,retry/max_reached和retry/reason_count/统计到RetryMiddleware(issue 2543)添加了
httperror/response_ignored_count和httperror/response_ignored_status_count/统计到HttpErrorMiddleware(issue 2566)新增
data:URI 下载处理器 (issue 2334, 修复 issue 2156)当使用HTTP缓存时记录缓存目录(issue 2611,修复了issue 2604)
当项目包含重复的爬虫名称时警告用户(修复 issue 2181)
scrapy.utils.datatypes.CaselessDict现在接受Mapping实例,而不仅仅是字典 (issue 2646)媒体下载,使用
FilesPipeline或ImagesPipeline,现在可以选择性地处理 HTTP 重定向,使用新的MEDIA_ALLOW_REDIRECTS设置 (问题 2616, 修复 问题 2004)使用新的
DOWNLOAD_FAIL_ON_DATALOSS设置接受来自网站的不完整响应(问题 2590,修复了问题 2586)通过
FEED_EXPORT_INDENT设置实现JSON和XML项目的可选美化输出(问题2456,修复了问题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)
始终在
HttpCompressionMiddleware阶段解压缩Content-Encoding: gzip(issue 2391)在
Spider.custom_settings中尊重自定义日志级别 (issue 2581, 修复了 issue 1612)‘make htmlview’ 修复适用于 macOS (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)
在默认项目中间件模板中添加省略的
self参数(issue 2595)移除ExecutionEngine中冗余的
slot.add_request()调用 (issue 2617)在
scrapy.pipelines.files.FSFilesStore中捕获更具体的os.error异常(issue 2644)更改“localhost”测试服务器证书 (issue 2720)
移除未使用的
MEMUSAGE_REPORT设置 (issue 2576)
文档¶
提到由于lxml中的bug导致的
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项目写入器示例中以文本模式打开文件(问题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(问题2457)。添加对Python 3.6的支持(issue 2485)。
在PyPy上运行测试(警告:一些测试仍然失败,因此PyPy尚未得到支持)。
错误修复¶
强制执行
DNS_TIMEOUT设置 (issue 2496)。修复
view命令;这是 v1.3.0 中的一个回归问题 (issue 2503)。修复与文件和图像管道相关的
*_EXPIRES settings的测试(issue 2460)。修复使用基本项目模板时生成的管道类的名称(问题 2466)。
修复在Python 3.6上的
scrapy.Item继承问题 (issue 2511)。在
SPIDER_MIDDLEWARES、DOWNLOADER_MIDDLEWARES、EXTENSIONS和SPIDER_CONTRACTS中强制使用数值作为组件的顺序(issue 2420)。
文档¶
重写行为准则部分并升级至贡献者契约v1.4 (issue 2469).
澄清传递蜘蛛参数会将其转换为蜘蛛属性 (issue 2483).
文档
formid参数在FormRequest.from_response()上 (issue 2497).为README文件添加.rst扩展名(问题2507)。
提到LevelDB缓存存储后端(问题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(包括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和fetch(url)在 Scrapy shell 中现在默认遵循 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)处理robots.txt时的几个补丁:
处理(非标准)相对站点地图URL(issue 2390)
在Python 2中处理非ASCII URL和用户代理(issue 2373)
文档¶
文档
"download_latency"键在Request的meta字典中 (issue 2033)从目录中移除关于(已弃用且不受支持的)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()时,提供更有帮助的错误信息(问题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).
各种注意事项:关于蜘蛛名称的问题2330, 关于中间件方法处理顺序的问题2329, 关于将多值HTTP头作为列表获取的问题2327。
其他更改¶
从内置爬虫模板中的
start_urls移除了www.(issue 2299)。
Scrapy 1.2.0 (2016-10-03)¶
新功能¶
新的
FEED_EXPORT_ENCODING设置,用于自定义将项目写入文件时使用的编码。 这可以用于关闭JSON输出中的\uXXXX转义。 这对于那些希望在XML或CSV输出中使用UTF-8以外的编码的人也很有用(问题2034)。startproject命令现在支持一个可选的目标目录,以覆盖基于项目名称的默认目录(issue 2005)。新增
SCHEDULER_DEBUG设置以记录请求序列化失败的情况 (issue 1610)。JSON 编码器现在支持序列化
set实例 (issue 2058)。将
application/json-amazonui-streaming解释为TextResponse(issue 1503).scrapy在使用 shell 工具时默认导入 (shell, inspect_response) (issue 2248).
错误修复¶
DefaultRequestHeaders 中间件现在在 UserAgent 中间件之前运行 (issue 2088)。警告:这在技术上是向后不兼容的, 尽管我们认为这是一个错误修复。
HTTP缓存扩展和使用
.scrapy数据目录的插件现在可以在项目之外工作(issue 1581)。警告:这在技术上是向后不兼容的,尽管我们认为这是一个错误修复。Selector不再允许同时传递response和text(issue 2153).修复了使用
scrapy parse时错误回调名称的日志记录问题(issue 2169)。修复了一个奇怪的gzip解压缩错误(问题1606)。
修复了在使用
CrawlSpider与scrapy parse时选择的回调问题 (issue 2225).修复了当爬虫未产生任何项目时无效的JSON和XML文件的问题(问题 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).
更新了
Response参数的文档(issue 2197)。重新表述了误导性的
RANDOMIZE_DOWNLOAD_DELAY描述(问题 2190)。将StackOverflow添加为支持渠道(问题2257)。
Scrapy 1.1.4 (2017-03-03)¶
打包修复:在setup.py中禁止不支持的Twisted版本
Scrapy 1.1.3 (2016-09-22)¶
错误修复¶
ImagesPipeline和FilesPipeline子类的类属性在 1.1.1 版本之前的工作方式保持不变 (issue 2243, 修复了 issue 2198)
文档¶
Scrapy 1.1.2 (2016-08-18)¶
错误修复¶
引入一个缺失的
IMAGES_STORE_S3_ACL设置,用于在上传图片到S3时覆盖ImagesPipeline中的默认ACL策略(注意,自Scrapy 1.1.0起,默认ACL策略为“private”而非“public-read”)IMAGES_EXPIRES默认值恢复为90 (此回归问题在1.1.1版本中引入)
Scrapy 1.1.1 (2016-07-13)¶
错误修复¶
在CONNECT请求中添加“Host”头到HTTPS代理(issue 2069)
选择响应类时使用响应
body(issue 2001, 修复 issue 2000)不要在规范化具有错误网络位置的URL时失败 (issue 2038, 修复 issue 2010)
对
HttpCompressionMiddleware(和SitemapSpider)的一些修复:不要解码HEAD响应 (issue 2008, 修复 issue 1899)
处理gzip Content-Type头中的字符集参数 (issue 2050, 修复 issue 2049)
不要解压缩gzip八位字节流响应 (issue 2065, 修复 issue 2063)
使
FilesPipeline和ImagesPipeline再次向后兼容 关于使用旧版类属性进行自定义 (issue 1989, 修复 issue 1985)
新功能¶
在项目文件夹外启用genspider命令 (issue 2052)
默认情况下重试HTTPS CONNECT
TunnelError(issue 1974)
文档¶
FEED_TEMPDIR设置在字典序位置 (commit 9b3c72c)在概述中使用惯用的
.extract_first()(issue 1994)更新版权声明中的年份 (commit c2c8036)
添加关于错误回调的信息和示例 (issue 1995)
在下载器中间件示例中使用“url”变量(issue 2015)
语法修正 (issue 2054, issue 2120)
关于在爬虫回调中使用BeautifulSoup的新FAQ条目 (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版本带来了许多有趣的功能和错误修复:
Scrapy 1.1 支持 Python 3 的测试版(需要 Twisted >= 15.5)。有关更多详情和一些限制,请参见 Beta Python 3 Support。
热门新功能:
项目加载器现在支持嵌套加载器 (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库中(问题1409)。这意味着你可以在不使用Scrapy的情况下使用Scrapy选择器,并且可以在不需要升级Scrapy的情况下升级选择器引擎。
HTTPS下载器现在默认进行TLS协议协商,而不是强制使用TLS 1.0。您还可以使用新的
DOWNLOADER_CLIENT_TLS_METHOD设置SSL/TLS方法。
这些错误修复可能需要您的关注:
默认情况下,不要重试错误的请求(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)。如果你想禁用 此行为,请在创建新项目后更新
ROBOTSTXT_OBEY在settings.py文件中。导出器现在默认处理Unicode,而不是字节(问题1080)。 如果您使用
PythonItemExporter,您可能需要更新您的代码以禁用现在已弃用的二进制模式。接受包含点的XML节点名称为有效(issue 1533)。
当上传文件或图片到S3(使用
FilesPipeline或ImagesPipeline)时,默认的ACL策略现在是“private”而不是 “public” 警告:向后不兼容!。 你可以使用FILES_STORE_S3_ACL来更改它。我们已经重新实现了
canonicalize_url()以获得更正确的输出,特别是对于包含非ASCII字符的URL(问题1947)。与之前的Scrapy版本相比,这可能会改变链接提取器的输出。这也可能使您从1.1版本之前的运行中仍然保留的一些缓存条目失效。警告:向后不兼容!。
继续阅读以了解更多关于其他改进和错误修复的详细信息。
Beta Python 3 支持¶
我们一直在努力使Scrapy在Python 3上运行。因此,现在你可以在Python 3.3、3.4和3.5上运行爬虫(需要Twisted >= 15.5)。一些功能仍然缺失(有些可能永远不会被移植)。
几乎所有内置的扩展/中间件都应该可以工作。 然而,我们意识到在Python 3中存在一些限制:
Scrapy 在 Windows 上不支持 Python 3
不支持发送电子邮件
不支持FTP下载处理器
不支持Telnet控制台
其他新功能和增强功能¶
命令行工具现在支持zsh的自动补全功能(issue 934)。
对
scrapy shell的改进:支持bpython并通过
SCRAPY_PYTHON_SHELL配置首选的Python shell(issue 1100, issue 1444)。支持没有协议的URL(问题1498) 警告:向后不兼容!
恢复对相对文件路径的支持(issue 1710, issue 1550)。
添加了
MEMUSAGE_CHECK_INTERVAL_SECONDS设置以更改默认检查间隔(问题 1282)。下载处理程序现在在首次请求时使用其方案进行延迟加载(issue 1390, issue 1421)。
HTTPS下载处理器不再强制使用TLS 1.0;相反,使用OpenSSL的
SSLv23_method()/TLS_method(),允许尝试与远程主机协商其支持的最高TLS协议版本(问题1794,问题1629)。RedirectMiddleware现在会跳过从handle_httpstatus_list在蜘蛛属性 或Request的meta键中的状态码 (issue 1334, issue 1364, issue 1447).表单提交:
现在也适用于
元素(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_TEMPDIR设置进行自定义(issue 1847)。FilesPipeline和ImagesPipeline的设置现在作为实例属性而不是类属性,这使得可以针对特定的爬虫行为进行设置 (issue 1891)。JsonItemExporter现在将方括号的打开和关闭格式化为单独的行(输出文件的第一行和最后一行)(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)。 警告:向后不兼容,但不会破坏用户代码。以下数据类型已被弃用(问题 1720):
scrapy.utils.datatypes.MultiValueDictKeyErrorscrapy.utils.datatypes.MultiValueDictscrapy.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的处理问题(问题 1575)。使
_monkeypatches更加健壮 (issue 1634)。修复了
XMLItemExporter中非字符串字段的bug (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提取站点地图现在不区分大小写(问题1902)。当使用多个代理连接到同一远程主机时,HTTPS+CONNECT隧道可能会混淆(问题1912)。
Scrapy 1.0.7 (2017-03-03)¶
打包修复:在setup.py中禁止不支持的Twisted版本
Scrapy 1.0.6 (2016-05-04)¶
修复:RetryMiddleware 现在对非标准 HTTP 状态码具有鲁棒性 (issue 1857)
修复:Filestorage HTTP缓存检查了错误的修改时间(问题 1875)
文档:支持 Sphinx 1.4+ (issue 1893)
文档:选择器示例中的一致性(问题 1869)
Scrapy 1.0.5 (2016-02-04)¶
修复:[回溯] 在LinkExtractors中忽略虚假链接(修复了问题 907, 提交 108195e)
TST: 更改了buildbot的makefile以使用‘pytest’ (commit 1f3d90a)
文档:修复了教程和媒体管道中的拼写错误 (commit 808a9ea 和 commit 803bd87)
文档:在设置文档中将AjaxCrawlMiddleware添加到DOWNLOADER_MIDDLEWARES_BASE中 (commit aa94121)
Scrapy 1.0.4 (2015-12-30)¶
忽略xlib/tx文件夹,取决于Twisted版本。(commit 7dfa979)
在新的travis-ci基础设施上运行 (commit 6e42f0b)
拼写修正 (commit 823a1cc)
在xmliter正则表达式中转义节点名称 (commit da3c155)
测试带有点的XML节点名称 (commit 4418fc3)
TST 不要在测试中使用损坏的 Pillow 版本 (commit a55078c)
禁用版本命令的日志记录。关闭 #1426 (commit 86fc330)
在startproject命令上禁用日志 (commit db4c9fe)
添加 PyPI 下载统计徽章 (commit df2b944)
如果从scrapy/scrapy分支提交PR,不要在Travis上运行两次测试(commit a83ab41)
在README中添加Python 3移植状态徽章 (commit 73ac80d)
修复了RFPDupeFilter的持久性问题 (commit 97d080e)
TST 一个测试,用于展示重复过滤器持久化功能未正常工作 (commit 97f2fb3)
在file://方案处理程序上显式关闭文件 (commit d9b4850)
在shell中禁用dupefilter (commit c0d0734)
文档:为出现在侧边栏中的目录树添加标题 (commit aa239ad)
文档 从安装说明中移除了pywin32,因为它已经被声明为依赖项。(commit 10eb400)
添加了关于在Windows和其他操作系统上使用Conda的安装说明。(commit 1c3600a)
修复了小的语法问题。(commit 7f4ddd5)
修复了文档中的一个拼写错误。(commit b71f677)
版本1现已存在 (commit 5456c0e)
修复另一个无效的xpath错误 (commit 0a1366e)
修复 ValueError: 无效的 XPath: //div/[id=”not-exists”]/text() 在 selectors.rst 上 (commit ca8d60f)
拼写错误修正 (commit 7067117)
修复downloader-middleware.rst和exceptions.rst中的拼写错误,middlware -> middleware (commit 32f115c)
在Ubuntu安装部分添加关于Debian兼容性的说明 (commit 23fda69)
用virtualenv替换替代的macOS安装解决方法 (commit 98b63ee)
参考Homebrew的主页以获取安装说明 (commit 1925db1)
将最旧支持的tox版本添加到贡献文档中 (commit 5d10d6d)
在安装文档中注意,pip 已经包含在 python>=2.7.9 中 (commit 85c980e)
在文档的Ubuntu安装部分添加非Python依赖项 (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)
更新教程.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)
DOC 修复 SelectJmes 文档 (commit b8567bc)
文档 将Ubuntu和Archlinux移到Windows子章节之外 (commit 392233f)
文档 从Ubuntu包中移除版本后缀 (commit 5303c66)
DOC 更新1.0版本的发布日期 (commit c89fa29)
Scrapy 1.0.0 (2015-06-19)¶
在这个主要版本中,你会发现许多新功能和错误修复。请务必查看我们更新的概述,以了解一些变化,以及我们更新的教程。
支持在爬虫中返回字典¶
声明和返回Scrapy Items不再是收集从你的爬虫中抓取的数据的必要步骤,你现在可以返回明确的字典来代替。
经典版本
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}
每个爬虫的设置 (GSoC 2014)¶
上一个Google Summer of Code项目完成了对用于填充设置的机制的重要重新设计,引入了显式优先级以覆盖任何给定设置。作为该目标的扩展,我们为仅对单个蜘蛛起作用的设置引入了一个新的优先级级别,允许它们重新定义项目设置。
开始使用它,通过在您的爬虫中定义一个custom_settings类变量:
class MySpider(scrapy.Spider):
custom_settings = {
"DOWNLOAD_DELAY": 5.0,
"RETRY_ENABLED": False,
}
了解更多关于设置填充的信息:Settings
Python 日志记录¶
Scrapy 1.0 已经从 Twisted 日志系统转向支持 Python 内置的日志系统作为默认日志系统。我们保留了大部分旧的自定义接口以调用日志函数,但你会收到警告,建议完全切换到 Python 日志 API。
旧版本
from scrapy import log
log.msg('MESSAGE', log.INFO)
新版本
import logging
logging.info('MESSAGE')
使用蜘蛛进行日志记录保持不变,但在log()方法之上,您将可以访问为蜘蛛创建的自定义logger以发出日志事件:
class MySpider(scrapy.Spider):
def parse(self, response):
self.logger.info('Response received')
更多信息请参阅日志记录文档:Logging
爬虫API重构(GSoC 2014)¶
去年Google Summer of Code的另一个里程碑是对内部API进行了重构,旨在寻求更简单和更易用的方式。请查看新的核心接口:Core 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 (查看其他替代方案: 部署爬虫) |
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 日志记录 (issue 1060, issue 1235, issue 1236, issue 1240, issue 1259, issue 1278, issue 1286)
FEED_EXPORT_FIELDS 选项 (issue 1159, issue 1224)
DNS缓存大小和超时选项 (issue 1132)
支持在xmliter_lxml中使用命名空间前缀(issue 963)
Reactor线程池最大大小设置 (issue 1123)
允许爬虫返回字典。(issue 1081)
添加 Response.urljoin() 助手 (issue 1086)
在 ~/.config/scrapy.cfg 中查找用户配置 (issue 1098)
处理TLS SNI (issue 1101)
选择器列表提取第一个 (issue 624, issue 1145)
添加了JmesSelect (issue 1016)
为文件系统HTTP缓存后端添加gzip压缩 (issue 1020)
链接提取器中的CSS支持(issue 983)
httpcache 不缓存元数据 #19 #689 (issue 821)
添加信号以在请求被调度程序丢弃时发送 (issue 961)
避免下载大响应 (issue 946)
允许在CSVFeedSpider中指定quotechar(issue 882)
将引用者添加到“Spider错误处理”日志消息中 (issue 795)
处理robots.txt一次 (issue 896)
GSoC 每个爬虫的设置 (issue 854)
添加项目名称验证 (issue 817)
GSoC API清理 (issue 816, issue 1128, issue 1147, issue 1148, issue 1156, issue 1185, issue 1187, issue 1258, issue 1268, issue 1276, issue 1285, issue 1284)
在IO操作中更加响应迅速(issue 1074 和 issue 1075)
在关闭时为httpcache执行leveldb压缩 (issue 1297)
弃用和移除
弃用htmlparser链接提取器 (issue 1205)
从FeedExporter中移除已弃用的代码 (issue 1155)
为了兼容.15的遗留问题 (issue 925)
放弃对CONCURRENT_REQUESTS_PER_SPIDER的支持 (issue 895)
删除旧的引擎代码 (issue 911)
弃用 SgmlLinkExtractor (issue 777)
重定位
将 exporters/__init__.py 移动到 exporters.py (issue 1242)
将基础类移动到它们的包中 (issue 1218, issue 1233)
模块重定位 (issue 1181, issue 1210)
将SpiderManager重命名为SpiderLoader (issue 1166)
移除 djangoitem (issue 1177)
移除scrapy部署命令 (issue 1102)
解散 contrib_exp (issue 1134)
从根目录删除了bin文件夹,修复了#913 (issue 914)
移除基于jsonrpc的webservice (issue 859)
修复设置中重新定位路径的向后不兼容性 (issue 1267)
文档
CrawlerProcess 文档 (issue 1190)
在描述中更倾向于使用网页抓取而不是屏幕抓取 (issue 1188)
Scrapy教程的一些改进(issue 1180)
记录文件管道与图像管道一起使用 (issue 1150)
部署文档调整 (issue 1164)
添加了关于scrapyd-deploy和shub的部署部分(issue 1124)
向项目模板添加更多设置 (issue 1073)
对概览页面的一些改进 (issue 1106)
更新了docs/topics/architecture.rst中的链接 (issue 647)
DOC 重新排序主题 (issue 1022)
更新Request.meta特殊键的列表 (issue 1071)
DOC 文档下载超时 (issue 898)
DOC 简化扩展文档 (issue 893)
泄露文档 (issue 894)
DOC 文档中的 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)
Bug修复
项目多重继承修复 (issue 353, issue 1228)
ItemLoader.load_item: 遍历字段的副本 (issue 722)
强制将DOWNLOAD_TIMEOUT读取为整数 (issue 954)
scrapy.utils.misc.load_object 应该打印完整的回溯 (issue 902)
修复“.local”主机名的错误(issue 878)
修复了启用的扩展、中间件、管道信息不再打印的问题 (issue 879)
修复当在meta中设置为false时dont_merge_cookies的不良行为 (issue 846)
Python 3 正在进行中的支持
如果twisted.conch不可用,则禁用scrapy.telnet(issue 1161)
修复 ajaxcrawl.py 中的 Python 3 语法错误 (issue 1162)
更多针对 urllib 的 Python3 兼容性更改 (issue 1121)
assertItemsEqual 在 Python 3 中被重命名为 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: 使用six来处理robotparser和urlparse (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)
测试
从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代理签名(commit 540b9bc)
文档中修复了几个更多的引用 (commit b4c454b)
DOC 修复了一个引用 (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,因为 >0.11 版本无法与测试一起使用 (commit c6b21f0)
在本地测试解析命令,而不是针对外部URL(commit c3a6628)
修复了在HTTPDownloadHandler上关闭连接池时的Twisted问题 (commit d0bf957)
更新动态项目类的文档。(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)
更新请求-响应文档 (commit 3f3263d)
SgmlLinkExtractor - 修复解析包含Unicode的标签的问题 (commit 49b40f0)
Scrapy 0.24.4 (2014-08-09)¶
pem 文件由 mockserver 使用,并且是 scrapy bench 所需的 (commit 5eddc68b63)
scrapy bench 需要 scrapy.tests* (commit d6cb999)
Scrapy 0.24.3 (2014-08-09)¶
不需要在py3上浪费travis-ci的时间来测试0.24版本 (commit 8e080c1)
更新安装文档 (commit 1d0c096)
有一个用于Scrapy框架的分类器宝藏!(commit 4c701d7)
更新其他提到w3lib版本的地方 (commit d109c13)
将w3lib需求更新至1.8.0 (commit 39d2ce5)
使用 w3lib.html.replace_entities()(remove_entities() 已弃用)(commit 180d3ad)
设置 zip_safe=False (commit a51ee8b)
不要发布测试包 (commit ee3b371)
不再需要scrapy.bat (commit c3861cf)
现代化 setup.py (commit 362e322)
headers 不能处理非字符串值 (commit 94a5c65)
修复FTP测试用例 (commit a274a7f)
Travis-CI构建的总结大约需要50分钟才能完成(commit ae1e2cc)
更新 shell.rst 中的拼写错误 (commit e49c96a)
移除 shell 结果中的奇怪缩进 (commit 1ca489d)
改进了解释,明确了博客文章作为来源,并在规范中添加了XPath字符串函数的链接(commit 65c8f05)
重命名了UserTimeoutError和ServerTimeouterror #583 (commit 037f6ab)
向选择器文档添加一些xpath技巧 (commit 2d103e0)
修复测试以考虑 https://github.com/scrapy/w3lib/pull/23 (commit f8d366a)
修复了get_func_args的最大递归问题 #728 (commit 81344ea)
根据#560更新了输入/输出处理器示例。(commit f7c4ea8)
修复了教程中的Python语法。(commit db59ed9)
为隧道代理添加测试用例 (commit f090260)
修复了在使用隧道时泄漏Proxy-Authorization头到远程主机的问题 (commit d8793af)
从MIME类型为“application/xml”的XHTML文档中提取链接(commit ed1f376)
合并拉取请求 #793 来自 roysc/patch-1 (commit 91a1106)
修复了commands.rst中的拼写错误 (commit 743e1e2)
更好的测试用例用于 settings.overrides.setdefault (commit e22daaf)
根据http 1.1定义使用CRLF作为行标记 (commit 5ec430b)
Scrapy 0.24.2 (2014-07-08)¶
使用可变映射来代理已弃用的settings.overrides和settings.defaults属性(commit e5e8133)
目前还不支持python3 (commit 3cd6146)
更新Python兼容版本设置为Debian包(commit fa5d76b)
DOC 修复发布说明中的格式问题 (commit c6a9e20)
Scrapy 0.24.1 (2014-06-27)¶
修复已弃用的CrawlerSettings并增加与.defaults属性的向后兼容性(commit 8e3f20a)
Scrapy 0.24.0 (2014-06-26)¶
增强功能¶
添加新的基于lxml的LinkExtractor以替换不再维护的SgmlLinkExtractor (issue 559, issue 761, issue 763)
清理设置API - 每个爬虫设置的一部分 GSoC项目 (issue 737)
Telnet 控制台现在默认绑定到 127.0.0.1 (issue 699)
在lxml XPath评估中禁用智能字符串(issue 535)
将基于文件系统的缓存恢复为http缓存中间件的默认设置(issue 541, issue 500, issue 571)
在Scrapy shell中暴露当前的爬虫 (issue 557)
改进测试套件,比较CSV和XML导出器 (issue 570)
新增
offsite/filtered和offsite/domains统计 (issue 566)支持在CrawlSpider中将process_links作为生成器使用(issue 555)
详细日志记录和新的统计计数器用于DupeFilter (issue 553)
向
MailSender.send()添加一个mimetype参数(issue 602)通用化文件管道日志消息 (issue 622)
在SGMLLinkExtractor中用HTML实体替换无法编码的代码点(issue 565)
将SEP文档转换为rst格式(issue 629, issue 630, issue 638, issue 632, issue 636, issue 640, issue 635, issue 634, issue 639, issue 637, issue 631, issue 633, issue 641, issue 642)
允许禁用下载器处理程序,就像禁用其他组件一样 (issue 650)
当请求在重定向次数过多后被丢弃时记录日志 (issue 654)
使用来自ppa的最新pypi运行pypy测试(问题674)
使用 pytest 而不是 trial 运行测试套件 (issue 679)
在tox环境中构建文档并检查死链接(issue 687)
在
url_is_from_any_domain()中支持不区分大小写的域名 (issue 693)移除项目和爬虫模板中的pep8警告 (issue 698)
request_fingerprint函数的测试和文档 (issue 597)更新GSoC项目的SEP-19
per-spider settings(issue 705)当合约失败时将退出代码设置为非零(issue 727)
添加一个设置来控制作为下载器组件实例化的类 (issue 738)
在
item_dropped信号中传递响应(issue 724)文档
spider.closed()快捷方式 (issue 719)文档
request_scheduled信号 (issue 746)添加关于报告安全问题的说明 (issue 697)
对
scrapy list命令的蜘蛛列表输出进行排序 (issue 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)
修复了type()的动态itemclass示例用法 (issue 603)
使用 lucasdemarchi/codespell 来修复拼写错误 (issue 628)
修复SgmlLinkExtractor中attrs参数的默认值为元组 (issue 661)
修复站点地图阅读器中的XXE漏洞 (issue 676)
修复引擎以支持过滤的启动请求 (issue 707)
修复没有主机名的URL上的异地中间件案例 (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)
修复HtmlParserLinkExtractor和测试在#485合并后 (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)
DOC 修复了默认值中的 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命名空间(问题472)
统一项目加载器,类似于选择器重命名 (issue 461)
使
RFPDupeFilter类易于子类化 (issue 533)提高测试覆盖率和即将到来的Python 3支持 (issue 525)
将设置和中间件的启动信息提升到INFO级别 (issue 520)
支持在
get_func_args工具中使用部分参数(问题 506,问题:504)允许通过tox运行单个测试 (issue 503)
更新被链接提取器忽略的扩展名 (issue 498)
添加中间件方法以获取文件/图像/缩略图路径 (issue 490)
改进外部中间件测试 (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()(问题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)¶
更新CrawlSpider模板以选择器更改 (commit 6d1457d)
修复教程中的方法名称。关闭 GH-480 (commit b4fc359
Scrapy 0.20.1 (发布于 2013-11-28)¶
include_package_data 是从发布的源代码构建轮子所必需的 (commit 5ba1ad5)
process_parallel 在其内部 deferreds 上泄漏了失败。关闭 #458 (commit 419a780)
Scrapy 0.20.0 (发布于 2013-11-08)¶
增强功能¶
请求/响应的URL/正文属性现在不可变 (修改它们已经被弃用很长时间了)
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和queuelibPython 包的开发版本测试 Scrapy 的更改。将pypy 2.1添加到持续集成测试中 (commit ecfa7431)
使用importlib进行参数化导入 (issue 445)
处理在Python 2.7.5中引入的影响XmlItemExporter的回归问题(问题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)¶
修复了关于延迟评估启动请求的回归问题 (commit 12693a5)
表单:不要提交重置输入 (commit e429f63)
增加单元测试的超时时间以减少Travis的误报失败 (commit 912202e)
将主分支的修复反向移植到json导出器 (commit cfc2d46)
在生成sdist压缩包之前修复权限并设置umask (commit 06149e0)
Scrapy 0.18.2 (发布于 2013-09-03)¶
回迁
scrapy check命令修复和向后兼容的多爬虫进程(issue 339)
Scrapy 0.18.1 (发布于 2013-08-27)¶
移除由精选更改添加的额外导入 (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客户端后未重试某些连接错误的retry中间件,关闭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恢复选项来解析站点地图 (issue 347)
修复了按主机名而不是按网络位置合并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)Bugfix
TakeFirst处理器不应丢弃零(0)值 (issue 59)支持在xml导出器中嵌套项目(issue 66)
提高cookies处理性能 (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)添加了下载器基准测试网络服务器和爬虫工具 基准测试
将持久化(在磁盘上)的队列移动到一个单独的项目(queuelib),Scrapy 现在依赖于该项目
使用外部库添加Scrapy命令(issue 260)
为
scrapy命令行工具添加了--pdb选项添加了
XPathSelector.remove_namespaces,它允许从XML文档中移除所有命名空间以便于使用(以便使用无命名空间的XPaths)。在选择器中进行了文档记录。对蜘蛛合约的多项改进
新的默认中间件名为MetaRefreshMiddleware,用于处理meta-refresh 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)
修复不准确的下载器中间件文档。参考 #280 (commit 40667cb)
文档:移除指向diveintopython.org的链接,该网站已不再可用。关闭 #246 (commit bd58bfa)
在无效的HTML5文档中查找表单节点 (commit e3d6945)
修复将attrs类型标记为bool而不是list的拼写错误 (commit a274276)
Scrapy 0.16.4 (发布于 2013-01-23)¶
修复文档中的拼写错误 (commit 6d2b3aa)
添加关于禁用扩展的文档。参考 #132 (commit c90de33)
修复了错误消息的格式。log.err() 不支持酷炫的格式化,当发生错误时,消息是:“ERROR: 处理 %(item)s 时出错”(commit c16150c)
整理和改进图像管道的错误日志记录 (commit 56b45fc)
修复了文档中的拼写错误 (commit 243be84)
添加文档主题:广泛爬取和常见实践 (commit 1fbb715)
修复了在未明确指定蜘蛛时Scrapy解析命令中的错误。关闭 #209 (commit c72e682)
更新文档/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)
文档:从FAQ中删除了损坏的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 变更:
添加了Spiders Contracts,一种以正式/可重复方式测试蜘蛛的机制
为
runspider命令添加了选项-o和-t记录了 AutoThrottle 扩展 并添加到默认安装的扩展中。您仍然需要通过
AUTOTHROTTLE_ENABLED启用它主要统计收集重构:移除了全局/每个爬虫统计的分离,移除了与统计相关的信号(
stats_spider_opened等)。现在统计更加简单,统计收集器API和信号的向后兼容性得以保持。添加了
process_start_requests()方法到爬虫中间件删除了Signals单例。现在应该通过Crawler.signals属性访问Signals。有关更多信息,请参阅signals文档。
删除了Stats Collector单例。现在可以通过Crawler.stats属性访问统计信息。有关更多信息,请参阅统计信息收集文档。
已记录的 Core API
lxml现在是默认的选择器后端,而不是libxml2将FormRequest.from_response()移植为使用lxml而不是ClientForm
移除的模块:
scrapy.xlib.BeautifulSoup和scrapy.xlib.ClientFormSitemapSpider: 添加了对以.xml和.xml.gz结尾的站点地图URL的支持,即使它们宣传了错误的内容类型 (commit 10ed28b)
StackTraceDump 扩展:同时转储 trackref 的实时引用 (commit fe2ce93)
嵌套项现在在JSON和JSONLines导出器中完全支持
添加了
cookiejar请求元键,以支持每个蜘蛛的多个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 (+http://scrapy.org)移除了(未记录的)
HTMLImageLinkExtractor类,该类来自scrapy.contrib.linkextractors.image移除了每个爬虫的设置(将被替换为实例化多个爬虫对象)
USER_AGENT爬虫属性将不再有效,请使用user_agent属性代替DOWNLOAD_TIMEOUT爬虫属性将不再有效,请使用download_timeout属性代替移除了
ENCODING_ALIASES设置,因为编码自动检测已移至 w3lib 库将 DjangoItem 提升为主贡献
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 webservice中的bug。同时从extras/scrapy-ws.py中移除了不再支持的‘run’命令(commit 340fbdb)
meta标签的content-type http-equiv属性可以以任何顺序排列。#123 (commit 0cb68af)
将“import Image”替换为更标准的“from PIL import Image”。关闭 #88 (commit 4d17048)
返回试验状态作为 bin/runtests.sh 的退出值。 #118 (commit b7b2e7f)
Scrapy 0.14.3¶
忘记包含pydispatch许可证。#118 (commit fd85f9c)
在源代码分发中包含测试套件使用的egg文件。#118 (commit c897793)
更新项目模板中的文档字符串,以避免与genspider命令混淆,该命令可能被视为高级功能。参考 #107 (commit 2548dcc)
在docs/topics/firebug.rst中添加了关于Google目录关闭的说明 (commit 668e352)
当槽为空时不要丢弃,只需将其保存在另一个字典中以便在需要时再次回收。(commit 8e9f607)
不要在处理libxml2支持的选择器中的unicode xpaths时失败 (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网址进行扩展(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)
添加了
-o选项到scrapy crawl,这是一个将抓取的项目转储到文件中的快捷方式(或使用-的标准输出)为S3下载器处理程序添加boto 2.0支持 (r2763)
在请求错误回调中,现在可以在
failure.request属性中接收到有问题的请求(r2738)- Big downloader refactoring to support per domain/ip concurrency limits (r2732)
CONCURRENT_REQUESTS_PER_SPIDERsetting has been deprecated and replaced by:
查看文档以获取更多详细信息
添加了内置的缓存DNS解析器 (r2728)
已将亚马逊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 meta charset声明的支持,改进了编码检测 (r2690)
重构了关闭蜘蛛的行为,以等待所有下载完成并由蜘蛛处理,然后再关闭蜘蛛 (r2688)
添加了
SitemapSpider(参见Spiders页面中的文档)(r2658)添加了
LogStats扩展,用于定期记录基本统计信息(如爬取的页面和抓取的项目)(r2657)使处理gzip响应的方式更加健壮(#319,r2643)。现在Scrapy会尝试尽可能多地从gzip响应中解压缩数据,而不是因为
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.jsonAPI (r2571)CsvItemExporter: 添加了join_multivalued参数 (r2578)为
xmliter_lxml添加了命名空间支持 (r2552)通过改进
COOKIES_DEBUG使其更友好并记录文档来改进cookies中间件 (r2579)对Scrapyd和链接提取器的几项改进
代码重新排列并删除¶
- Merged item passed and item scraped concepts, as they have often proved confusing in the past. This means: (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)移除了向
scrapy crawl命令传递url的支持(请改用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(#273)的item参数中发送。为
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个日志(默认情况下)
添加了一个最小的网页用户界面,默认情况下可在http://localhost:6800访问
现在有一个
scrapy server命令来启动当前项目的Scrapyd服务器
设置更改¶
添加了
HTTPCACHE_ENABLED设置(默认值为False)以启用HTTP缓存中间件更改了
HTTPCACHE_EXPIRATION_SECS的语义:现在零表示“永不过期”。
已弃用/废弃的功能¶
已弃用
runserver命令,推荐使用server命令来启动 Scrapyd 服务器。另请参阅:Scrapyd 变更已弃用
queue命令,推荐使用 Scrapyd 的schedule.jsonAPI。另请参阅:Scrapyd 变更移除了 !LxmlItemLoader(实验性的贡献,从未升级为主要贡献)
Scrapy 0.10¶
像#NNN这样的数字引用的是旧问题跟踪器(Trac)中的票据,该跟踪器已不再可用。
新功能和改进¶
新的Scrapy服务称为
scrapyd,用于在生产环境中部署Scrapy爬虫(#218)(文档可用)简化的图像管道使用,现在不需要子类化你自己的图像管道 (#217)
Scrapy shell 现在默认显示 Scrapy 日志 (#206)
在通用基础代码和可插拔后端中重构了执行队列,称为“spider queues”(#220)
新的持久化爬虫队列(基于SQLite)(#198),默认可用,允许在服务器模式下启动Scrapy,然后安排爬虫运行。
添加了Scrapy命令行工具及其所有可用子命令的文档。(文档可用)
具有可插拔后端的Feed导出器(#197)(文档可用)
延迟信号 (#193)
向项目管道添加了两个新方法 open_spider(), close_spider(),并支持延迟 (#195)
支持为每个爬虫覆盖默认请求头 (#181)
替换了默认的Spider Manager,使用了一个具有类似功能但不依赖于Twisted插件的版本 (#186)
将Debian包拆分为两个包 - 库和服务 (#187)
Scrapy日志重构 (#188)
用于在不同运行之间保持持久爬虫上下文的新扩展 (#203)
添加了
dont_redirectrequest.meta键以避免重定向 (#233)添加了
dont_retryrequest.meta键以避免重试 (#234)
命令行工具更改¶
新的
scrapy命令取代了旧的scrapy-ctl.py(#199) - 现在只有一个全局的scrapy命令,而不是每个项目都有一个scrapy-ctl.py- 添加了scrapy.bat脚本,以便在 Windows 上更方便地运行为命令行工具添加了bash自动补全功能 (#210)
将命令
start重命名为runserver(#209)
API变更¶
url和body属性现在为只读 (#230)Request.copy()和Request.replace()现在也会复制它们的callback和errback属性 (#231)从
scrapy.contrib中移除了UrlFilterMiddleware(默认已禁用)外部中间件不会过滤掉任何来自没有allowed_domains属性的爬虫的请求(#225)
移除了Spider Manager的
load()方法。现在蜘蛛在__init__方法本身中加载。- Changes to Scrapy Manager (now called “Crawler”):
scrapy.core.manager.ScrapyManager类已重命名为scrapy.crawler.Crawlerscrapy.core.manager.scrapymanager单例已移至scrapy.project.crawler
移动模块:
scrapy.contrib.spidermanager到scrapy.spidermanagerSpider Manager 单例从
scrapy.spider.spiders移动到spiders` attribute of ``scrapy.project.crawler单例。- moved Stats Collector classes: (#204)
scrapy.stats.collector.StatsCollector到scrapy.statscol.StatsCollectorscrapy.stats.collector.SimpledbStatsCollector到scrapy.contrib.statscol.SimpledbStatsCollector
默认的每个命令设置现在在命令对象类的
default_settings属性中指定 (#201)- changed arguments of Item pipeline
process_item()method from(spider, item)to(item, spider) 保持向后兼容性(带有弃用警告)
- changed arguments of Item pipeline
- moved
scrapy.core.signalsmodule toscrapy.signals 保持向后兼容性(带有弃用警告)
- moved
- moved
scrapy.core.exceptionsmodule toscrapy.exceptions 保持向后兼容性(带有弃用警告)
- moved
添加了
handles_request()类方法到BaseSpider删除了
scrapy.log.exc()函数(改用scrapy.log.err()代替)删除了
scrapy.log.msg()函数的component参数删除了
scrapy.log.log_level属性添加了
from_settings()类方法到Spider Manager和Item Pipeline Manager
设置更改¶
添加了
HTTPCACHE_IGNORE_SCHEMES设置,以在!HttpCacheMiddleware中忽略某些方案(#225)添加了
SPIDER_QUEUE_CLASS设置,用于定义要使用的爬虫队列(#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命令 - 用于在浏览器中查看URL,就像Scrapy看到的那样 (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 现在可以处理相对基础标签的URL (r1960 | #148)
对项目加载器和处理器的几项改进 (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用于向爬虫提供抓取任务 (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()now receives aspiderargument (r1822)旧域名参数已被弃用,并将在0.9版本中移除。对于爬虫,您应始终使用
spider参数并传递爬虫引用。如果您确实想传递字符串,请改用component参数。
更改了核心信号
domain_opened,domain_closed,domain_idle- Changed Item pipeline to use spiders instead of domains
process_item()项目管道方法的domain参数已更改为spider,新的签名为:process_item(spider, item)(r1827 | #105)要快速移植你的代码(以与Scrapy 0.8一起工作),只需在你之前使用
domain的地方使用spider.domain_name。
- Changed Stats API to use spiders instead of domains (r1849 | #113)
StatsCollector被更改为在其方法(set_value,inc_value等)中接收爬虫引用(而不是域名)。添加了
StatsCollector.iter_spider_stats()方法移除了
StatsCollector.list_domains()方法此外,Stats信号已被重命名,现在传递的是蜘蛛引用(而不是域名)。以下是更改的摘要:
要快速移植你的代码(以与Scrapy 0.8一起工作),只需在你之前使用
domain的地方使用spider.domain_name。spider_stats包含与domain_stats完全相同的数据。
CloseDomainextension moved toscrapy.contrib.closespider.CloseSpider(r1833)- Its settings were also renamed:
CLOSEDOMAIN_TIMEOUT到CLOSESPIDER_TIMEOUTCLOSEDOMAIN_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缓存中间件已经进行了大幅度的重构,除了删除了域分区功能外,保留了相同的功能。(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的首次发布。