发行说明
Scrapy 2.14.0 (2026-01-05)
亮点
更多基于协程的 API 替代了基于 Deferred 的 API
默认优先级队列现为
DownloaderAwarePriorityQueue停止支持 Python 3.9 和 PyPy 3.10
改进并记录了自定义下载处理程序(download handler)的 API
修改的依赖要求
停止支持 Python 3.9。( issue 7121 )
停止支持 PyPy 3.10。( issue 7050 )
提高了以下依赖项的最低版本要求:
恢复了在 Scrapy 2.13.4 中删除的对
brotlicffi的支持。其最低支持版本现为1.2.0.0。( issue 7160 )
向后不兼容的变化
如果您在 spider 级别将
TWISTED_REACTOR设置为 非 asyncio 值,现在在通过命令行工具运行 Scrapy 时,可能需要将FORCE_CRAWLER_PROCESS设置为True,以避免 reactor 不匹配异常。( issue 6845 )log_count/*统计信息不再包含以前计算的一些早期消息。虽然在计数器初始化之前发出的最早日志消息从未被计算在内,但现在的计数器初始化发生得比以前的 Scrapy 版本晚。如果您在代码中检索并比较这些统计数据的值,可能需要调整预期值。( issue 7046 )下面列出的类现在是抽象基类。它们不能直接实例化,其子类需要重写下面列出的抽象方法才能实例化。如果您以前直接实例化这些类,现在需要对它们进行子类化,并为抽象方法提供琐碎(例如为空)的实现。
scrapy.commands.ScrapyCommandrun()short_desc()
scrapy.exporters.BaseItemExporterscrapy.extensions.feedexport.BlockingFeedStorage_store_in_thread()
scrapy.middleware.MiddlewareManager_get_mwlist_from_settings()
scrapy.spidermiddlewares.referer.ReferrerPolicyreferrer()
( issue 6930 )
Scrapy 不再向
stats collector(统计收集器)的任何方法传递spider参数。即使在旧版本的 Scrapy 中,许多调用中也没有传递该参数,因此我们预计现有的自定义统计收集器实现不需要spider参数。如果您的实现需要Spider实例,可以从传递给构造函数的Crawler实例中获取。( issue 7011 )scrapy.middleware.MiddlewareManager不再包含处理open_spider()和close_spider()组件方法的代码。由于此代码仅用于管道(pipeline),它已被移至scrapy.pipelines.ItemPipelineManager中。此更改应仅影响MiddlewareManager的自定义子类。以下代码已被移除:scrapy.middleware.MiddlewareManager.open_spider()scrapy.middleware.MiddlewareManager.close_spider()scrapy.middleware.MiddlewareManager._add_middleware()中处理open_spider()和close_spider()组件方法的代码。
( issue 7006 )
scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware.process_request()现在返回一个协程,以前它返回一个Deferred对象或None。robot_parser()方法也更改为返回一个协程。此更改仅影响子类化RobotsTxtMiddleware或直接调用其方法的代码。( issue 6802 )内置的下载处理程序已重构,更改了它们的方法签名。此更改应仅影响子类化这些处理程序或直接调用其方法的代码。( issue 6778, issue 7164 )
scrapy.pipelines.media.MediaPipeline.process_item()现在返回一个协程,以前它返回一个Deferred对象。此更改仅影响直接调用此方法的代码。( issue 7177 )
移除已弃用的功能
以下组件在 Scrapy 2.12.0 中弃用的
from_settings()方法已被移除。您应该改用from_crawler()。scrapy.middleware.MiddlewareManagerscrapy.core.downloader.contextfactory.ScrapyClientContextFactory
( issue 7126 )
Scrapy 不再调用第三方组件中在 Scrapy 2.12.0 中弃用的
from_settings()方法。您应该定义from_crawler()方法来代替。( issue 7126 )scrapy.pipelines.media.MediaPipeline及其子类的初始化流程已简化,现在强制要求使用from_crawler()方法和__init__()方法的crawler参数。不使用这些方法的做法已在 Scrapy 2.12.0 中弃用。( issue 7126 )在 Scrapy 2.12.0 中弃用的
REQUEST_FINGERPRINTER_IMPLEMENTATION设置已被移除。( issue 7126 )在 Scrapy 2.12.0 中弃用的
scrapy.utils.misc.create_instance()函数已被移除。请改用scrapy.utils.misc.build_from_crawler()。( issue 7126 )在 Scrapy 2.12.0 中弃用的
scrapy.core.downloader.Downloader._get_slot_key()函数已被移除。请改用scrapy.core.downloader.Downloader.get_slot_key()。( issue 7126 )在 Scrapy 2.12.0 中弃用的
scrapy.twisted_version属性已被移除。您应该直接使用twisted.version属性。( issue 7126 )以下在 Scrapy 2.12.0 中弃用的实用函数已被移除:
scrapy.utils.defer.process_chain_both()scrapy.utils.python.equal_attributes()scrapy.utils.python.flatten()scrapy.utils.python.iflatten()scrapy.utils.request.request_authenticate()scrapy.utils.test.assert_samelines()
( issue 7126 )
在 Scrapy 2.12.0 中弃用的
scrapy.utils.serialize.ScrapyJSONDecoder已被移除。( issue 7126 )在 Scrapy 2.12.0 中弃用的
scrapy.extensions.feedexport.build_storage()函数已被移除,您可以直接调用构建器可调用对象。( issue 7126 )在 Scrapy 2.11.2 中弃用的
scrapy.spidermiddlewares.offsite.OffsiteMiddleware已被移除。应改用scrapy.downloadermiddlewares.offsite.OffsiteMiddleware。( issue 6926 )
弃用项
以下返回
Deferred的方法已被弃用,建议使用其基于协程的替代方案:scrapy.core.downloader.handlers.DownloadHandlersdownload_request()(使用download_request_async())
scrapy.core.downloader.middleware.DownloaderMiddlewareManagerdownload()(使用download_async())
scrapy.core.engine.ExecutionEnginestart()(使用start_async())stop()(使用stop_async())close()(使用close_async())open_spider()(使用open_spider_async())close_spider()(使用close_spider_async())download()(使用download_async())
scrapy.core.scraper.Scraperopen_spider()(使用open_spider_async())call_spider()(使用call_spider_async())close_spider()(使用close_spider_async())handle_spider_output()(使用handle_spider_output_async())start_itemproc()(使用start_itemproc_async())
scrapy.core.spidermw.SpiderMiddlewareManagerscrape_response()(使用scrape_response_async())
-
stop()(使用stop_async())
scrapy.pipelines.ItemPipelineManagerprocess_item()(使用process_item_async())open_spider()(使用open_spider_async())close_spider()(使用close_spider_async())
scrapy.signalmanager.SignalManagersend_catch_log_deferred()(使用send_catch_log_async())
scrapy.utils.signal.send_catch_log_deferred()(使用scrapy.utils.signal.send_catch_log_async())
( issue 6791, issue 6842, issue 6979, issue 6997, issue 6999, issue 7005, issue 7043, issue 7069, issue 7161, issue 7164 )
以下 spider 属性已被弃用,建议改用设置(settings):
download_maxsize(使用DOWNLOAD_MAXSIZE)download_timeout(使用DOWNLOAD_TIMEOUT)download_warnsize(使用DOWNLOAD_WARNSIZE)max_concurrent_requests(使用CONCURRENT_REQUESTS)user_agent(使用USER_AGENT)
( issue 6988, issue 6994, issue 7038, issue 7039, issue 7117, issue 7176 )
以下用户定义函数返回
Deferred已被弃用,建议将它们定义为协程函数:spider 的回调函数(callbacks)和异常回调(errbacks)(这从未被正式支持,且可能工作不正常)
自定义下载器中间件(downloader middlewares)的
process_request(),process_response()和process_exception()方法自定义管道(pipelines)的
process_item(),open_spider()和close_spider()方法信号处理程序(signal handlers)
自定义下载处理程序的
download_request()和close()方法
( issue 6718, issue 6778, issue 7069, issue 7147, issue 7148, issue 7149, issue 7150, issue 7151, issue 7161, issue 7164, issue 7179 )
向以下方法传递
spider参数已被弃用:scrapy.core.spidermw.SpiderMiddlewareManager.process_start()scrapy.core.downloader.Downloader.fetch()scrapy.core.downloader.Downloader._get_slot()scrapy.core.downloader.handlers.DownloadHandlers.download_request()scrapy.spidermiddlewares.base.BaseSpiderMiddleware.process_spider_output()scrapy.spidermiddlewares.base.BaseSpiderMiddleware.process_spider_output_async()内置下载器中间件的所有
process_*()方法内置 spider 中间件的所有
process_*()方法scrapy.pipelines.media.MediaPipeline.open_spider()scrapy.pipelines.media.MediaPipeline.process_item()
( issue 6750, issue 6927, issue 6984, issue 7006, issue 7011, issue 7033, issue 7037, issue 7045, issue 7178 )
在没有
Crawler实例的情况下实例化scrapy.middleware.MiddlewareManager的子类已被弃用。( issue 6984 )对于以下需要
spider参数的用户定义函数和方法,该参数已被弃用。如果您在这些方法内部需要Spider实例,应该从Crawler实例中获取(您可能需要重构代码以在例如from_crawler()方法中保存该实例):自定义下载器中间件(downloader middlewares)的
process_request(),process_response()和process_exception()方法自定义 spider 中间件的
process_spider_input(),process_spider_output(),process_spider_output_async()和process_spider_exception()方法自定义管道的
process_item()方法自定义
DOWNLOADER(下载器)的fetch()方法
( issue 6927, issue 6984, issue 7006, issue 7037 )
自定义下载处理程序中的以下内容已被弃用:
没有
lazy属性(如果您想保持当前行为,应将其定义为True)从
download_request()方法返回Deferred(您应该重构它以返回协程;执行此操作时还需要移除spider参数)没有
close()方法,或者拥有一个同步方法或返回Deferred的方法(您应该重构它以返回协程,或者如果还没有,则添加一个空的协程方法)
( issue 6778, issue 7164 )
ITEM_PROCESSOR的自定义实现现在应定义process_item_async(),open_spider_async()和close_spider_async()方法,以替代或补充process_item(),open_spider()和close_spider()。( issue 7005, issue 7043 )CONCURRENT_REQUESTS_PER_IP设置已被弃用,请改用CONCURRENT_REQUESTS_PER_DOMAIN。( issue 6917, issue 6921 )scrapy.core.downloader.handlers.http模块已被弃用。您应该直接导入scrapy.core.downloader.handlers.http11.HTTP11DownloadHandler,而不是导入scrapy.core.downloader.handlers.http.HTTPDownloadHandler别名。( issue 7079 )scrapy.utils.decorators.defers()装饰器已被弃用,您可以直接使用twisted.internet.defer.maybeDeferred(),或者在代码中重新实现此装饰器。( issue 7164 )scrapy.spiders.CrawlSpider._parse_response()已被弃用,请改用scrapy.spiders.CrawlSpider.parse_with_rules()。( issue 4463, issue 6804 )为 Deferred 添加延迟的函数已被弃用,可以改用它们底层的 Twisted 函数:如果不需延迟则直接使用,如果需要则以显式方式添加延迟。
scrapy.utils.defer.mustbe_deferred()(可以使用twisted.internet.defer.maybeDeferred())scrapy.utils.defer.defer_succeed()(可以使用twisted.internet.defer.succeed())scrapy.utils.defer.defer_fail()(可以使用twisted.internet.defer.fail())scrapy.utils.defer.defer_result()(可以使用twisted.internet.defer.succeed()和twisted.internet.defer.fail())
( issue 6937 )
新功能
添加了
scrapy.crawler.AsyncCrawlerProcess和scrapy.crawler.AsyncCrawlerRunner,作为CrawlerProcess和CrawlerRunner的对应项,提供基于协程的 API。( issue 6789, issue 6790, issue 6796, issue 6817, issue 6845, issue 7034 )为部分基于 Deferred 的 API 添加了协程对应版本:
scrapy.core.downloader.handlers.DownloadHandlersdownload_request_async()(对应download_request())
scrapy.core.downloader.middleware.DownloaderMiddlewareManagerdownload_async()(对应download())
scrapy.core.engine.ExecutionEnginestart_async()(对应start())stop_async()(对应stop())close_async()(对应close())open_spider_async()(对应open_spider())close_spider_async()(对应close_spider())download_async()(对应download())
scrapy.core.scraper.Scraperopen_spider_async()(对应open_spider())close_spider_async()(对应close_spider())start_itemproc_async()(对应start_itemproc())
-
crawl_async()(对应crawl())stop_async()(对应stop())
scrapy.pipelines.ItemPipelineManagerprocess_item_async()(对应process_item())open_spider_async()(对应open_spider())close_spider_async()(对应close_spider())
scrapy.signalmanager.SignalManagersend_catch_log_async()(对应send_catch_log_deferred())
( issue 6781, issue 6791, issue 6792, issue 6795, issue 6801, issue 6817, issue 6842, issue 6997, issue 7005, issue 7043, issue 7069, :issue:7164, issue 7202 )
SCHEDULER_PRIORITY_QUEUE设置的默认值现为'scrapy.pqueues.DownloaderAwarePriorityQueue'。( issue 6924, issue 6940 )添加了
scrapy.extensions.logcount.LogCount,这是一个默认启用的扩展,负责记录log_count/*统计信息。以前,这部分代码位于scrapy.crawler.Crawler中且无法禁用。( issue 7046 )添加了
scrapy.spiders.CrawlSpider.parse_with_rules()作为_parse_response()的公共替代方案。( issue 4463, issue 6804 )添加了
scrapy.utils.asyncio.is_asyncio_available(),作为scrapy.utils.defer.is_asyncio_reactor_installed()的替代方案,其名称和语义更具前瞻性。( issue 6827 )下载处理程序的 API(以前未记录)已现代化并编写进文档。新增了一个可选基类
scrapy.core.downloader.handlers.base.BaseDownloadHandler,以简化符合当前 API 的自定义下载处理程序的编写。( issue 4944, issue 6778, issue 7164 )添加了
scrapy.utils.defer.ensure_awaitable(),这有助于调用可以返回协程、Deferreds 或直接返回值的用户定义函数。( issue 7005 )当启用作业持久化时,由
RFPDupeFilter写入的requests.seen文件现在使用行缓冲(line buffering),以减少 spider 崩溃时的数据丢失。( issue 6019, issue 7094 )由
ImagesPipeline下载的图片现在会根据 EXIF 数据自动转置。( issue 6525, issue 6975 )
改进
重构内部函数,使用协程代替 Deferreds。( issue 6795, issue 6852, issue 6855, issue 6858, issue 7159 )
不需要
CrawlerProcess实例的命令不再创建该实例。( issue 6824 )改进了在使用 IPython 9+ 时
shell帮助信息的格式化效果。( issue 6915, issue 6980 )
错误修复
将
FILES_STORE或IMAGES_STORE设置为None现在可以正确禁用相应的管道。( issue 6964, issue 6969 )MetaRefreshMiddleware现在在重定向到相对 URL 时,会使用<base>标签中设置的 URL 作为基准 URL。( issue 7042, issue 7047 )将
None作为download_slot请求 meta 键的值进行传递,现在其处理方式与根本不设置此 meta 键相同。( issue 7172 )修复了带有 BOM 的
robots.txt文件第一行的解析问题。( issue 6195, issue 7095 )
文档
添加了关于下载处理程序及其 API 和内置处理程序的文档。( issue 4944, issue 7164 )
在 spider 参数文档中添加了关于 scrapy-spider-metadata 库的章节。( issue 6676, issue 6957, issue 7116 )
改进了关于基于协程和基于 Deferred 的 API 的文档。( issue 6800, issue 7146 )
其他文档改进和修复。( issue 7058, issue 7076, issue 7109, issue 7195, issue 7198 )
质量保证
从
twisted.trial切换到pytest-twisted,并用pytest的功能替换了剩余的unittest和twisted.trial功能。( issue 6658, issue 6873, issue 6884, issue 6938 )启用了高级的
pytest断言(asserts)。( issue 6888 )在
pre-commit配置中添加了 Sphinx Lint。( issue 6920 )CI 和测试的改进及修复。( issue 6649, ..., issue 7173 )
代码清理。( issue 6803, ..., issue 7177 )
Scrapy 2.13.4 (2025-11-17)
安全错误修复
改进了
HttpCompressionMiddleware对使用br和deflate方法压缩的响应的解压缩炸弹(decompression bombs)保护:如果单个压缩块解压后的预期大小超过响应大小限制(参见DOWNLOAD_MAXSIZE),则不再进行解压缩。这对于可以提供极高压缩率的br(Brotli) 方法尤为重要。有关详细信息,请参阅 CVE-2025-6176 和 GHSA-2qfp-q593-8484 安全公告。( issue 7134 )
修改的依赖要求
可选包
brotli的最低支持版本现为1.2.0。( issue 7134 )brotlicffi和brotlipy包不再能用于解压 Brotli 压缩响应。请安装brotli包代替。( issue 7134 )
其他变化
限制了最高支持的 Twisted 版本为
25.5.0,因为 Scrapy 目前使用了一些在后续 Twisted 版本中已更改的私有 API。( issue 7142 )停止在测试中设置
COVERAGE_CORE环境变量,该变量不起作用但会导致coverage模块产生警告或错误。( issue 7137 )移除了文档构建对已弃用的
sphinx-hoverxref模块的依赖。( issue 6786, issue 6922 )
Scrapy 2.13.3 (2025-07-02)
更改了默认项目模板中
DOWNLOAD_DELAY(从0变为1) 和CONCURRENT_REQUESTS_PER_DOMAIN(从8变为1) 的值。( issue 6597, issue 6918, issue 6923 )改进了
scrapy.core.engine.ExecutionEngine与初始化和异常处理相关的逻辑,修复了 spider 崩溃、挂起或记录未处理异常的几种情况。( issue 6783, ..., issue 6911 )修复了 Windows 系统下使用
scrapy.extensions.feedexport.FileFeedStorage进行馈送导出(feed exports)时,导致文件在错误的驱动器上创建的问题。( issue 6894, issue 6897 )允许再次使用 Twisted 25.5.0+ 运行测试。由于在该版本中添加了对新 Twisted 版本的支持,现在在未固定版本的环境中运行测试需要 Pytest 8.4.1+。( issue 6893 )
修复了使用 lxml 6.0.0+ 运行测试的问题。( issue 6919 )
在 Scrapy 2.11.2 发行说明中添加了关于
scrapy.spidermiddlewares.offsite.OffsiteMiddleware的弃用通知。( issue 6926 )更新了贡献文档,引用 ruff 而非 black。( issue 6903 )
在
.gitignore中添加了.venv/和.vscode/。( issue 6901, issue 6907 )
Scrapy 2.13.2 (2025-06-09)
修复了 Scrapy 2.13.0 中引入的一个错误,该错误导致当因下载器错误调用 errback 时,请求 errback 的结果被忽略。( issue 6861, issue 6863 )
在
scrapy.utils.reactor.is_asyncio_reactor_installed()的文档以及 Scrapy 2.13.0 发行说明的“向后不兼容的变化”章节中添加了关于其行为变化的说明。( issue 6866 )改进了当未安装 reactor 时由
scrapy.utils.test.get_reactor_settings()抛出的异常消息。( issue 6866 )更新了常见实践中的
scrapy.crawler.CrawlerRunner示例,使其显式安装 reactor,以修复 Scrapy 2.13.0 及更高版本中与 reactor 相关的错误。( issue 6865 )修复了
scrapy fetch无法与 scrapy-poet 配合使用的问题。( issue 6872 )修复了
scrapy.core.engine.ExecutionEngine在未完全初始化前关闭时产生的异常。( issue 6857, issue 6867 )改进了 README,并在其中更新了 Scrapy 的徽标。( issue 6831, issue 6833, issue 6839 )
将测试中使用的 Twisted 版本限制在 25.5.0 以下,因为某些测试在 25.5.0 下会失败。( issue 6878, issue 6882 )
针对 Twisted 25.5.0 的更改更新了类型提示。( issue 6882 )
移除了旧的美术素材。( issue 6874 )
Scrapy 2.13.1 (2025-05-28)
当优先级值相同时,使回调请求(callback requests)优先于启动请求(start requests)。
这使得 2.13.0 中对启动请求处理的更改更加直观且向后兼容。对于所有请求具有相同优先级的场景,在 2.13.0 中,所有启动请求都会在第一个回调请求之前发送。在 2.13.1 中,与 2.12 及更低版本一样,仅当挂起的回调请求不足以达到并发限制时,才会发送启动请求。
( issue 6828 )
在 README 中添加了 deepwiki 徽章。( issue 6793 )
修复了延迟启动请求迭代代码示例中的一个拼写错误。( issue 6812, issue 6815 )
修复了文档中受支持的可调用对象章节的一个拼写错误。( issue 6822 )
使本页面在 PyPI 项目链接中的列表显示更加显著。( issue 6826 )
Scrapy 2.13.0 (2025-05-08)
亮点
asyncio reactor 现在默认启用
使用
start()(异步) 替换了start_requests()(同步),并更改了其迭代方式添加了
allow_offsite请求 meta 键为通用 spider 中间件添加了一个基类
修改的依赖要求
停止支持 PyPy 3.9。( issue 6613 )
添加了对 PyPy 3.11 的支持。( issue 6697 )
向后不兼容的变化
TWISTED_REACTOR设置的默认值从None更改为"twisted.internet.asyncioreactor.AsyncioSelectorReactor"。虽然自 Scrapy 2.7.0 以来,新生成的项目已使用此值,但现在没有显式指定此设置的现有项目也将默认使用 asyncio reactor。您可以在项目中更改此设置以使用其他 reactor。( issue 6659, issue 6713 )启动请求和 item 的迭代不再在调度器中有请求时停止,而是持续运行,直到所有启动请求都已加入调度。
如需重现之前的行为,请参阅延迟启动请求迭代。( issue 6729 )
从 spider 中间件的
open_spider()方法抛出的未处理异常不再导致爬取停止。( issue 6729 )在
scrapy.core.engine.ExecutionEngine中:open_spider()的第二个参数start_requests已被移除。启动请求现在由spider参数决定(参见start())。slot属性已重命名为_slot,且不应再被直接使用。
( issue 6729 )
在
scrapy.core.engine中,Slot类已重命名为_Slot,不应再被使用。( issue 6729 )slottelnet 变量已被移除。( issue 6729 )在
scrapy.core.spidermw.SpiderMiddlewareManager中,process_start_requests()已被process_start()取代。( issue 6729 )现在已弃用的
start_requests()方法,当它返回一个可迭代对象而非定义为生成器时,将在 调度器实例创建之后执行。( issue 6729 )当使用
JOBDIR时,启动请求现在被序列化到它们各自以s为后缀的优先级文件夹中。您可以将SCHEDULER_START_DISK_QUEUE设置为None或""来更改此行为,但这可能会产生副作用。详情请参阅SCHEDULER_START_DISK_QUEUE。( issue 6729 )由
URLLENGTH_LIMIT设置的 URL 长度限制,现在也对启动请求生效。( issue 6777 )现在,在未安装 reactor 的情况下调用
scrapy.utils.reactor.is_asyncio_reactor_installed()会引发异常,而不是安装 reactor。这不应影响正常的 Scrapy 使用场景,但可能会影响使用 Scrapy 内部组件(如Crawler)且未显式安装 reactor 的第三方测试套件。如果您受到此更改的影响,您很可能需要在运行期望已安装 reactor 的 Scrapy 代码之前安装它。(issue 6732, issue 6735)UrlLengthMiddleware的from_settings()方法(在 Scrapy 2.12.0 中弃用)已早于常规弃用期被移除(这是必要的,因为在引入BaseSpiderMiddleware基类并将内置爬虫中间件切换到该基类后,这些中间件在运行时需要Crawler实例)。请改用from_crawler()。(issue 6693)创建
Request实例时不再调用scrapy.utils.url.escape_ajax()。它仅对支持_escaped_fragment_功能的网站有用,而大多数现代网站都不支持该功能。如果您仍需要此功能,可以在将 URL 传递给Request之前对其进行修改。(issue 6523, issue 6651)
弃用移除
移除了某些信号的旧弃用名称别名
stats_spider_opened(请改用spider_opened)stats_spider_closing和stats_spider_closed(请改用spider_closed)item_passed(请改用item_scraped)request_received(请改用request_scheduled)
弃用
Spider的start_requests()方法已弃用,请改用start(),或同时使用两者以维持对较低版本 Scrapy 的支持。(issue 456, issue 3477, issue 4467, issue 5627, issue 6729)爬虫中间件 的
process_start_requests()方法已弃用,请改用process_start(),或同时使用两者以维持对较低版本 Scrapy 的支持。(issue 456, issue 3477, issue 4467, issue 5627, issue 6729)优先级队列类(参见
SCHEDULER_PRIORITY_QUEUE)的__init__方法现在应支持仅限关键字的start_queue_cls参数。(issue 6752)不支持异步爬虫输出的爬虫中间件 已弃用。异步迭代器降级功能(用于在异步回调和其他产生异步迭代器的爬虫中间件中使用此类中间件)也已弃用。请更新所有此类中间件以支持异步爬虫输出。(issue 6664)
从
w3lib.url导入并在scrapy.utils.url中重新导出的函数现已弃用,您应该直接从w3lib.url导入它们。它们包括:scrapy.utils.url.add_or_replace_parameter()scrapy.utils.url.add_or_replace_parameters()scrapy.utils.url.any_to_uri()scrapy.utils.url.canonicalize_url()scrapy.utils.url.file_uri_to_path()scrapy.utils.url.is_url()scrapy.utils.url.parse_data_uri()scrapy.utils.url.parse_url()scrapy.utils.url.path_to_file_uri()scrapy.utils.url.safe_download_url()scrapy.utils.url.safe_url_string()scrapy.utils.url.url_query_cleaner()scrapy.utils.url.url_query_parameter()
HTTP/1.0 支持代码已弃用。它默认被禁用且无法与 HTTP/1.1 同时使用。如果您仍需要它,应编写自己的下载处理器或从 Scrapy 复制相关代码。弃用的内容包括:
scrapy.core.downloader.handlers.http10.HTTP10DownloadHandlerscrapy.core.downloader.webclient.ScrapyHTTPClientFactoryscrapy.core.downloader.webclient.ScrapyHTTPPageGetter重写
scrapy.core.downloader.contextfactory.ScrapyClientContextFactory.getContext()
以下仅在测试中使用的模块和函数已弃用:
scrapy.utils.testproc模块scrapy.utils.testsite模块scrapy.utils.test.assert_gcs_environ()scrapy.utils.test.get_ftp_content_and_delete()scrapy.utils.test.get_gcs_content_and_delete()scrapy.utils.test.mock_google_cloud_storage()scrapy.utils.test.skip_if_no_boto()
如果您需要在测试或代码中使用它们,可以从 Scrapy 复制相关代码。(issue 6696)
scrapy.utils.test.TestSpider已弃用。如果您需要一个空爬虫类,可以使用scrapy.utils.spider.DefaultSpider或创建自己的scrapy.Spider子类。(issue 6678)scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware已弃用。它默认被禁用,且对大多数现有网站没有用处。(issue 6523, issue 6651, issue 6656)scrapy.utils.url.escape_ajax()已弃用。(issue 6523, issue 6651)scrapy.spiders.init.InitSpider已弃用。如果您觉得它有用,可以从 Scrapy 复制其代码。(issue 6708, issue 6714)scrapy.utils.versions.scrapy_components_versions()已弃用,请改用scrapy.utils.versions.get_versions()。(issue 6582)BaseDupeFilter.log()已弃用。它没有任何作用,不应被调用。(issue 4151)向
Scraper的以下方法传递spider参数已被弃用:close_spider()enqueue_scrape()handle_spider_error()handle_spider_output()
新功能
您现在可以从
start()爬虫方法和process_start()爬虫中间件方法中 yield 爬虫的初始请求和 item,这两个方法均为 异步生成器。这使得使用异步代码生成这些初始请求和 item 成为可能(例如使用异步客户端从队列服务或数据库读取它们),而无需采用变通方案。(issue 456, issue 3477, issue 4467, issue 5627, issue 6729)
初始请求现在会尽快被 调度。
因此,一旦达到
CONCURRENT_REQUESTS,它们的priority就会被考虑在内。(issue 456, issue 3477, issue 4467, issue 5627, issue 6729)Crawler.signals新增了一个wait_for()方法。(issue 6729)添加了新的
scheduler_empty信号。(issue 6729)添加了新设置:
SCHEDULER_START_DISK_QUEUE和SCHEDULER_START_MEMORY_QUEUE。(issue 6729)添加了
StartSpiderMiddleware,它在 初始请求 上将is_start_request设置为True。(issue 6729)公开了
Crawler.engine的一个新方法:needs_backout()。(issue 6729)添加了
allow_offsite请求 meta 键,可用于替代更通用的dont_filter请求属性,以跳过OffsiteMiddleware对请求的处理(但不影响其他检查dont_filter的代码)。(issue 3690, issue 6151, issue 6366)为爬虫中间件添加了一个可选基类
BaseSpiderMiddleware,这有助于编写无需样板代码和代码重复的 通用爬虫中间件。内置的爬虫中间件现在继承自此类。(issue 6693, issue 6777)Scrapy 插件 现在可以定义一个名为
update_pre_crawler_settings()的类方法,以更新 预爬虫设置。(issue 6544, issue 6568)添加了用于修改 组件优先级字典 设置的 助手工具。(issue 6614)
使用未知/不支持编码的响应现在会产生警告。如果 Scrapy 知道安装额外的包(如 brotli)将允许解码该响应,警告中会提及这一点。(issue 4697, issue 6618)
添加了
spider_exceptions/count统计项,用于跟踪异常总数(同时也通过按类型的spider_exceptions/*统计项进行跟踪)。(issue 6739, issue 6740)添加了
DEFAULT_DROPITEM_LOG_LEVEL设置和scrapy.exceptions.DropItem.log_level属性,允许自定义删除 item 时记录的消息日志级别。(issue 6603, issue 6608)为
scrapy.Request.from_curl()添加了对-b, --cookiecurl 参数的支持。(issue 6684)添加了
LOG_VERSIONS设置,允许自定义爬虫启动时记录版本的软件列表。(issue 6582)添加了
WARN_ON_GENERATOR_RETURN_VALUE设置,允许禁用用于警告基于生成器的回调中不正确return语句的回调代码运行时分析。如果此分析在您的回调代码上出错,您可能需要禁用此设置。(issue 6731, issue 6738)
改进
移除或推迟了某些
itemadapter.is_item()调用以提高性能。(issue 6719)改进了在项目目录外运行需要项目的
scrapy命令(如scrapy crawl)时的错误消息。(issue 2349, issue 3426)在新建项目的
settings.py模板中添加了空的ADDONS设置。(issue 6587)
错误修复
从
Spider.start或SpiderMiddleware.process_startyield 一个 item 不再会导致下一次启动请求和 item 的迭代延迟长达 5 秒。(issue 6729)修复了
items_per_minute和responses_per_minute统计项的计算。(issue 6599)修复了初始化
scrapy.extensions.feedexport.GCSFeedStorage时的错误。(issue 6617, issue 6628)修复了运行
scrapy bench时的错误。(issue 6632, issue 6633)修复了关于 reactor 和事件循环的重复日志消息。(issue 6636, issue 6657)
修复了在运行时解析
SitemapSpider._parse_sitemap()类型注解的问题,这是 scrapy-poet 等工具所需要的。(issue 6665, issue 6671)现在,在未安装 reactor 的情况下调用
scrapy.utils.reactor.is_asyncio_reactor_installed()会引发异常,而不是安装 reactor。(issue 6732, issue 6735)恢复了对
x-gzip内容编码的支持。(issue 6618)
文档
记录了默认项目模板中设置的配置值。(issue 6762, issue 6775)
改进了关于爬虫中间件中异步可迭代对象支持的 文档。(issue 6688)
改进了关于在基于协程的代码中使用基于
DeferredAPI 的 文档,并列出了此类 API。(issue 6677, issue 6734, issue 6776)改进了 贡献文档。(issue 6561, issue 6575)
从 无头浏览器 建议中移除了对
Splash的推荐。我们不再推荐使用Splash,而是推荐使用其他无头浏览器方案。(issue 6642, issue 6701)在 HTML 文档中添加了暗黑模式。(issue 6653)
其他文档改进和修复。(issue 4151, issue 6526, issue 6620, issue 6621, issue 6622, issue 6623, issue 6624, issue 6721, issue 6723, issue 6780)
打包
从
setup.py切换到pyproject.toml。(issue 6514, issue 6547)将构建后端从 setuptools 切换到了 hatchling。(issue 6771)
质量保证
将大多数 linter 替换为 ruff。(issue 6565, issue 6576, issue 6577, issue 6581, issue 6584, issue 6595, issue 6601, issue 6631)
提高了测试覆盖率收集的准确性和性能。(issue 6255, issue 6610)
修复了一个导致无法在顶层源目录以外的目录运行测试的错误。(issue 6567)
减少了测试中
mockserver的调用次数,以缩短整体测试运行时间。(issue 6637, issue 6648)修复了多次运行相同测试代码的测试用例。(issue 6646, issue 6647, issue 6650)
在可能的情况下,重构测试以使用更多
pytest特性而非unittest特性。(issue 6678, issue 6680, issue 6695, issue 6699, issue 6700, issue 6702, issue 6709, issue 6710, issue 6711, issue 6712, issue 6725)类型提示改进和修复。(issue 6578, issue 6579, issue 6593, issue 6605, issue 6694)
CI 和测试改进及修复。(issue 5360, issue 6271, issue 6547, issue 6560, issue 6602, issue 6607, issue 6609, issue 6613, issue 6619, issue 6626, issue 6679, issue 6703, issue 6704, issue 6716, issue 6720, issue 6722, issue 6724, issue 6741, issue 6743, issue 6766, issue 6770, issue 6772, issue 6773)
代码清理。(issue 6600, issue 6606, issue 6635, issue 6764)
Scrapy 2.12.0 (2024-11-18)
亮点
停止对 Python 3.8 的支持,增加对 Python 3.13 的支持
scrapy.Spider.start_requests()现在可以 yield item添加了
JsonResponse
修改后的需求
停止对 Python 3.8 的支持。(issue 6466, issue 6472)
增加对 Python 3.13 的支持。(issue 6166)
提高了以下依赖项的最低版本要求
Twisted: 18.9.0 → 21.7.0
cryptography: 36.0.0 → 37.0.0
pyOpenSSL: 21.0.0 → 22.0.0
lxml: 4.4.1 → 4.6.0
从依赖项列表中移除了
setuptools。(issue 6487)
向后不兼容的变更
对于 HTTPS 请求,用户定义的 cookie 将默认把
secure标志设为True,除非显式设为False。这在 cookie 被重用于 HTTP 请求(例如重定向到 HTTP URL 后)时非常重要。(issue 6357)由于不支持 Python 3.9+,基于 Reppy 的
robots.txt解析器scrapy.robotstxt.ReppyRobotParser已被移除。(issue 5230, issue 6099, issue 6499)scrapy.pipelines.media.MediaPipeline及其子类的初始化 API 得到了改进,某些以前可以工作的用法场景可能不再有效。这仅在您定义了MediaPipeline的自定义子类,或者通过from_settings()或__init__()而非from_crawler()调用创建这些管道实例时才会受到影响。以前,
MediaPipeline.from_crawler()会调用from_settings()方法(如果存在),否则调用__init__()方法,然后使用crawler实例进行一些额外初始化。如果from_settings()方法存在(如在FilesPipeline中),它会调用__init__()来创建实例。如果不从重写的from_crawler()中调用MediaPipeline.from_crawler()就无法重写该方法,而后者在某些情况下(包括FilesPipeline的子类)又无法被调用。现在,为了符合
from_crawler()和from_settings()的通用用法以及后者被弃用的情况,推荐的初始化顺序如下:所有的
__init__()方法都应接受一个crawler参数。如果它们也接受settings参数,则应忽略它,改用crawler.settings。当它们调用基类的__init__()时,也应将crawler参数传递给基类。不应定义
from_settings()方法。类特定的初始化代码应放入重写的from_crawler()方法或__init__()中。现在可以重写
from_crawler(),如果遵循了其他建议,则无需在其中调用MediaPipeline.from_crawler()。如果以前是通过
from_settings()或__init__()调用创建管道实例的(这即使在以前也是不支持的,因为会丢失重要的初始化代码),现在应通过from_crawler()调用来创建。
ImagesPipeline.convert_image的response_body参数现在是仅限位置参数,因为它已从可选变为必选。(issue 6500)scrapy.utils.conf.build_component_list()的convert参数现在是仅限位置参数,因为其前面的参数 (custom) 已被移除。(issue 6500)scrapy.utils.conf.feed_process_params_from_cli()的overwrite_output参数现在是仅限位置参数,因为其前面的参数 (output_format) 已被移除。(issue 6500)
弃用移除
移除了
scrapy.utils.request.request_fingerprint()函数,该函数在 Scrapy 2.7.0 中被弃用。(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.utils.response.response_httprepr()函数,该函数在 Scrapy 2.6.0 中被弃用。(issue 6111, issue 6116)具有爬虫级 HTTP 身份验证(即具有
http_user或http_pass属性)的爬虫现在还必须定义http_auth_domain,该属性在 Scrapy 2.5.1 中引入。(issue 6103, issue 6113)媒体管道 的
file_path()、file_downloaded()、get_images()、image_downloaded()、media_downloaded()、media_to_download()和thumb_path()方法现在必须支持在 Scrapy 2.4.0 中添加的item参数。(issue 6107, issue 6113)Feed 存储后端类 的
__init__()和from_crawler()方法现在必须支持在 Scrapy 2.4.0 中引入的仅限关键字参数feed_options。(issue 6105, issue 6113)移除了
scrapy.loader.common和scrapy.loader.processors模块,这些模块在 Scrapy 2.3.0 中被弃用。(issue 6106, issue 6113)移除了
scrapy.utils.misc.extract_regex()函数,该函数在 Scrapy 2.3.0 中被弃用。(issue 6106, issue 6113)移除了
scrapy.http.JSONRequest类,该类在 Scrapy 1.8.0 中已被JsonRequest取代。(issue 6110, issue 6113)scrapy.utils.log.logformatter_adapter不再支持缺失的args、level或msg参数,也不再支持format参数,所有这些用法均在 Scrapy 1.0.0 中被弃用。(issue 6109, issue 6116)分配给
SPIDER_LOADER_CLASS设置的自定义类如果未实现ISpiderLoader接口,现在将在运行时引发zope.interface.verify.DoesNotImplement异常。自 Scrapy 1.0.0 以来,不符合要求的类一直会触发弃用警告。(issue 6101, issue 6113)移除了在 Scrapy 2.1.0 中弃用的
--output-format/-t命令行选项。应改用-O <URI>:<FORMAT>。(issue 6500)在同一个
Crawler实例上运行多次crawl()(在 Scrapy 2.11.0 中弃用)现在会引发异常。(issue 6500)不再允许在
__init__()中不支持crawler参数且没有自定义from_crawler()方法的情况下子类化HttpCompressionMiddleware(此用法在 Scrapy 2.5.0 中弃用)。(issue 6500)移除了
RetryMiddleware的EXCEPTIONS_TO_RETRY属性,该属性在 Scrapy 2.10.0 中被弃用。(issue 6500)移除了对未安装 boto3 包的 S3 Feed 导出 的支持,该支持在 Scrapy 2.10.0 中被弃用。(issue 6500)
移除了
scrapy.extensions.feedexport._FeedSlot类,该类在 Scrapy 2.10.0 中被弃用。(issue 6500)移除了
scrapy.pipelines.images.NoimagesDrop异常,该异常在 Scrapy 2.8.0 中被弃用。(issue 6500)ImagesPipeline.convert_image的response_body参数现在是必选的,不传递该参数在 Scrapy 2.8.0 中已被弃用。(issue 6500)移除了
scrapy.utils.conf.build_component_list()的custom参数,该参数在 Scrapy 2.10.0 中被弃用。(issue 6500)移除了
scrapy.utils.reactor.get_asyncio_event_loop_policy()函数,该函数在 Scrapy 2.9.0 中被弃用。请改用asyncio.get_event_loop()及相关的标准库函数。(issue 6500)
弃用
拥有
from_settings()方法的 Scrapy 组件 现已弃用该方法。应改用from_crawler()。受影响的组件包括:scrapy.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__()方法。弃用在调用
__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)
新功能
scrapy.Spider.start_requests()现在可以 yield item。(issue 5289, issue 6417)注意
某些爬虫中间件可能需要针对 Scrapy 2.12 支持进行更新,然后您才能将它们与从
start_requests()yield item 的功能结合使用。为具有 JSON MIME 类型 的响应添加了一个新的
Response子类JsonResponse。(issue 6069, issue 6171, issue 6174)LogStats扩展现在在爬虫关闭时会将items_per_minute和responses_per_minute添加到 统计项 中。(issue 4110, issue 4111)添加了
CLOSESPIDER_PAGECOUNT_NO_ITEM,允许在设定时间内未抓取到 item 时关闭爬虫。(issue 6434)用户定义的 cookie 现在可以包含
secure字段。(issue 6357)为
Crawler添加了组件获取方法:get_addon()、get_downloader_middleware()、get_extension()、get_item_pipeline()、get_spider_middleware()。(issue 6181)现在可以通过
autothrottle_dont_adjust_delay元键,针对特定请求禁用由 AutoThrottle 扩展 基于响应延迟进行的槽延迟(Slot delay)更新。( issue 6246, issue 6527)如果
SPIDER_LOADER_WARN_ONLY设置为True,SpiderLoader将不再抛出SyntaxError,而是发出警告。(issue 6483, issue 6484)增加了对多重压缩响应的支持(即在
Content-Encoding响应头中包含多个编码的响应)。(issue 5143, issue 5964, issue 6063)增加了在
REFERRER_POLICY中支持多个标准值的功能。(issue 6381)增加了对 brotlicffi(原名 brotlipy)的支持。仍推荐使用 brotli,但只有 brotlicffi 能在 PyPy 上运行。(issue 6263, issue 6269)
增加了用于设置请求元数据的
MetadataContract。(issue 6468, issue 6469)
改进
扩展了
LinkExtractor默认忽略的文件扩展名列表。(issue 6074, issue 6125)scrapy.utils.httpobj.urlparse_cached()现在被应用到更多地方以替代urllib.parse.urlparse()。(issue 6228, issue 6229)
Bug 修复
MediaPipeline现在是一个抽象类,其原本期望在子类中被重写的方法现在已声明为抽象方法。(issue 6365, issue 6368)修复了 contract 提取过程中对无效的
@前缀行的处理。(issue 6383, issue 6388)导入
scrapy.extensions.telnet不再会安装默认的 reactor。(issue 6432)降低了在 2.11.2 版本中增加的被丢弃请求的日志详细程度。(issue 6433, issue 6475)
文档
添加了
SECURITY.md文件,用于说明安全策略。(issue 5364, issue 6051)从脚本运行 Scrapy 的示例代码不再在顶层导入
twisted.internet.reactor,因为这在不加修改直接使用代码时,会导致非默认 reactor 出现问题。(issue 6361, issue 6374)编写了
SpiderState扩展的相关文档。(issue 6278, issue 6522)其他文档改进与修复。(issue 5920 等多个 issue)
质量保证 (QA)
根据 PEP 561,添加了
py.typed文件。(issue 6058, issue 6059)实现了代码的类型提示全覆盖(除了最复杂的部分,主要是与
twisted.web.http相关及其他缺乏类型提示的 Twisted 组件)。(issue 5989 等多个 issue)改进了 Bandit 安全检查。(issue 6260, issue 6264, issue 6265)
在
pre-commit配置中添加了 pyupgrade。(issue 6392)在
pre-commit配置中添加了flake8-bugbear、flake8-comprehensions、flake8-debugger、flake8-docstrings、flake8-string-format和flake8-type-checking。(issue 6406, issue 6413)CI 及测试的改进与修复。(issue 5285 等多个 issue)
代码清理。(issue 6196 等多个 issue)
其他
问题追踪器 (Issue tracker) 改进。(issue 6066)
Scrapy 2.11.2 (2024-05-14)
安全缺陷修复
不再跟随指向非 HTTP 协议的重定向。更多信息请参阅 23j4-mw76-5v7h 安全公告。(issue 457)
现在,在重定向到不同的方案(
http://或https://)或端口时,即使域名相同,也将丢弃Authorization请求头。更多信息请参阅 4qqq-9vqf-3h3f 安全公告。当使用的系统代理设置对
http://和https://不同时,重定向到不同的 URL 方案现在也会触发重定向请求中代理设置的相应更改。更多信息请参阅 jm3v-qxmh-hxwv 安全公告。(issue 767)现在对所有请求强制执行
Spider.allowed_domains,而不只是来自爬虫回调的请求。(issue 1042, issue 2241, issue 6358)xmliter_lxml()不再解析 XML 实体。(issue 6265)现在使用 defusedxml 使
scrapy.http.request.rpc.XmlRpcRequest更加安全。(issue 6250, issue 6251)
弃用项
scrapy.spidermiddlewares.offsite.OffsiteMiddleware(一种爬虫中间件)现已弃用,且不再默认启用。改为启用具有相同功能的新下载器中间件scrapy.downloadermiddlewares.offsite.OffsiteMiddleware。(issue 2241, issue 6358)
Bug 修复
恢复了对 brotlipy 的支持,该支持曾在 Scrapy 2.11.1 中为支持 brotli 而被移除。(issue 6261)
注意
brotlipy 在 Scrapy 和上游均已被弃用。如果可以,请改用 brotli。
将
METAREFRESH_IGNORE_TAGS默认值设为["noscript"]。这可以防止MetaRefreshMiddleware跟随那些在启用 JavaScript 的浏览器中不会被跟随的重定向。(issue 6342, issue 6347)在 Feed 导出 期间,不要从 内置后处理插件 中关闭底层文件。(issue 5932, issue 6178, issue 6239)
LinkExtractor现在可以正确应用unique和canonicalize参数。(issue 3273, issue 6221)如果
JOBDIR是空字符串,则不初始化调度器磁盘队列。(issue 6121, issue 6124)修复了
Spider.logger不记录自定义额外信息的问题。(issue 6323, issue 6324)非 UTF-8 编码的
robots.txt文件不再阻碍解析文档中符合 UTF-8 标准(例如 ASCII)的部分。(issue 6292, issue 6298)scrapy.http.cookies.WrappedRequest.get_header()在default为None时不再抛出异常。(issue 6308, issue 6310)Selector现在使用scrapy.utils.response.get_base_url()来确定给定Response的基础 URL。(issue 6265)媒体管道 的
media_to_download()方法现在会在剥离异常之前记录它们。(issue 5067, issue 5068)向
parse命令传递回调时,使用正确的签名构建回调可调用对象。(issue 6182)
文档
添加了一个关于 创建空白请求 的常见问题解答条目。(issue 6203, issue 6208)
记录了
scrapy.Selector.type可以是"json"的说明。(issue 6328, issue 6334)
质量保证 (QA)
实现构建的可复现性。(issue 5019, issue 6322)
打包和测试修复。(issue 6286 等多个 issue)
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)
Bug 修复
重构了操作系统信号处理代码,不再使用 Twisted 的私有函数。(issue 6024, issue 6064, issue 6112)
文档
改进了关于 2.11.0 版本中
Crawler初始化更改的文档。(issue 6057, issue 6147)扩展了
Request.meta的文档。(issue 5565)修复了
dont_merge_cookies的相关文档。(issue 5936, issue 6077)在 Feed 导出 文档中添加了指向 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)
质量保证 (QA)
在 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.crawler.Crawler.__init__()中初始化的各个组件之前,以及在设置最终确定和冻结之前被调用。这一更改是为了允许在scrapy.Spider.from_crawler()中更改设置。如果你想在爬虫代码中尽早访问最终设置值和初始化的Crawler属性,可以在scrapy.Spider.start_requests()或engine_started信号的处理程序中进行。(issue 6038)TextResponse.json方法现在要求响应采用有效的 JSON 编码(UTF-8、UTF-16 或 UTF-32)。如果你需要处理编码无效的 JSON 文档,请改用json.loads(response.text)。(issue 6016)PythonItemExporter过去默认使用二进制输出,但现在不再如此。(issue 6006, issue 6007)
移除弃用项
移除了
PythonItemExporter的二进制导出模式,该模式在 Scrapy 1.1.0 中已被弃用。(issue 6006, issue 6007)注意
如果你在 Scrapy Cloud 上使用此 Scrapy 版本,且堆栈包含较旧的 Scrapy 版本,并收到“TypeError: Unexpected options: binary”错误,你可能需要在项目需求中添加
scrapinghub-entrypoint-scrapy >= 0.14.1,或者切换到包含 Scrapy 2.11 的堆栈。移除了在 Scrapy 1.0.0 中弃用的
CrawlerRunner.spiders属性,请改用CrawlerRunner.spider_loader。(issue 6010)在 Scrapy 2.6.0 中弃用的
scrapy.utils.response.response_httprepr()函数现已被移除。(issue 6111)
弃用项
现在已弃用在同一个
scrapy.crawler.Crawler实例上运行多次crawl()。(issue 1587, issue 6040)
新特性
爬虫现在可以在其
from_crawler()方法中修改设置,例如根据 爬虫参数 进行修改。(issue 1305 等多个 issue)添加了
PeriodicLog扩展,启用后可以定期记录统计数据和/或它们的差异。(issue 5926)通过移除不必要的正文解码,优化了
TextResponse.json的内存使用。(issue 5968, issue 6016)指向
.webp文件的链接现在会被 链接提取器 忽略。(issue 6021)
Bug 修复
修复了启用的插件记录日志的问题。(issue 6036)
修复了当
charset参数传递给send()时,MailSender产生无效消息正文的问题。(issue 5096, issue 5118)修复了从
RetryMiddleware的子类访问self.EXCEPTIONS_TO_RETRY时的异常。(issue 6049, issue 6050)用于解析
FEED_EXPORT_FIELDS的scrapy.settings.BaseSettings.getdictorlist()现在可以处理元组值。(issue 6011, issue 6013)不再推荐使用的
datetime.utcnow()调用已被替换为带时区的datetime.now()调用。(issue 6014)
文档
更新了管道示例中一个已弃用的函数调用。(issue 6008, issue 6009)
质量保证 (QA)
扩展了类型提示。(issue 6003 等多个 issue)
将 PyPy 测试的 brotli 固定为 1.0.9,因为 1.1.0 会导致测试失败。(issue 6044, issue 6045)
其他 CI 和 pre-commit 改进。(issue 6002 等多个 issue)
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 的支持。
新的加载组件(add-ons)框架简化了对支持该框架的第三方组件的配置。
现在可以配置需要重试的异常。
对 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)导出到 S3 时,现在推荐使用 boto3 而不是 botocore。(issue 5833)。
向后不兼容的更改
FEED_STORE_EMPTY设置的值现在默认为True而不是False。在早期的 Scrapy 版本中,即使此设置位False也会创建空文件(这是一个已修复的 bug),因此新的默认值应该能保持旧的行为。(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 2.6 中弃用的
scrapy.squeues中的PickleFifoDiskQueueNonRequest、PickleLifoDiskQueueNonRequest、MarshalFifoDiskQueueNonRequest和MarshalLifoDiskQueueNonRequest类。(issue 5994, issue 5996)移除了
scrapy.core.engine.ExecutionEngine的属性open_spiders以及方法has_capacity和schedule(这些在 Scrapy 2.6 中已弃用)。(issue 5994, issue 5998)不再支持向
scrapy.core.engine.ExecutionEngine的spider_is_idle()、crawl()和download()方法传递spider参数(此行为在 Scrapy 2.6 中已弃用)。(issue 5994, issue 5998)
弃用项
scrapy.utils.datatypes.CaselessDict已弃用,请改用scrapy.utils.datatypes.CaseInsensitiveDict。(issue 5146)向
scrapy.utils.conf.build_component_list()传递custom参数已被弃用。该参数过去用于合并FOO和FOO_BASE设置值,但现在 Scrapy 使用scrapy.settings.BaseSettings.getwithbase()来实现相同功能。使用此参数且无法切换到getwithbase()的代码可以改为显式合并值。(issue 5726, issue 5923)
新特性
添加了对 Scrapy 加载组件(add-ons) 的支持。(issue 5950)
添加了
RETRY_EXCEPTIONS设置,用于配置由RetryMiddleware重试的异常。(issue 2701, issue 5929)添加了在指定时间内未产生 Item 时关闭爬虫的可能性,由
CLOSESPIDER_TIMEOUT_NO_ITEM配置。(issue 5979)在 Feed 导出中添加了对
AWS_REGION_NAME设置的支持。(issue 5980)在
FEEDS设置中支持使用指向绝对 Windows 路径的pathlib.Path对象。(issue 5939)
Bug 修复
修复了即使
FEED_STORE_EMPTY=False也会创建空 Feed 的问题。(issue 872, issue 5847)修复了在指定输出文件时使用绝对 Windows 路径的问题。(issue 5969, issue 5971)
修复了 JSON 导出器在发生某些异常时会写入额外逗号的问题。(issue 3090, issue 5952)
修复了 CSV 导出器中“读取已关闭文件”的错误。(issue 5043, issue 5705)
修复了由类对象添加的组件抛出带消息的
NotConfigured时的错误。(issue 5950, issue 5992)添加了缺失的
scrapy.settings.BaseSettings.pop()方法。(issue 5959 等多个 issue)添加了
CaseInsensitiveDict作为CaselessDict的替代品,修复了一些 API 不一致的问题。(issue 5146)
文档
编写了
scrapy.Spider.update_settings()的文档。(issue 5745, issue 5846)记录了早期 Twisted reactor 安装可能出现的问题及其解决方案。(issue 5981, issue 6000)
添加了在回调中发出额外请求的示例。(issue 5927)
改进了 Feed 导出文档。(issue 5579, issue 5931)
澄清了关于重定向时请求对象的文档。(issue 5707, issue 5937)
质量保证 (QA)
添加了针对已安装 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 环境。(issue 5948)实施了清理工作。(issue 5965, issue 5986)
Scrapy 2.9.0 (2023-05-08)
亮点
基于域名的下载设置。
兼容新版的 cryptography 和新版的 parsel。
支持新版 parsel 提供的 JMESPath 选择器。
Bug 修复。
弃用项
scrapy.extensions.feedexport._FeedSlot重命名为scrapy.extensions.feedexport.FeedSlot,旧名称已弃用。(issue 5876)
新特性
现在可以通过新的
DOWNLOAD_SLOTS设置,按域名分别配置DOWNLOAD_DELAY、CONCURRENT_REQUESTS_PER_DOMAIN和RANDOMIZE_DOWNLOAD_DELAY。(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)
Bug 修复
修复了使用 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命令现在也适用于异步生成器(async generator)回调。(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头中非 UTF-8 值时的错误。(issue 5914, issue 5917)修复了
scrapy.mail.MailSender.send()中破坏用户对发送失败处理的错误。(issue 1611, issue 5880)
文档
扩充了贡献文档。(issue 5109, issue 5851)
在 pre-commit 中添加了 blacken-docs 并用其重新格式化了文档。(issue 5813, issue 5816)
修复了一个 JS 问题。(issue 5875, issue 5877)
修复了
make htmlview。(issue 5878, issue 5879)修复了拼写错误及其他细微错误。(issue 5827 等多个 issue)
质量保证 (QA)
Scrapy 2.8.0 (2023-02-02)
这是一个维护版本,包含细微功能、错误修复和清理。
弃用功能移除
scrapy.utils.gz.read1函数(在 Scrapy 2.0 中弃用)现已被移除。请改用GzipFile的read1()方法。( 问题 5719)scrapy.utils.python.to_native_str函数(在 Scrapy 2.0 中弃用)现已被移除。请改用scrapy.utils.python.to_unicode()。( 问题 5719)scrapy.utils.python.MutableChain.next方法(在 Scrapy 2.0 中弃用)现已被移除。请改用__next__()。( 问题 5719)scrapy.linkextractors.FilteringLinkExtractor类(在 Scrapy 2.0 中弃用)现已被移除。请改用LinkExtractor。( 问题 5720)支持使用以
SCRAPY_为前缀的环境变量来覆盖设置(在 Scrapy 2.0 中弃用)现已被移除。( 问题 5724)对代理 URL 中
noconnect查询字符串参数的支持(在 Scrapy 2.0 中弃用)现已被移除。我们预计以前需要该参数的代理在没有它的情况下也能正常工作。( 问题 5731)scrapy.utils.python.retry_on_eintr函数(在 Scrapy 2.3 中弃用)现已被移除。( 问题 5719)scrapy.utils.python.WeakKeyCache类(在 Scrapy 2.4 中弃用)现已被移除。( 问题 5719)scrapy.utils.boto.is_botocore()函数(在 Scrapy 2.4 中弃用)现已被移除。( 问题 5719)
即将弃用
新功能
对使用
genspider和startproject命令生成的文件应用了 black 编码风格。( 问题 5809, 问题 5814)在
startproject命令生成的settings.py文件中,FEED_EXPORT_ENCODING现在被设置为"utf-8"。使用此值,JSON 导出将不会强制对非 ASCII 字符使用转义序列。( 问题 5797, 问题 5800)MemoryUsage扩展现在在检查期间记录峰值内存使用量,并使用二进制单位 MiB 以避免混淆。( 问题 5717, 问题 5722, 问题 5727)Request的callback参数现在可以设置为scrapy.http.request.NO_CALLBACK(),以将其与None区分开,因为后者表示使用默认的爬虫回调函数 (parse())。( 问题 5798)
错误修复
修复了基于 STARTTLS 的电子邮件传送在 Twisted 21.2.0 及更高版本中无法工作的问题。( 问题 5386, 问题 5406)
修复了对于空文件,项目导出器 (item exporters) 的
finish_exporting()方法不被调用的问题。( 问题 5537, 问题 5758)修复了 HTTP/2 响应在接收到多个同名标头时仅获取标头最后一个值的问题。( 问题 5777)
修复了在某些情况下 使用 asyncio 时由
shell命令引发的异常。( 问题 5740, 问题 5742, 问题 5748, 问题 5759, 问题 5760, 问题 5771)使用
CrawlSpider时,在Rule的process_request回调中添加到请求的回调关键字参数 (cb_kwargs) 将不再被忽略。( 问题 5699)图片管道 (images pipeline) 不再对 JPEG 文件进行重新编码。( 问题 3055, 问题 3689, 问题 4753)
修复了 图片管道 (images pipeline) 对透明 WebP 图片的处理问题。( 问题 3072, 问题 5766, 问题 5767)
scrapy.shell.inspect_response()不再抑制SIGINT(Ctrl+C)。( 问题 2918)设置
unique=False的LinkExtractor不再过滤掉具有相同 URL 且 相同文本的链接。( 问题 3798, 问题 3799, 问题 4695, 问题 5458)RobotsTxtMiddleware现在忽略不支持robots.txt的 URL 协议 (data://,file://)。( 问题 5807)修复了
scrapy -h输出中显示的意外的**commands**行。( 问题 5709, 问题 5711, 问题 5712)使 命令 (commands) 输出中的活动项目指示更加清晰。( 问题 5715)
文档
记录了如何 从 Visual Studio Code 调试爬虫。( 问题 5721)
记录了
DOWNLOAD_DELAY如何影响每个域名的并发量。( 问题 5083, 问题 5540)提高了文档的一致性。( 问题 5761)
质量保证
应用了 black 编码风格,整理了导入语句,并引入了 pre-commit。( 问题 4654, 问题 4658, 问题 5734, 问题 5737, 问题 5806, 问题 5810)
解决了 Pylint 报告的许多问题。( 问题 5677)
提高了代码的可读性。( 问题 5736)
改进了包元数据。( 问题 5768)
移除了不必要的
OrderedDict使用。( 问题 5795)移除了不必要的
__str__定义。( 问题 5150)修复了测试和 CI 问题。( 问题 5749, 问题 5750, 问题 5756, 问题 5762, 问题 5765, 问题 5780, 问题 5781, 问题 5782, 问题 5783, 问题 5785, 问题 5786)
Scrapy 2.7.1 (2022-11-02)
新功能
错误修复
文档
质量保证
Scrapy 2.7.0 (2022-10-17)
亮点
增加了对 Python 3.11 的支持,停止了对 Python 3.6 的支持
改进了对 异步回调 的支持
新项目默认启用 Asyncio 支持
项目字段的输出名称现在可以是任意字符串
现在可以进行集中式的 请求指纹 (request fingerprinting) 配置
修改后的需求
现在需要 Python 3.7 或更高版本;已停止支持 Python 3.6。增加了对即将发布的 Python 3.11 的支持。
一些依赖项的最低要求版本也发生了变化
lxml: 3.5.0 → 4.3.0
zope.interface: 5.0.0 → 5.1.0
(问题 5512, 问题 5514, 问题 5524, 问题 5563, 问题 5664, 问题 5670, 问题 5678)
即将弃用
ImagesPipeline.thumb_path现在必须接受item参数 (问题 5504, 问题 5508)。scrapy.downloadermiddlewares.decompression模块现已弃用 (问题 5546, 问题 5547)。
新功能
爬虫中间件 (spider middlewares) 的
process_spider_output()方法现在可以定义为 异步生成器 (问题 4978)。定义为 协程 (coroutines) 的
Request回调函数的输出现在异步处理 (问题 4978)。使用
startproject命令创建的新项目默认启用 asyncio 支持 (问题 5590, 问题 5679)。FEED_EXPORT_FIELDS设置现在可以定义为字典,以自定义项目字段的输出名称,解除了必须为有效 Python 标识符的限制(例如,以前不允许包含空格)(问题 1008, 问题 3266, 问题 3696)。现在您可以通过新的
REQUEST_FINGERPRINTER_CLASS设置自定义 请求指纹,而无需在每个依赖请求指纹的 Scrapy 组件中进行更改 (问题 900, 问题 3420, 问题 4113, 问题 4762, 问题 4524)。jsonl现在作为 JSON Lines 文件的扩展名受到支持并被鼓励使用 (问题 4848)。ImagesPipeline.thumb_path现在接收源 项目 (item) (问题 5504, 问题 5508)。
错误修复
在将 Google Cloud Storage 与 媒体管道 (media pipeline) 配合使用时,即使
FILES_STORE未指向 Google Cloud Storage 存储桶的根目录,FILES_EXPIRES现在也能正常工作 (问题 5317, 问题 5318)。当对没有可用爬虫的 URL 使用
parse命令时,不再引发异常 (问题 3264, 问题 3265, 问题 5375, 问题 5376, 问题 5497)。TextResponse在确定响应体的文本编码时,现在遵循 HTML 现行标准,给予 字节顺序标记 (BOM) 更高的优先级 (问题 5601, 问题 5611)。MIME 嗅探在 FTP 和 HTTP/1.0 请求以及缓存请求中也会考虑响应体 (问题 4873)。
MIME 嗅探现在即使缺少
html标签也能检测出有效的 HTML 5 文档 (问题 4873)。如果
ASYNCIO_EVENT_LOOP的值与实际安装的 asyncio 事件循环不匹配,现在会引发异常 (问题 5529)。修复了
LinkExtractor默认情况下不忽略tar.gz文件扩展名的问题 (问题 1837, 问题 2067, 问题 4066)
文档
澄清了
Spider.parse的返回类型 (问题 5602, 问题 5608)。为了使
HttpCompressionMiddleware能够进行 brotli 压缩,现在建议安装 brotli 而不是安装 brotlipy,因为前者提供了更新版本的 brotli。避免被封禁 现在推荐 Common Crawl 而不是 Google 缓存 (问题 3582, 问题 5432)。
新的 组件 (Components) 主题涵盖了对 Scrapy 组件实施强制性需求,如 下载器中间件、扩展、项目管道、爬虫中间件 等;还添加了 强制将 asyncio 作为需求 (问题 4978)。
设置 现在指出设置值必须是 可序列化的 (picklable) (问题 5607, 问题 5629)。
修复了拼写错误 (问题 5442, 问题 5455, 问题 5457, 问题 5461, 问题 5538, 问题 5553, 问题 5558, 问题 5624, 问题 5631)。
修复了其他问题 (问题 5283, 问题 5284, 问题 5559, 问题 5567, 问题 5648, 问题 5659, 问题 5665)。
质量保证
Scrapy 2.6.3 (2022-09-27)
增加了对 pyOpenSSL 22.1.0 的支持,移除了对 SSLv3 的支持 (问题 5634, 问题 5635, 问题 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
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重新支持爬取多个爬虫 (问题 5435, 问题 5436)在 Scrapy 之前安装 Twisted 反应器(例如,在模块级别某处导入
twisted.internet.reactor)不再阻止 Scrapy 启动,只要在TWISTED_REACTOR中未指定不同的反应器 (问题 5525, 问题 5528)
Scrapy 2.6.1 (2022-03-01)
修复了 2.6.0 中引入的一个回归问题,该问题会导致在跟随重定向时重置请求方法。
Scrapy 2.6.0 (2022-03-01)
亮点
支持 Python 3.10
asyncio 支持 不再被视为实验性的,并且在 Windows 上无论 Python 版本如何都能开箱即用
Feed 导出现在支持
pathlib.Path输出路径以及每路 feed 的 项目过滤 (item filtering) 和 后期处理 (post-processing)
安全漏洞修复
当定义了 cookie 的
Request对象收到重定向响应导致调度新的Request对象时,原始Request对象中定义的 cookie 不再被复制到新的Request对象中。如果您在
Request对象上手动设置了Cookie标头,且重定向 URL 的域名与原始Request对象 URL 的域名不完全匹配,则您的Cookie标头现在会从新的Request对象中被丢弃。旧的行为可能会被攻击者利用来获取您的 cookie。请参阅 cjvr-mfj7-j4j8 安全公告 了解更多信息。
注意
仍然可以通过在定义 cookie 时将共享域名后缀(例如
example.com)定义为 cookie 域名,来实现在具有相同共享域名后缀的不同域名(例如example.com和任何子域名)之间共享 cookie。有关更多信息,请参阅Request类的文档。当响应的
Set-Cookie标头中接收到或在Request对象中定义的 cookie 的域名被设置为 公共后缀 (public suffix) 时,除非 cookie 域名与请求域名相同,否则该 cookie 现已被忽略。旧的行为可能会被攻击者利用,将来自受控域名的 cookie 注入到您的 cookiejar 中,并发送到攻击者未控制的其他域名。请参阅 mfjm-vh54-3f96 安全公告 了解更多信息。
修改后的需求
h2 依赖项现在是可选的,仅在需要 启用 HTTP/2 支持 时才需要。(问题 5113)
不兼容向后的变更
FormRequest的formdata参数如果为非 POST 请求指定,现在会覆盖 URL 查询字符串,而不是追加到其后。(问题 2919, 问题 3579)当向
FEED_URI_PARAMS设置分配函数时,现在该函数的返回值(而不是params输入参数)将决定 feed URI 参数,除非该返回值为None。(问题 4962, 问题 4966)在
scrapy.core.engine.ExecutionEngine中,如果crawl(),download(),schedule(), 和spider_is_idle()方法在open_spider()之前被调用,现在会引发RuntimeError。(问题 5090)这些方法过去曾假定
ExecutionEngine.slot已通过之前的open_spider()调用定义,因此它们过去会引发AttributeError。如果配置的 调度器 (scheduler) 的 API 不符合预期,现在会在启动时引发
TypeError。以前是在运行时引发其他异常。(问题 3559)序列化
Request对象的_encoding字段现在被命名为encoding,与其他所有字段一致 (问题 5130)
弃用功能移除
即将弃用
当向
FEED_URI_PARAMS设置分配函数时,返回None或修改params输入参数的行为现已弃用。请返回一个新字典。(问题 4962, 问题 4966)scrapy.utils.reqser现已弃用。(问题 5130)请改用新的
Request.to_dict()方法代替request_to_dict()。请改用新的
scrapy.utils.request.request_from_dict()函数代替request_from_dict()。
在
scrapy.squeues中,以下队列类已弃用:PickleFifoDiskQueueNonRequest,PickleLifoDiskQueueNonRequest,MarshalFifoDiskQueueNonRequest, 和MarshalLifoDiskQueueNonRequest。您应该改用:PickleFifoDiskQueue,PickleLifoDiskQueue,MarshalFifoDiskQueue, 和MarshalLifoDiskQueue。(问题 5117)scrapy.core.engine.ExecutionEngine的许多方面(源于该类曾能同时处理多个Spider对象的时代)现已弃用。(问题 5090)has_capacity()方法现已弃用。schedule()方法现已弃用,请改用crawl()或download()。open_spiders属性现已弃用,请改用spider。以下方法的
spider参数现已弃用spider_is_idle()crawl()download()
相反,请先调用
open_spider()来设置Spider对象。
scrapy.utils.response.response_httprepr()现已弃用。(问题 4972)
新功能
现在您可以使用 项目过滤 (item filtering) 来控制哪些项目导出到每个输出 feed。(问题 4575, 问题 5178, 问题 5161, 问题 5203)
现在您可以对 feed 应用 后期处理 (post-processing),并提供用于输出文件压缩的 内置后期处理插件。(问题 2174, 问题 5168, 问题 5190)
FEEDS设置现在支持pathlib.Path对象作为键。(问题 5383, 问题 5384)在 Windows 和 Python 3.8 或更高版本上使用 asyncio 时,将自动将 asyncio 事件循环切换为允许 Scrapy 工作的循环。参见 Windows 特有注意事项。(问题 4976, 问题 5315)
scrapy.utils.defer新增了 2 个函数:deferred_to_future()和maybe_deferred_to_future(),以帮助 在使用 asyncio 反应器时 await Deferred 对象。(问题 5288)Amazon S3 feed 导出存储 增加了对 临时安全凭据 (
AWS_SESSION_TOKEN) 和端点自定义 (AWS_ENDPOINT_URL) 的支持。(问题 4998, 问题 5210)新增
LOG_FILE_APPEND设置以允许截断日志文件。(问题 5279)Request.cookies中类型为bool,float或int的值现在会被强制转换为str。(问题 5252, 问题 5253)您现在可以从
spider_idle信号的处理程序中引发CloseSpider,以自定义爬虫停止的原因。(问题 5191)当使用
HttpProxyMiddleware时,非 HTTPS 的 HTTP/1.1 请求的代理 URL 不再需要包含 URL 方案 (scheme)。(问题 4505, 问题 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 )删除了一个可能阻止 使用 asyncio reactor 的模块级 Twisted reactor 导入。( issue 5357 )
startproject命令再次支持在现有文件夹中运行。( issue 4665, issue 4676 )FEED_URI_PARAMS设置现在的行为正如文档所述。( issue 4962, issue 4966 )Request.cb_kwargs再次允许使用callback关键字。( issue 5237, issue 5251, issue 5264 )使
scrapy.utils.response.open_in_browser()支持更复杂的 HTML。( issue 5319, issue 5320 )修复了
CSVFeedSpider.quotechar被误解释为 CSV 文件编码的问题。( issue 5391, issue 5394 )在依赖列表中添加了缺失的 setuptools。( issue 5122 )
LinkExtractor现在也能按照预期处理具有逗号分隔的rel属性值(包括nofollow)的链接。( issue 5225 )修复了在解析 Feed 导出 参数期间可能引发的
TypeError。( issue 5359 )
文档
asyncio 支持 不再被视为实验性的。( issue 5332 )
包含针对 Windows 的 asyncio 使用帮助。( issue 4976, issue 5315 )
使用最新的最佳实践重写了 使用无头浏览器。( issue 4484, issue 4613 )
记录了 媒体管道中的本地文件命名。( issue 5069, issue 5152 )
常见问题解答 (FAQ) 现在涵盖了 Spider 文件名冲突问题。( 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 )
在同一进程中运行多个 Spider 现在增加了
scrapy.utils.project.get_project_settings()的用法。( issue 5070 )在同一进程中运行多个 Spider 现在涵盖了当你为某些在运行时不能不同的设置定义不同的每个 Spider 值时会发生什么。( issue 4485, issue 5352 )
扩展了
StatsMailer扩展的文档。( issue 5199, issue 5217 )在 设置 中增加了
JOBDIR。( issue 5173, issue 5224 )记录了
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 服务器 的链接。( issue 5421, issue 5422 )
项目名称的发音现在 正式 定为 /ˈskreɪpaɪ/。( issue 5280, issue 5281 )
在 README 中添加了 Scrapy 徽标。( issue 5255, issue 5258 )
修复了问题并进行了次要改进。( issue 3155, issue 4335, issue 5074, issue 5098, issue 5134, issue 5180, issue 5194, issue 5239, issue 5266, issue 5271, issue 5273, issue 5274, issue 5276, issue 5347, issue 5356, issue 5414, issue 5415, issue 5416, issue 5419, issue 5420 )
质量保证
增加了对 Python 3.10 的支持。( issue 5212, issue 5221, issue 5265 )
显著降低了
scrapy.utils.response.response_httprepr()的内存消耗,该函数由默认启用的DownloaderStats下载器中间件使用。( issue 4964, issue 4972 )移除了对已弃用的
optparse模块的使用。( issue 5366, issue 5374 )扩展了类型提示 (typing hints)。( 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_passSpider 属性)进行 HTTP 身份验证,则任何请求都会向请求目标暴露您的凭据。为了防止身份验证凭据无意中暴露给非预期的域名,您现在必须额外设置一个新的 Spider 属性
http_auth_domain,并将其指向必须发送身份验证凭据的具体域名。如果未设置
http_auth_domainSpider 属性,则第一个请求的域名将被视为 HTTP 身份验证目标,身份验证凭据将仅在针对该域名的请求中发送。如果您需要向多个域名发送相同的 HTTP 身份验证凭据,可以使用
w3lib.http.basic_auth_header()来设置请求的Authorization标头值。如果您确实希望您的 Spider 向任何域名发送相同的 HTTP 身份验证凭据,请将
http_auth_domainSpider 属性设置为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()函数,用于从 Spider 回调中重试请求新增
headers_received信号,允许提前停止下载新增
Response.protocol属性
弃用移除
移除了所有 在 1.7.0 中弃用 且 尚未在 2.4.0 中移除 的代码。( issue 4901 )
移除了对
SCRAPY_PICKLED_SETTINGS_TO_OVERRIDE环境变量的支持,该变量 在 1.8.0 中已弃用。( issue 4912 )
弃用
scrapy.utils.py36模块现已弃用,取而代之的是scrapy.utils.asyncgen。( issue 4900 )
新功能
通过新的下载处理器实现实验性的 HTTP/2 支持,该处理器可以在
DOWNLOAD_HANDLERS设置中分配给https协议。( issue 1854, issue 4769, issue 5058, issue 5059, issue 5066 )新的
scrapy.downloadermiddlewares.retry.get_retry_request()函数可用于 Spider 回调或中间件,以处理超出RetryMiddleware支持范围的请求重试场景。( issue 3590, issue 3685, issue 4902 )新的
headers_received信号提供对响应标头的早期访问,并允许 停止下载。( issue 1772, issue 4897 )新的
Response.protocol属性提供对用于下载响应的协议标识字符串的访问。( issue 4878 )统计信息 (Stats) 现在包括以下条目,指示存储 Feed 的成功和失败次数
feedexport/success_count/<storage type> feedexport/failed_count/<storage type>
其中
<storage type>是 Feed 存储后端类名,例如FileFeedStorage或FTPFeedStorage。( issue 3947, issue 4850 )
UrlLengthMiddlewareSpider 中间件现在以INFO日志级别 而不是DEBUG记录被忽略的 URL,并且现在在 统计信息 中包含以下条目以跟踪被忽略的 URL 数量urllength/request_ignored_count
( issue 5036 )
HttpCompressionMiddleware下载器中间件现在记录解压缩响应的数量和结果字节的总数httpcompression/response_bytes httpcompression/response_count
( issue 4797, issue 4799 )
错误修复
修复了在 PyPy 上安装时除了 PyPyDispatcher 还会安装 PyDispatcher 的问题,这可能会根据导入的包导致 Scrapy 无法运行。( issue 4710, issue 4814 )
当检查回调是否为同时也返回值的生成器时,如果回调的文档字符串缩进低于其后的代码,不再引发异常。( issue 4477, issue 4935 )
使用默认的 HTTP/1.1 下载处理器(见
DOWNLOAD_HANDLERS)时,响应中不再省略 Content-Length 标头。( issue 5009, issue 5034, issue 5045, issue 5057, issue 5062 )将
handle_httpstatus_all请求 meta 键设置为False现在与完全不设置具有相同的效果,而不是与设置为True具有相同的效果。( issue 3851, issue 4694 )
文档
增加了 在 Windows 中使用 pip 安装 Scrapy 的说明。( issue 4715, issue 4736 )
日志文档现在包含了 过滤日志的其他方法。( issue 4216, issue 4257, issue 4965 )
在 FAQ 中涵盖了如何处理允许域名列表过长的问题。( issue 2263, issue 3667 )
在 基准测试 (Benchmarking) 中涵盖了 scrapy-bench。( issue 4996, issue 5016 )
阐明了每个 crawler 都会创建一个 扩展 (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 )
添加了测试以确保 协程支持 得到测试。( issue 4987 )
从 Travis CI 迁移到 GitHub Actions。( issue 4924 )
修复了 CI 问题。( issue 4986, issue 5020, issue 5022, issue 5027, issue 5052, issue 5053 )
实施了代码重构、样式修复和清理。( issue 4911, issue 4982, issue 5001, issue 5002, issue 5076 )
Scrapy 2.4.1 (2020-11-17)
修复了 Feed 导出 的覆盖支持 ( issue 4845, issue 4857, issue 4859 )
修复了 AsyncIO 事件循环处理,这可能会导致代码挂起 ( issue 4855, issue 4872 )
修复了支持 IPv6 的 DNS 解析器
CachingHostnameResolver,适用于调用reactor.resolve的下载处理器 ( issue 4802, issue 4803 )修复了
genspider命令的输出显示占位符而不是生成的 Spider 模块导入路径的问题 ( issue 4874 )将 Windows CI 从 Azure Pipelines 迁移到 GitHub Actions ( issue 4869, issue 4876 )
Scrapy 2.4.0 (2020-10-11)
亮点
已停止对 Python 3.5 的支持。
媒体管道 的
file_path方法现在可以访问源 Item。这允许您根据 Item 数据设置下载文件路径。
您现在可以选择 Feed 导出 是覆盖还是追加到输出文件。
如果安装了 zstandard,现在支持 Zstd 压缩响应。
在需要类的导入路径的设置中,现在可以直接传递类对象。
修改后的需求
现在需要 Python 3.6 或更高版本;已停止对 Python 3.5 的支持
结果
使用 PyPy 时,现在需要 PyPy 7.2.0 或更高版本
对于 Feed 导出 或 媒体管道 中的 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中定义的 cookie。我们决定撤销在 Scrapy 2.2.0 中引入的这项错误修复,因为有报告称当前的实现可能会破坏现有代码。
如果您需要为请求设置 cookie,请使用
Request.cookies参数。Scrapy 的未来版本将包含对该撤回错误修复的新的、更好的实现。
( issue 4717, issue 4823 )
弃用移除
scrapy.extensions.feedexport.S3FeedStorage在未向其__init__方法传递参数时,不再从运行的项目设置中读取access_key和secret_key的值;您必须将这些参数传递给其__init__方法或使用S3FeedStorage.from_crawler( issue 4356, issue 4411, issue 4688 )Rule.process_request不再允许仅接受单个request参数的可调用对象,而应同时接受request和response( issue 4818 )
弃用
在自定义 媒体管道 中,如果在 现在支持此参数 的任何方法签名中不接受仅限关键字的
item参数,则该签名现已弃用 ( issue 4628, issue 4686 )在自定义 Feed 存储后端类 中,不接受仅限关键字的
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 的
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()
( issue 4628, issue 4686 )
FEEDS设置的新item_export_kwargs键允许定义要传递给 Item 导出器类 的关键字参数 ( issue 4606, issue 4768 )Feed 导出 获得了覆盖支持
您可以在
FEEDS设置中使用overwrite键来配置是覆盖输出文件 (True) 还是追加到其内容 (False)Feed 存储后端类 的
__init__和from_crawler方法现在接收一个新的仅限关键字参数feed_options,它是一个 Feed 选项 字典
( issue 547, issue 716, issue 4512 )
如果安装了 zstandard,现在支持 Zstd 压缩响应 ( issue 4831 )
在需要类的导入路径的设置中,现在可以改为传递类对象 ( issue 3870, issue 3873 )。
这也包括只有部分值由导入路径组成的设置,例如
DOWNLOADER_MIDDLEWARES或DOWNLOAD_HANDLERS。下载器中间件 现在可以覆盖
response.request。如果 下载器中间件 从
process_response()或process_exception()返回一个Response对象,且该对象在response.request中分配了自定义Request对象:该自定义
Request对象现在作为request参数发送到response_received信号,而不是原始的Request对象
( issue 4529, issue 4632 )
使用 FTP Feed 存储后端 时:
现在可以将新的
overwriteFeed 选项 设置为False,以追加到现有文件而不是覆盖它如果不必要,现在可以省略 FTP 密码
( issue 547, issue 716, issue 4512 )
CsvItemExporter的__init__方法现在支持errors参数,以指示如何处理编码错误 ( issue 4755 )使用 asyncio 时,现在可以 设置自定义 asyncio 循环 ( issue 4306, issue 4414 )
序列化请求(见 作业 (Jobs):暂停和恢复爬取)现在支持作为 Spider 方法的回调,且该方法委托给其他可调用对象 ( issue 4756 )
当响应大于
DOWNLOAD_MAXSIZE时,记录的消息现在是警告级别,而不是错误级别 ( issue 3874, issue 3886, issue 4752 )
错误修复
genspider命令不再覆盖现有文件,除非使用了--force选项 ( issue 4561, issue 4616, issue 4623 )具有空值的 Cookie 不再被视为无效 Cookie ( issue 4772 )
runspider命令现在支持.pyw文件扩展名的文件 ( issue 4643, issue 4646 )HttpProxyMiddleware中间件现在会直接忽略不支持的代理值 ( issue 3331, issue 4778 )对带有
return语句的生成器回调的检查,不再对嵌套函数中的return语句发出警告 ( issue 4720, issue 4721 )系统文件模式创建掩码 (umask) 不再影响使用
startproject命令生成的文件的权限 ( issue 4722 )scrapy.utils.iterators.xmliter()现在支持带命名空间的节点名称 ( issue 861, issue 4746 )Request对象现在可以使用about:URL,这在运行无头浏览器时很有用 ( issue 4835 )
文档
FEED_URI_PARAMS设置现已载入文档 ( issue 4671, issue 4724 )改进了 链接提取器 (Link Extractors) 的文档,增加了 Spider 回调中的使用示例以及
Link类的参考文档 ( issue 4751, issue 4775 )澄清了使用
CloseSpider扩展时CONCURRENT_REQUESTS的影响 ( issue 4836 )移除了对 Python 2 的
unicode类型的引用 ( issue 4547, issue 4703 )我们现在有了 正式的弃用政策 ( issue 4705 )
我们的 文档政策 现在涵盖了 Sphinx 的
versionadded和versionchanged指令的使用,并且我们删除了引用 Scrapy 1.4.0 及更早版本的用法 ( issue 3971, issue 4310 )其他文档清理 ( issue 4090, issue 4782, issue 4800, issue 4801, issue 4809, issue 4816, issue 4825 )
质量保证
扩展了类型提示 (typing hints) ( issue 4243, issue 4691 )
添加了对
check命令的测试 ( issue 4663 )修复了 Debian 上的测试失败问题 ( issue 4726, issue 4727, issue 4735 )
改进了 Windows 测试覆盖率 ( issue 4723 )
在可能的情况下切换到 格式化字符串字面量 (f-strings) ( 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 导出 现在支持 Google Cloud Storage 作为存储后端
新的
FEED_EXPORT_BATCH_ITEM_COUNT设置允许以不超过指定数量的分批次交付输出 Item。它还可以作为 延迟文件交付 的变通方法。在使用某些存储后端(S3、FTP 以及现在的 GCS)时,该问题会导致 Scrapy 仅在爬取结束后才开始 Item 交付。
Item 加载器 (Item Loaders) 的基础实现已移至独立库 itemloaders 中,允许在 Scrapy 之外使用并拥有独立的发布周期
弃用移除
从
scrapy.linkextractors中移除了以下类及其父模块:htmlparser.HtmlParserLinkExtractorregex.RegexLinkExtractorsgml.BaseSgmlLinkExtractorsgml.SgmlLinkExtractor
请改用
LinkExtractor( issue 4356, issue 4679 )
弃用
scrapy.utils.python.retry_on_eintr函数现已弃用 ( issue 4683 )
新功能
新的
FEED_EXPORT_BATCH_ITEM_COUNT设置用于分批交付 ( issue 4250, issue 4434 )parse命令现在允许指定输出文件 ( issue 4317, issue 4377 )Request.from_curl()和curl_to_request_kwargs()现在也支持--data-raw( issue 4612 )parse回调现在可以在内置 Spider 子类中使用,例如CrawlSpider( issue 712, issue 732, issue 781, issue 4254 )
错误修复
修复了 dataclass Item 和 attr.s Item 的 CSV 导出 问题 ( issue 4667, issue 4668 )
Request.from_curl()和curl_to_request_kwargs()现在在指定了请求体但未指定请求方法时,会将请求方法设置为POST( issue 4612 )在 Windows 10.0.14393 及更高版本中启用了 ANSI 转义序列处理,这是彩色输出所必需的 ( issue 4393, issue 4403 )
文档
更新了关于
DOWNLOADER_CLIENT_TLS_CIPHERS设置文档中的 OpenSSL 密码列表格式 链接 ( issue 4653 )简化了 使用 dataclass Item 中的代码示例 ( issue 4652 )
质量保证
项目加载器 (item loaders) 的基础实现已移至 itemloaders (issue 4005, issue 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)
自动化测试现在可以在持续集成系统支持的 Python 版本下,在最新的 PyPy 版本上通过 (issue 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 对象 现在是有效的 项目 (item) 类型
新增
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 库使编写 支持任何项目类型 的代码变得容易 (issue 2749, issue 2807, issue 3761, issue 3881, issue 4642)
新的
TextResponse.json方法允许对 JSON 响应进行反序列化 (issue 2444, issue 4460, issue 4574)新的
bytes_received信号允许监控响应下载进度并 停止下载 (issue 4205, issue 4559)媒体管道 (media pipeline) 结果列表中的字典现在包含一个新键
status,它指示文件是否已下载,或者如果文件未下载,其原因是什么;更多信息请参阅FilesPipeline.get_media_requests(issue 2893, issue 4486)当在 媒体管道 中使用 Google Cloud Storage 时,如果配置的凭据未授予所需的权限,现在会记录警告日志 (issue 4346, issue 4508)
链接提取器 (Link extractors) 现在是可序列化的,只要你不使用 lambdas 作为参数;例如,你现在可以在 持久化计划请求 时将链接提取器传递给
Request.cb_kwargs或Request.meta(issue 4554)将 Scrapy 使用的 pickle 协议 从协议 2 升级到协议 4,提高了序列化能力和性能 (issue 4135, issue 4541)
如果生成的实例为
None,scrapy.utils.misc.create_instance()现在会抛出TypeError异常 (issue 4528, issue 4532)
错误修复
CookiesMiddleware不再丢弃在Request.headers中定义的 cookie (issue 1992, issue 2400)CookiesMiddleware不再重新编码在Request的__init__方法的cookies参数中定义为bytes的 cookie (issue 2400, issue 3575)当
FEEDS定义了多个 URI、FEED_STORE_EMPTY为False且抓取未产生任何项目时,Scrapy 不再在第一个 URI 之后停止 Feed 导出 (issue 4621, issue 4626)使用 协程语法 定义的
Spider回调不再需要返回可迭代对象,而是可以返回Request对象、项目 或None(issue 4609)startproject命令现在确保生成的项目文件夹和文件具有正确的权限 (issue 4604)修复了
scrapy.utils.datatypes.LocalWeakReferencedCache有时会抛出KeyError异常的问题 (issue 4597, issue 4599)当
FEEDS定义了多个 URI 时,关于项目被存储的日志消息现在包含来自相应 Feed 的信息,而不是总是只包含关于其中一个 Feed 的信息 (issue 4619, issue 4629)
文档说明
添加了一个关于 从 errbacks 访问 cb_kwargs 的新章节 (issue 4598, issue 4634)
在 解析 JavaScript 代码 中涵盖了 chompjs (issue 4556, issue 4562)
从 协程 中移除了关于 API 为实验性的警告 (issue 4511, issue 4513)
移除了对不支持的 Twisted 版本的引用 (issue 4533)
更新了 屏幕截图管道示例 的描述,现在使用 协程语法 而不是返回
Deferred(issue 4514, issue 4593)从
scrapy.utils.log.configure_logging()代码示例中移除了一个误导性的导入行 (issue 4510, issue 4587)内部文档引用的悬停显示行为现在也涵盖了指向 命令、
Request.meta键、设置 和 信号 的链接 (issue 4495, issue 4563)现在再次可以下载文档以供离线阅读 (issue 4578, issue 4585)
移除了某些函数和方法签名中
*args和**kwargs前面的反斜杠 (issue 4592, issue 4596)
质量保证
进一步根据我们的 代码风格指南 调整了代码库 (issue 4237, issue 4525, issue 4538, issue 4539, issue 4540, issue 4542, issue 4543, issue 4544, issue 4545, issue 4557, issue 4558, issue 4566, issue 4568, issue 4572)
移除了 Python 2 支持的残留部分 (issue 4550, issue 4553, issue 4568)
改进了
crawl和runspider命令之间的代码共享 (issue 4548, issue 4552)将
chain(*iterable)替换为chain.from_iterable(iterable)(issue 4635)你现在可以在任何 Python 版本上通过 Tox 运行
asyncio测试 (issue 4521)更新了测试要求,以反映与 pytest 5.4 和 5.4.1 的不兼容性 (issue 4588)
针对涉及重复爬虫名称的情况,改进了
SpiderLoader的测试覆盖范围 (issue 4549, issue 4560)配置了 Travis CI 也会在 Python 3.5.2 下运行测试 (issue 4518, issue 4615)
在 Travis CI 中添加了 Pylint 任务 (issue 3727)
在 Travis CI 中添加了 Mypy 任务 (issue 4637)
在测试中使用了集合字面量 (issue 4573)
清理了 Travis CI 配置 (issue 4517, issue 4519, issue 4522, issue 4537)
Scrapy 2.1.0 (2020-04-24)
亮点
新增用于导出到多个 Feed 的
FEEDS设置新增
Response.ip_address属性
向后不兼容的更改
由 assert 语句触发的
AssertionError异常已替换为新的异常类型,以支持在优化模式下运行 Python (请参阅-O) 且不会以任何意外方式更改 Scrapy 的行为。如果你捕获了来自 Scrapy 的
AssertionError异常,请更新你的代码以捕获相应的新异常。
移除弃用项
不再支持
LOG_UNSERIALIZABLE_REQUESTS设置,请改用SCHEDULER_DEBUG(issue 4385)不再支持
REDIRECT_MAX_METAREFRESH_DELAY设置,请改用METAREFRESH_MAXDELAY(issue 4385)ChunkedTransferMiddleware中间件已移除,包括整个scrapy.downloadermiddlewares.chunked模块;分块传输现在开箱即用 (issue 4431)spiders属性已从Crawler中移除,请改用CrawlerRunner.spider_loader或使用你的设置实例化SPIDER_LOADER_CLASS(issue 4398)MultiValueDict、MultiValueDictKeyError和SiteNode类已从scrapy.utils.datatypes中移除 (issue 4400)
弃用
FEED_FORMAT和FEED_URI设置已弃用,以支持新的FEEDS设置 (issue 1336, issue 3858, issue 4507)
新功能
一个新的设置
FEEDS允许配置多个具有不同设置的输出 Feed (issue 1336, issue 3858, issue 4507)crawl和runspider命令现在支持多个-o参数 (issue 1336, issue 3858, issue 4507)crawl和runspider命令现在支持通过在输出文件后附加:<format>来指定输出格式 (issue 1336, issue 3858, issue 4507)新的
Response.ip_address属性允许访问产生响应的 IP 地址 (issue 3903, issue 3940)当
allowed_domains中的值包含端口时,现在会发出警告 (issue 50, issue 3198, issue 4413)Zsh 补全现在从补全列表中排除已使用的选项别名 (issue 4438)
错误修复
对于作为爬虫属性且被分配了不同名称函数的的回调,请求序列化 不再失败 (issue 4500)
allowed_domains中的None值不再导致TypeError异常 (issue 4410)Zsh 补全不再允许在参数后使用选项 (issue 4438)
现在支持 zope.interface 5.0.0 及更高版本 (issue 4447, issue 4448)
在 Scrapy 1.4.0 中弃用的
Spider.make_requests_from_url,现在使用时会发出警告 (issue 4412)
文档说明
改进了关于允许其处理程序返回
Deferred的信号的文档 (issue 4295, issue 4390)我们的 PyPI 条目现在包含了我们的文档、源代码库和问题追踪器的链接 (issue 4456)
在文档中涵盖了 curl2scrapy 服务 (issue 4206, issue 4455)
移除了对 Guppy 库的引用,该库仅在 Python 2 中工作 (issue 4285, issue 4343)
扩展了 InterSphinx 的使用,以链接到 Python 3 文档 (issue 4444, issue 4445)
增加了对 Sphinx 3.0 及更高版本的支持 (issue 4475, issue 4480, issue 4496, issue 4503)
质量保证
移除了关于使用旧的、已移除设置的警告 (issue 4404)
移除了在 Twisted 19.7.0 或更新版本中从
twisted.test.proto_helpers导入StringTransport的警告 (issue 4409)移除了过时的 Debian 软件包构建文件 (issue 4384)
移除了使用
object作为基类的做法 (issue 4430)移除了为我们不再支持的旧版本 Twisted 添加支持的代码 (issue 4472)
修复了代码风格问题 (issue 4468, issue 4469, issue 4471, issue 4481)
移除了
twisted.internet.defer.returnValue()调用 (issue 4443, issue 4446, issue 4489)
Scrapy 2.0.1 (2020-03-18)
Response.follow_all现在支持空的可迭代 URL 作为输入 (issue 4408, issue 4420)移除了顶层
reactor导入,以防止在使用TWISTED_REACTOR设置不同的 Twisted reactor 时出现安装错误 Twisted reactor 的错误 (issue 4401, issue 4406)修复了测试 (issue 4422)
Scrapy 2.0.0 (2020-03-03)
亮点
Python 2 支持已移除
新增
Response.follow_all方法媒体管道的 FTP 支持
新增
Response.certificate属性通过
DNS_RESOLVER支持 IPv6
向后不兼容的更改
继 2020 年 1 月 1 日 Python 2 寿命终止 之后,Python 2 的支持已被移除 (issue 4091, issue 4114, issue 4115, issue 4121, issue 4138, issue 4231, issue 4242, issue 4304, issue 4309, issue 4373)
重试放弃 (请参阅
RETRY_TIMES) 现在记录为错误,而不是调试信息 (issue 3171, issue 3566)LinkExtractor默认忽略的文件扩展名现在还包括7z、7zip、apk、bz2、cdr、dmg、ico、iso、tar、tar.gz、webm和xz(issue 1837, issue 2067, issue 4066)继浏览器的行为后,
METAREFRESH_IGNORE_TAGS设置现在默认是一个空列表 (issue 3844, issue 4311)继浏览器的行为后,
HttpCompressionMiddleware现在它设置的Accept-Encoding标头值中,逗号后面包含空格 (issue 4293)自定义下载处理器 (请参阅
DOWNLOAD_HANDLERS) 的__init__方法或以下下载处理器的子类不再接收settings参数请使用
from_settings或from_crawler类方法将此类参数暴露给你的自定义下载处理器。我们重构了
scrapy.core.scheduler.Scheduler类和相关的队列类 (请参阅SCHEDULER_PRIORITY_QUEUE、SCHEDULER_DISK_QUEUE和SCHEDULER_MEMORY_QUEUE),以便更容易实现自定义调度器队列类。有关详细信息,请参阅下面的 调度器队列类的更改。重写的设置现在以不同的格式记录。这与启动时记录的类似信息更为一致 (issue 4199)
移除弃用项
Scrapy shell 不再提供 sel 代理对象,请改用
response.selector(issue 4347)LevelDB 支持已被移除 (issue 4112)
以下函数已从
scrapy.utils.python中移除:isbinarytext、is_writable、setattr_default、stringify_dict(issue 4362)
弃用
使用前缀为
SCRAPY_的环境变量来覆盖设置已弃用 (issue 4300, issue 4374, issue 4375)scrapy.linkextractors.FilteringLinkExtractor已弃用,请改用scrapy.linkextractors.LinkExtractor(issue 4045)代理 URL 的
noconnect查询字符串参数已弃用,应从代理 URL 中移除 (issue 4198)scrapy.utils.python.MutableChain的next方法已弃用,请改用全局next()函数或MutableChain.__next__(issue 4153)
新功能
增加了对 Python 协程语法 的 部分支持,以及对
asyncio和asyncio驱动库的 实验性支持 (issue 4010, issue 4259, issue 4269, issue 4270, issue 4271, issue 4316, issue 4318)新的
Response.follow_all方法提供与Response.follow相同的功能,但支持 URL 的可迭代对象作为输入,并返回请求的可迭代对象 (issue 2582, issue 4057, issue 4286)媒体管道 现在支持 FTP 存储 (issue 3928, issue 3961)
新的
Response.certificate属性对于 HTTPS 响应将服务器的 SSL 证书暴露为twisted.internet.ssl.Certificate对象 (issue 2726, issue 4054)新的
DNS_RESOLVER设置允许开启 IPv6 支持 (issue 1031, issue 4227)新的
SCRAPER_SLOT_MAX_ACTIVE_SIZE设置允许配置现有的软限制,即当正在处理的总响应数据过高时暂停请求下载 (issue 1410, issue 3551)新的
TWISTED_REACTOR设置允许自定义 Scrapy 使用的reactor,从而允许 启用 asyncio 支持 或处理 常见的 macOS 问题 (issue 2905, issue 4294)调度器磁盘和内存队列现在可以使用类方法
from_crawler或from_settings(issue 3884)新的
Response.cb_kwargs属性作为Response.request.cb_kwargs的快捷方式 (issue 4331)Response.follow现在支持flags参数,以与Request保持一致 (issue 4277, issue 4279)项目加载器处理器 (Item loader processors) 现在可以是普通函数,不再需要是方法 (issue 3899)
Rule现在接受一个errback参数 (issue 4000)当指定了
errback参数时,Request不再需要callback参数 (issue 3586, issue 4008)LogFormatter现在支持一些额外的方法download_error用于下载错误item_error用于在 项目管道 进行项目处理期间抛出的异常spider_error用于从 爬虫回调 中抛出的异常
FEED_URI设置现在支持pathlib.Path值 (issue 3731, issue 4074)一个新的
request_left_downloader信号在请求离开下载器时发送 (issue 4303)当 Scrapy 检测到一个请求回调或 errback 使用了
yield但同时也返回了一个值时,它会记录一个警告,因为返回值会丢失 (issue 3484, issue 3869)Spider对象如果既没有start_urls属性,也没有重新实现scrapy.spiders.Spider.start_requests(),但却有一个start_url属性,现在会抛出一个AttributeError异常 (issue 4133, issue 4170)BaseItemExporter的子类现在可以在其__init__方法中使用super().__init__(**kwargs)而不是self._configure(kwargs),如果需要,可以将dont_fail=True传递给父类的__init__方法,并在调用父类__init__方法后,通过self._kwargs访问kwargs(issue 4193, issue 4370)scrapy.utils.request.request_fingerprint的一个新参数keep_fragments允许为 URL 中具有不同片段的请求生成不同的指纹 (issue 4104)下载处理器 (请参阅
DOWNLOAD_HANDLERS) 现在可以使用其他 Scrapy 组件已经支持的from_settings和from_crawler类方法 (issue 4126)scrapy.utils.python.MutableChain.__iter__现在返回self,允许它被当作一个序列使用 (issue 4153)
错误修复
当在抓取开始前发生异常时,
crawl命令现在也会以退出代码 1 退出 (issue 4175, issue 4207)LinkExtractor.extract_links不再将查询字符串或来自非 UTF-8 响应的 URL 重新编码为 UTF-8 (issue 998, issue 1403, issue 1949, issue 4321)第一个爬虫中间件 (请参阅
SPIDER_MIDDLEWARES) 现在也处理从作为生成器的回调中抛出的异常 (issue 4260, issue 4272)现在支持重定向到以 3 个斜杠 (
///) 开头的 URL (issue 4032, issue 4042)Request不再仅仅因为字符串中包含冒号就将其作为url接受 (issue 2552, issue 4094)MailSender中附件名称现在使用正确的编码方式 (issue 4229, issue 4239)默认的
DUPEFILTER_CLASS——RFPDupeFilter,在 Windows 上不再于每一行写入一个额外的\r字符,这曾导致该平台上requests.seen文件的大小不必要地变大 (issue 4283)Z shell 自动补全现在查找
.html文件,而不是.http文件,并涵盖了-h命令行开关 (issue 4122, issue 4291)向没有定义
limit的scrapy.utils.datatypes.LocalCache对象添加项目,不再抛出TypeError异常 (issue 4123)修复了当
scrapy.utils.misc.create_instance()的settings和crawler都被设置为None时抛出的ValueError异常消息中的拼写错误 (issue 4128)
文档说明
API 文档现在链接到相应源代码的在线语法高亮视图 (issue 4148)
指向不存在的文档页面的链接现在允许访问侧边栏 (issue 4152, issue 4169)
文档中的交叉引用现在在悬停时会显示工具提示 (issue 4173, issue 4183)
改进了关于
LinkExtractor.extract_links的文档,并简化了 链接提取器 (issue 4045)澄清了
ItemLoader.item的工作原理 (issue 3574, issue 4099)澄清了在同时使用
CrawlerProcess时不应使用logging.basicConfig()(issue 2149, issue 2352, issue 3146, issue 3960)澄清了 在使用持久化时 对
Request对象的要求 (issue 4124, issue 4139)澄清了如何安装 自定义图像管道 (image pipeline) (issue 4034, issue 4252)
修复了 媒体管道 示例中
file_path方法的签名 (issue 4290)涵盖了 Scrapy 1.7.0 中影响自定义
scrapy.core.scheduler.Scheduler子类的向后不兼容更改 (issue 4274)改进了
README.rst和CODE_OF_CONDUCT.md文件 (issue 4059)文档示例现在作为我们测试套件的一部分进行检查,并且我们已经修复了一些检测到的问题 (issue 4142, issue 4146, issue 4171, issue 4184, issue 4190)
修复了逻辑问题、断链和拼写错误(issue 4247、issue 4258、issue 4282、issue 4288、issue 4305、issue 4308、issue 4323、issue 4338、issue 4359、issue 4361)
提高了引用对象
__init__方法时的一致性(issue 4086、issue 4088)修复了 Scrapy 一览 中代码与输出之间的一致性问题(issue 4213)
扩展了
intersphinx的用法(issue 4147、issue 4172、issue 4185、issue 4194、issue 4197)我们现在使用较新版本的 Python 来构建文档(issue 4140、issue 4249)
清理了文档(issue 4143、issue 4275)
质量保证
重新启用了代理
CONNECT测试(issue 2545、issue 4114)在测试套件中添加了 Bandit 安全检查(issue 4162、issue 4181)
在测试套件中添加了 Flake8 风格检查,并应用了许多相应的更改(issue 3944、issue 3945、issue 4137、issue 4157、issue 4167、issue 4174、issue 4186、issue 4195、issue 4238、issue 4246、issue 4355、issue 4360、issue 4365)
提高了测试覆盖率(issue 4097、issue 4218、issue 4236)
开始报告最慢的测试,并优化了其中一些测试的性能(issue 4163、issue 4164)
修复了损坏的测试并重构了部分测试(issue 4014、issue 4095、issue 4244、issue 4268、issue 4372)
修改了 tox 配置,允许使用任何 Python 版本运行测试,默认运行 Bandit 和 Flake8 测试,并通过程序强制执行最低 tox 版本要求(issue 4179)
清理了代码(issue 3937、issue 4208、issue 4209、issue 4210、issue 4212、issue 4369、issue 4376、issue 4378)
调度器队列类的更改
以下更改可能会影响所有类型的任何自定义队列类
push方法不再接收包含request.priority * -1的第二个位置参数。如果您需要该值,请改为从第一个位置参数request中获取,或者在scrapy.core.scheduler.ScrapyPriorityQueue子类中使用新的priority()方法。
以下更改可能会影响自定义优先级队列类
在
__init__方法或from_crawler或from_settings类方法中以前包含工厂函数的参数
qfactory,现在作为名为downstream_queue_cls的关键字参数传递。添加了一个新的关键字参数:
key。它是一个字符串,对于内存队列始终为空字符串,对于磁盘队列则表示JOB_DIR的值。磁盘队列中包含上次爬取数据的参数
startprios或slot_startprios,现在作为名为startprios的关键字参数传递。serialize参数不再传递。磁盘队列类在写入磁盘之前必须自行处理请求序列化,使用来自scrapy.utils.reqser模块的request_to_dict()和request_from_dict()函数。
以下更改可能会影响自定义磁盘和内存队列类
__init__方法的签名现在是__init__(self, crawler, key)。
以下更改专门影响来自 scrapy.core.scheduler 的 ScrapyPriorityQueue 和 DownloaderAwarePriorityQueue 类,并且可能会影响子类
在
__init__方法中,上述描述的大多数更改均适用。不过,
__init__仍然可以接收所有作为位置参数的参数取代了
qfactory的downstream_queue_cls必须以不同的方式实例化。qfactory是使用优先级值(整数)进行实例化的。downstream_queue_cls的实例应使用新的ScrapyPriorityQueue.qfactory或DownloaderAwarePriorityQueue.pqfactory方法创建。新的
key参数将startprios参数向右移动了 1 个位置。
添加了以下类属性
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)
安全错误修复
当定义了 cookie 的
Request对象收到重定向响应导致调度新的Request对象时,原始Request对象中定义的 cookie 不再被复制到新的Request对象中。如果您在
Request对象上手动设置了Cookie标头,且重定向 URL 的域名与原始Request对象 URL 的域名不完全匹配,则您的Cookie标头现在会从新的Request对象中被丢弃。旧的行为可能会被攻击者利用来获取您的 cookie。请参阅 cjvr-mfj7-j4j8 安全公告 了解更多信息。
注意
仍然可以通过在定义 cookie 时将共享域名后缀(例如
example.com)定义为 cookie 域名,来实现在具有相同共享域名后缀的不同域名(例如example.com和任何子域名)之间共享 cookie。有关更多信息,请参阅Request类的文档。当响应的
Set-Cookie标头中接收到或在Request对象中定义的 cookie 的域名被设置为 公共后缀 (public suffix) 时,除非 cookie 域名与请求域名相同,否则该 cookie 现已被忽略。旧的行为可能会被攻击者利用,向您发送到其他域的请求中注入 cookie。请参阅 mfjm-vh54-3f96 安全公告 了解更多信息。
Scrapy 1.8.1 (2021-10-05)
安全漏洞修复
如果您使用
HttpAuthMiddleware(即http_user和http_passSpider 属性)进行 HTTP 身份验证,则任何请求都会向请求目标暴露您的凭据。为了防止身份验证凭据无意中暴露给非预期的域名,您现在必须额外设置一个新的 Spider 属性
http_auth_domain,并将其指向必须发送身份验证凭据的具体域名。如果未设置
http_auth_domainSpider 属性,则第一个请求的域名将被视为 HTTP 身份验证目标,身份验证凭据将仅在针对该域名的请求中发送。如果您需要向多个域名发送相同的 HTTP 身份验证凭据,可以使用
w3lib.http.basic_auth_header()来设置请求的Authorization标头值。如果您确实希望您的 Spider 向任何域名发送相同的 HTTP 身份验证凭据,请将
http_auth_domainSpider 属性设置为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(Python 2 为 16.0.0)
zope.interface 4.1.3
为了与类似类保持一致,
JSONRequest现在更名为JsonRequest(issue 3929、issue 3982)如果您使用自定义上下文工厂 (
DOWNLOADER_CLIENTCONTEXTFACTORY),其__init__方法必须接受两个新参数:tls_verbose_logging和tls_ciphers(issue 2111、issue 3392、issue 3442、issue 3450)ItemLoader现在将其输入 item 的值转换为列表>>> 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 解析的单独 User-Agent 字符串(issue 3931、issue 3966)Rule不再强制要求LinkExtractor参数(issue 781、issue 4016)使用新的
DOWNLOADER_CLIENT_TLS_CIPHERS设置来自定义默认 HTTP/1.1 下载器使用的 TLS/SSL 密码(issue 3392、issue 3442)将新的
DOWNLOADER_CLIENT_TLS_VERBOSE_LOGGING设置为True,以便在建立 HTTPS 连接后启用有关 TLS 连接参数的调试级别消息(issue 2111、issue 3450)接收关键字参数的回调(参见
Request.cb_kwargs)现在可以使用新的@cb_kwargsspider contract 进行测试(issue 3985、issue 3988)当
@scrapesspider contract 失败时,现在会报告所有缺失的字段(issue 766、issue 3939)自定义日志格式 现在可以通过让配置的
LOG_FORMATTER的相应方法返回None来丢弃消息(issue 3984、issue 3987)现在为 Zsh 提供了大幅改进的补全定义(issue 4069)
Bug 修复
ItemLoader.load_item()不再导致后续对ItemLoader.get_output_value()或ItemLoader.load_item()的调用返回空数据(issue 3804、issue 3819、issue 3897、issue 3976、issue 3998、issue 4036)修复了
DummyStatsCollector引发TypeError异常的问题(issue 4007、issue 4052)FilesPipeline.file_path和ImagesPipeline.file_path不再选择未经 IANA 注册 的文件扩展名(issue 1287、issue 3953、issue 3954)当使用 botocore 将文件持久保存到 S3 时,所有 botocore 支持的标头现在都能正确映射(issue 3904、issue 3905)
FEED_URI中包含百分比转义字符的 FTP 密码现在可以正确解码(issue 3941)修复了
scrapy.utils.ssl.get_temp_key_info()中的一个内存处理和错误处理问题(issue 3920)
文档
文档现在涵盖了如何定义和配置 自定义日志格式(issue 3616、issue 3660)
添加了
MarshalItemExporter和PythonItemExporter的 API 文档(issue 3973)添加了
BaseItem和ItemMeta的 API 文档(issue 3999)少量文档修复(issue 2998、issue 3398、issue 3597、issue 3894、issue 3934、issue 3978、issue 3993、issue 4022、issue 4028、issue 4033、issue 4046、issue 4050、issue 4055、issue 4056、issue 4061、issue 4072、issue 4071、issue 4079、issue 4081、issue 4089、issue 4093)
弃用移除
scrapy.xlib已被移除(issue 4015)
弃用
HttpCacheMiddleware的 LevelDB 存储后端 (scrapy.extensions.httpcache.LeveldbCacheStorage) 已被弃用(issue 4085、issue 4092)弃用未公开的
SCRAPY_PICKLED_SETTINGS_TO_OVERRIDE环境变量(issue 3910)scrapy.item.DictItem已被弃用,请改用Item(issue 3999)
其他更改
更新了持续集成测试所涵盖的 Scrapy 可选要求的最低版本
这些可选要求的较低版本可能会工作,但不保证其兼容性(issue 3892)
用于 Bug 报告和功能请求的 GitHub 模板(issue 3126、issue 3471、issue 3749、issue 3754)
持续集成修复(issue 3923)
代码清理(issue 3391、issue 3907、issue 3946、issue 3950、issue 4023、issue 4031)
Scrapy 1.7.4 (2019-10-21)
回滚了对 issue 3804 的修复(issue 3819),因为该修复产生了一些不希望看到的副作用(issue 3897、issue 3976)。
因此,当使用 item 初始化 Item Loader 时,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 软件包是错误的 commit 标记结果,不包含下述所有更改。
亮点
针对多域名爬取的优化
更简洁的向回调传递参数的方式
新增用于 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(issue 3520)新的
Request.cb_kwargs属性提供了一种更简洁的方法将关键字参数传递给回调方法(issue 1138、issue 3563)新的
JSONRequest类提供了一种更便捷的方法来构建 JSON 请求(issue 3504、issue 3505)传递给
Rule__init__方法的process_request回调现在接收发起该请求的Response对象作为其第二个参数(issue 3682)LinkExtractor__init__方法的新参数restrict_text允许按链接文本过滤链接(issue 3622、issue 3635)新的
FEED_STORAGE_S3_ACL设置允许为导出到 Amazon S3 的 feed 定义自定义 ACL(issue 3607)新的
FEED_STORAGE_FTP_ACTIVE设置允许对导出到 FTP 服务器的 feed 使用 FTP 的主动连接模式(issue 3829)新的
METAREFRESH_IGNORE_TAGS设置允许在响应中搜索触发重定向的 HTML meta 标签时,重写要忽略的 HTML 标签(issue 1422、issue 3768)新的
redirect_reasons请求 meta 键公开了每个跟随的重定向背后的原因(状态代码、meta 刷新)(issue 3581、issue 3687)在运行
check命令期间,SCRAPY_CHECK变量现在被设置为true字符串,这允许 在代码中检测 contract 检查运行(issue 3704、issue 3739)新的
Item.deepcopy()方法使 深拷贝 item 变得更容易(issue 1493、issue 3671)CoreStats现在也会记录elapsed_time_seconds(issue 3638)来自
ItemLoader输入和输出处理器 的异常现在更加详细(issue 3836、issue 3840)如果
Crawler、CrawlerRunner.crawl和CrawlerRunner.create_crawler收到的是Spider子类的实例而非子类本身,它们现在会以优雅的方式报错(issue 2283、issue 3610、issue 3872)
Bug 修复
process_spider_exception()现在也会针对生成器被调用(issue 220、issue 2061)不再捕获系统异常,如 KeyboardInterrupt(issue 3726)
ItemLoader.load_item()不再导致后续对ItemLoader.get_output_value()或ItemLoader.load_item()的调用返回空数据(issue 3804、issue 3819)图片管道 (
ImagesPipeline) 不再忽略这些 Amazon S3 设置:AWS_ENDPOINT_URL、AWS_REGION_NAME、AWS_USE_SSL、AWS_VERIFY(issue 3625)修复了
scrapy.pipelines.media.MediaPipeline中的内存泄漏问题,该问题会影响例如非 200 响应和来自自定义中间件的异常(issue 3813)带有私有回调的请求现在可以正确地从磁盘反序列化(issue 3790)
FormRequest.from_response()现在像主流 Web 浏览器一样处理无效方法(issue 3777、issue 3794)
文档
一个新主题 选择动态加载的内容 涵盖了读取动态加载数据的推荐方法(issue 3703)
通用爬虫 现在包含有关内存使用的信息(issue 1264、issue 3866)
Rule的文档现在涵盖了在使用CrawlSpider时如何访问链接文本(issue 3711、issue 3712)一个新章节 编写您自己的存储后端 涵盖了为
HttpCacheMiddleware编写自定义缓存存储后端的内容(issue 3683、issue 3692)一个新的 常见问题解答 条目 如何在 Item Pipeline 中将一个 Item 拆分为多个 Item? 解释了当您想从 Item Pipeline 中将一个 Item 拆分为多个 Item 时该怎么做(issue 2240、issue 3672)
更新了 关于爬取顺序的 FAQ 条目,以解释为什么前几个请求很少遵循所需的顺序(issue 1739、issue 3621)
LOGSTATS_INTERVAL设置(issue 3730)、FilesPipeline.file_path和ImagesPipeline.file_path方法(issue 2253、issue 3609)以及Crawler.stop()方法(issue 3842)现在都已记录在文档中文档中一些令人困惑或有误导性的部分现在更加清晰了(issue 1347、issue 1789、issue 2289、issue 3069、issue 3615、issue 3626、issue 3668、issue 3670、issue 3673、issue 3728、issue 3762、issue 3861、issue 3882)
少量文档修复(issue 3648、issue 3649、issue 3662、issue 3674、issue 3676、issue 3694、issue 3724、issue 3764、issue 3767、issue 3791、issue 3797、issue 3806、issue 3812)
弃用移除
以下已弃用的 API 已被移除(issue 3578)
scrapy.conf(请改用Crawler.settings)来自
scrapy.core.downloader.handlershttp.HttpDownloadHandler(请改用http10.HTTP10DownloadHandler)
scrapy.loader.ItemLoader._get_values(请改用_get_xpathvalues)scrapy.loader.XPathItemLoader(请改用ItemLoader)scrapy.log(参见 日志记录)来自
scrapy.pipelinesfiles.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.csstranslatorScrapyGenericTranslator(请改用 parsel.csstranslator.GenericTranslator)ScrapyHTMLTranslator(请改用 parsel.csstranslator.HTMLTranslator)ScrapyXPathExpr(请改用 parsel.csstranslator.XPathExpr)
来自
Selector_root(包括__init__方法参数和对象属性,请改用root)extract_unquoted(请改用getall)select(请改用xpath)
来自
SelectorListextract_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.pythonstr_to_unicode(请改用to_unicode)unicode_to_str(请改用to_bytes)
scrapy.utils.response.body_or_str
以下已弃用的设置也已被移除(issue 3578)
SPIDER_MANAGER_CLASS(请改用SPIDER_LOADER_CLASS)
弃用
弃用
SCHEDULER_PRIORITY_QUEUE设置的queuelib.PriorityQueue值。请改用scrapy.pqueues.ScrapyPriorityQueue。弃用传递给
Rule且不接受两个参数的process_request回调。以下模块已弃用
scrapy.utils.http(请改用 w3lib.http)scrapy.utils.markup(请改用 w3lib.html)scrapy.utils.multipart(请改用 urllib3)
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)
文档策略 现在要求 docstrings(issue 3701)遵循 PEP 257(issue 3748)
内部修复和清理(issue 3629、issue 3643、issue 3684、issue 3698、issue 3734、issue 3735、issue 3736、issue 3737、issue 3809、issue 3821、issue 3825、issue 3827、issue 3833、issue 3857、issue 3877)
Scrapy 1.6.0 (2019-01-30)
亮点
更好的 Windows 支持;
Python 3.7 兼容性;
重大的文档改进,包括将 API 从
.extract_first()+.extract()切换为.get()+.getall();Feed 导出、FilePipeline 和 MediaPipeline 的改进;
更好的可扩展性:新增
item_error和request_reached_downloader信号;Feed 导出器、Feed 存储和去重过滤器现在支持from_crawler。scrapy.contracts修复和新特性;Telnet 控制台安全性改进,最初在 Scrapy 1.5.2 (2019-01-22) 中作为向后移植发布;
清理已弃用的代码;
整个代码库的各种 Bug 修复、小的新特性和易用性改进。
Selector API 的更改
虽然这些更改不是 Scrapy 自身发生的,而是在 Scrapy 用于 XPath/CSS 选择器的 parsel 库中发生的,但这些更改值得在此提及。Scrapy 现在依赖于 parsel >= 1.5,并且 Scrapy 文档已更新以遵循最新的 parsel API 规范。
最明显的更改是,.get() 和 .getall() 选择器方法现在优于 .extract_first() 和 .extract()。我们认为这些新方法可以使代码更加简洁易读。有关更多详细信息,请参阅 extract() 和 extract_first()。
注意
目前 没有计划 弃用 .extract() 和 .extract_first() 方法。
另一个有用的新特性是引入了 Selector.attrib 和 SelectorList.attrib 属性,这使得获取 HTML 元素的属性变得更加容易。请参阅 选择元素属性。
CSS 选择器在 parsel >= 1.5 中已被缓存,这使得在多次使用相同的 CSS 路径时速度更快。这在 Scrapy 爬虫中非常常见:回调通常会在不同的页面上被调用多次。
如果您使用的是自定义的 Selector 或 SelectorList 子类,parsel 中一个 向后不兼容 的更改可能会影响您的代码。有关详细说明以及完整的改进列表,请参阅 parsel 变更日志。
Telnet 控制台
向后不兼容:Scrapy 的 telnet 控制台现在需要用户名和密码。详见 Telnet 控制台。此更改修复了一个安全问题;详情请参阅 Scrapy 1.5.2 (2019-01-22) 发行说明。
新的可扩展性功能
Feed 导出器(feed exporters)和 Feed 存储(feed storages)现在支持
from_crawler。除此之外,这还允许从自定义 feed 存储和导出器中访问 Scrapy 设置(issue 1605,issue 3348)。重复过滤器(dupefilters)现在支持
from_crawler(issue 2956);这允许从重复过滤器中访问例如设置或 spider。当 pipeline 中发生错误时,会触发
item_error信号(issue 3256);当下载器(Downloader)获取到新的 Request 时,会触发
request_reached_downloader信号;此信号对于自定义调度器(Schedulers)等非常有用(issue 3393)。新增 SitemapSpider
sitemap_filter()方法,允许在 SitemapSpider 子类中根据属性筛选站点地图条目(issue 3512)。现在下载器处理器(Downloader Handlers)的延迟加载是可选的;这有助于在自定义下载器处理器中更好地处理初始化错误(issue 3394)。
新的 FilePipeline 和 MediaPipeline 功能
为 S3FilesStore 公开更多选项:
AWS_ENDPOINT_URL,AWS_USE_SSL,AWS_VERIFY,AWS_REGION_NAME。例如,这允许使用替代的或自托管的 AWS 兼容提供商(issue 2609,issue 3548)。Google Cloud Storage 的 ACL 支持:
FILES_STORE_GCS_ACL和IMAGES_STORE_GCS_ACL(issue 3199)。
scrapy.contracts 改进
合同(contracts)代码中的异常得到了更好的处理(issue 3377);
合同请求现在使用
dont_filter=True,这允许使用相同的 URL 测试不同的回调函数(issue 3381);Contract 子类中的
request_cls属性允许在合同中使用不同的 Request 类,例如 FormRequest(issue 3383)。修复了合同中的 errback 处理,例如当合同针对返回非 200 响应的 URL 执行时的情况(issue 3371)。
易用性改进
为 RobotsTxtMiddleware 增加了更多统计数据(issue 3100)
现在使用 INFO 日志级别来显示 telnet 的主机/端口(issue 3115)
在 RobotsTxtMiddleware 的 IgnoreRequest 中添加了消息(issue 3113)
更好地验证
Response.follow中的url参数(issue 3131)当 spider 初始化发生错误时,Scrapy 命令会返回非零退出代码(issue 3226)
链接提取改进:将 “ftp” 添加到协议列表中(issue 3152);将 “flv” 添加到常见视频扩展名中(issue 3165)
当导出器(exporter)被禁用时,提供更好的错误消息(issue 3358);
scrapy shell --help提到了本地文件所需的语法(./file.html)——issue 3496。Referer 标头值已添加到 RFPDupeFilter 日志消息中(issue 3588)
错误修复
修复了 Windows 下 .csv 导出中出现额外空行的问题(issue 3039);
在 Python 3 中为磁盘队列序列化对象时,能够正确处理 pickling 错误(issue 3082)
现在在复制 Request 时会保留 flags(issue 3342);
FormRequest.from_response 的 clickdata 不应忽略带有
input[type=image]的元素(issue 3153)。FormRequest.from_response 应该保留重复的键(issue 3247)
文档改进
文档已重写,建议使用 .get/.getall API 代替 .extract/.extract_first。此外,选择器(Selectors)文档已更新并重新结构化,以匹配最新的 parsel 文档;它们现在包含更多主题,例如 选择元素属性 或 CSS 选择器扩展(issue 3390)。
使用浏览器的开发者工具进行爬取是一个新的教程,取代了旧的 Firefox 和 Firebug 教程(issue 3400)。
记录了 SCRAPY_PROJECT 环境变量(issue 3518);
安装说明中增加了故障排除章节(issue 3517);
改进了教程中指向初学者资源的链接(issue 3367,issue 3468);
修复了文档中
RETRY_HTTP_CODES的默认值(issue 3335);从文档中删除了未使用的
DEPTH_STATS选项(issue 3245);其他清理工作(issue 3347,issue 3350,issue 3445,issue 3544,issue 3605)。
移除弃用项
删除了针对 1.0 以前 Scrapy 模块名称的兼容性垫片(shims)(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)。
测试和 CI 修复(issue 3526,issue 3538,issue 3308,issue 3311,issue 3309,issue 3305,issue 3210,issue 3299)
scrapy.http.cookies.CookieJar.clear接受 “domain”、“path” 和 “name” 可选参数(issue 3231)。sdist 中包含了一些额外文件(issue 3495);
代码风格修复(issue 3405,issue 3304);
删除了不必要的 .strip() 调用(issue 3519);
使用 collections.deque 代替列表来存储 MiddlewareManager 方法(issue 3476)
Scrapy 1.5.2 (2019-01-22)
安全漏洞修复:Telnet 控制台扩展容易被恶意网站通过向 https://:6023 发送 POST 内容来利用。虽然我们还没发现直接从 Scrapy 利用它的方法,但很容易诱导浏览器执行此类操作,这增加了本地开发环境的风险。
此修复向后不兼容,它默认启用 telnet 用户名密码认证,并使用随机生成的密码。如果您无法立即升级,请考虑将
TELNETCONSOLE_PORT设置为非默认值。更多信息请参阅 telnet 控制台 文档
修复了由于 boto 导入错误导致 GCE 环境下 CI 构建失败的问题。
Scrapy 1.5.1 (2018-07-12)
这是一个维护版本,包含重要的错误修复,但没有新功能
修复了影响 Python 3 和 PyPy 的
O(N^2)gzip 解压问题(issue 3281);改进了对 TLS 验证跳过错误的处理(issue 3166);
修复了 Python 3.5+ 中 Ctrl-C 的处理问题(issue 3096);
测试修复(issue 3092,issue 3263);
文档改进(issue 3058,issue 3059,issue 3089,issue 3123,issue 3127,issue 3189,issue 3224,issue 3280,issue 3279,issue 3201,issue 3260,issue 3284,issue 3298,issue 3294)。
Scrapy 1.5.0 (2017-12-29)
此版本为整个代码库带来了细微的新功能和改进。一些亮点:
FilesPipeline 和 ImagesPipeline 现在支持 Google Cloud Storage。
由于现在可以复用代理服务器的连接,使用代理服务器进行爬取变得更加高效。
改进了警告、异常和日志消息,使调试更加容易。
scrapy parse命令现在允许通过--meta参数设置自定义 request 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覆盖的设置日志记录;这在技术上是向后不兼容的,因为 logger 从[scrapy.utils.log]更改为[scrapy.crawler]。如果您正在解析 Scrapy 日志,请更新您的日志解析器(issue 1343)。LinkExtractor 现在默认忽略
m4v扩展名,这是一个行为变化。522 和 524 状态码已添加到
RETRY_HTTP_CODES(issue 2851)
新功能
支持
Response.follow中的<link>标签(issue 2785)支持
ptpythonREPL(issue 2654)FilesPipeline 和 ImagesPipeline 支持 Google Cloud Storage(issue 2923)。
“scrapy parse” 命令的新选项
--meta允许传递额外的 request.meta(issue 2883)使用
shell.inspect_response时填充 spider 变量(issue 2812)处理 HTTP 308 永久重定向(issue 2844)
在
RETRY_HTTP_CODES中添加 522 和 524(issue 2851)启动时记录版本信息(issue 2857)
scrapy.mail.MailSender现在可在 Python 3 中工作(需要 Twisted 17.9.0)代理服务器的连接现在可以复用(issue 2743)
添加了下载器中间件的模板(issue 2755)
当未定义 parse 回调时,为 NotImplementedError 提供明确的消息(issue 2831)
CrawlerProcess 增加了一个禁用安装根日志处理器的选项(issue 2921)
LinkExtractor 现在默认忽略
m4v扩展名针对超过
DOWNLOAD_WARNSIZE和DOWNLOAD_MAXSIZE限制的响应,提供更好的日志消息(issue 2927)当将 URL 而非域名放入
Spider.allowed_domains时显示警告(issue 2250)。
错误修复
修复了由
custom_settings覆盖的设置日志记录;这在技术上是向后不兼容的,因为 logger 从[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对备选链接(alternate links)的支持(issue 2853)
文档
补上了
AUTOTHROTTLE_TARGET_CONCURRENCY设置遗漏的要点。(issue 2756)更新了贡献文档,记录了新的支持渠道(issue 2762,issue 3038)
在文档中包含了对 Scrapy subreddit 的引用
修复了死链;对外部链接使用
https://(issue 2978,issue 2982,issue 2958)更好地记录了 CloseSpider 扩展(issue 2759)
在 MongoDB 示例中使用
pymongo.collection.Collection.insert_one()(issue 2781)拼写错误和错别字修复(issue 2828,issue 2837,issue 2884,issue 2924)
阐明了
CSVFeedSpider.headers文档(issue 2826)记录了
DontCloseSpider异常并阐明了spider_idle(issue 2791)更新了 README 中的 “Releases” 章节(issue 2764)
修复了
DOWNLOAD_FAIL_ON_DATALOSS文档中的 rst 语法(issue 2763)微调了 startproject 参数的描述(issue 2866)
阐明了 Response.body 文档中的数据类型(issue 2922)
在 DepthMiddleware 文档中添加了关于
request.meta['depth']的说明(issue 2374)在 CookiesMiddleware 文档中添加了关于
request.meta['dont_merge_cookies']的说明(issue 2999)更新了项目结构的示例(issue 2964,issue 2976)
提供了更好的 ItemExporters 使用示例(issue 2989)
记录了 spider 和 downloader 中间件的
from_crawler方法(issue 3019)
Scrapy 1.4.0 (2017-05-18)
Scrapy 1.4 虽然没有带来太多令人惊叹的新功能,但仍包含不少实用的改进。
Scrapy 现在通过新的 FTP_USER 和 FTP_PASSWORD 设置,支持带有可自定义用户和密码的匿名 FTP 会话。如果您使用的是 Twisted 17.1.0 或更高版本,Python 3 现在也可以使用 FTP。
新增了一个用于创建请求的 response.follow 方法;这现在是 Scrapy spider 中创建请求的推荐方式。此方法使编写正确的 spider 更加容易;与直接创建 scrapy.Request 对象相比,response.follow 具有多项优势:
它处理相对 URL;
它能正确处理非 UTF8 页面上的非 ASCII URL;
除了绝对和相对 URL 外,它还支持选择器(Selectors);对于
<a>元素,它还可以提取它们的 href 值。
例如,现在可以不用这样写:
for href in response.css('li.page a::attr(href)').extract():
url = response.urljoin(href)
yield scrapy.Request(url, self.parse, encoding=response.encoding)
而可以这样写:
for a in response.css('li.page a'):
yield response.follow(a, self.parse)
链接提取器(Link extractors)也得到了改进。它们的工作方式类似于现代浏览器:在构建 Link 对象时,会从属性中删除前导和尾随空格(例如 href=" http://example.com")。FormRequest 的 action 属性也会进行这种空格修整。
另请注意,链接提取器现在默认不再对 URL 进行规范化(canonicalize)。 这一直让用户感到困惑,而且事实上浏览器也不会这么做,因此我们删除了对提取链接的这种额外转换。
对于那些希望对 Scrapy 在跟随链接时发送的 Referer: 标头进行更多控制的用户,您可以设置自己的 Referrer 策略。在 Scrapy 1.4 之前,默认的 RefererMiddleware 只会简单盲目地将其设置为生成 HTTP 请求的响应 URL(这可能会泄露您的种子 URL 信息)。现在,Scrapy 的默认行为与常规浏览器非常相似。而且此策略可以使用 W3C 标准值进行完全自定义(如果您愿意,也可以使用自定义值)。详见 REFERRER_POLICY。
为了使 Scrapy spider 更易于调试,Scrapy 1.4 默认记录更多统计数据:内存使用统计、详细的重试统计、详细的 HTTP 错误代码统计。类似的更改还有,HTTP 缓存路径现在也可以在日志中看到。
最后同样重要的一点是,Scrapy 现在可以通过新的 FEED_EXPORT_INDENT 设置,在项目之间添加换行符,甚至自定义缩进偏移,从而使 JSON 和 XML 项目更具可读性。
玩得开心!(或继续阅读本版本中的其他更改。)
弃用和向后不兼容的更改
scrapy.linkextractors.LinkExtractor默认设为canonicalize=False(issue 2537,修复了 issue 1941 和 issue 1982):注意,这在技术上是向后不兼容的默认启用内存使用(memusage)扩展(issue 2539,修复了 issue 2187);这在技术上是向后不兼容的,因此请检查您是否设置了任何非默认的
MEMUSAGE_***选项。EDITOR环境变量现在优先于 settings.py 中定义的EDITOR选项(issue 1829);Scrapy 默认设置不再依赖环境变量。这在技术上是向后不兼容的更改。Spider.make_requests_from_url已弃用(issue 1728,修复了 issue 1495)。
新功能
在
proxy请求 meta 键中接受代理凭据(issue 2526)支持 brotli 压缩内容;需要可选的 brotlipy(issue 2535)
用于创建请求的新 response.follow 快捷方式(issue 1940)
为
Request对象添加了flags参数和属性(issue 2047)支持匿名 FTP(issue 2342)
为
RetryMiddleware添加了retry/count、retry/max_reached和retry/reason_count/<reason>统计(issue 2543)为
HttpErrorMiddleware添加了httperror/response_ignored_count和httperror/response_ignored_status_count/<status>统计(issue 2566)RefererMiddleware中可自定义的Referrer 策略(issue 2306)新的
data:URI 下载处理器(issue 2334,修复了 issue 2156)使用 HTTP 缓存时记录缓存目录(issue 2611,修复了 issue 2604)
当项目包含重复的 spider 名称时警告用户(修复了 issue 2181)
scrapy.utils.datatypes.CaselessDict现在接受Mapping实例而不仅是 dict(issue 2646)通过
FilesPipeline或ImagesPipeline进行的 媒体下载 现在可以使用新的MEDIA_ALLOW_REDIRECTS设置可选地处理 HTTP 重定向(issue 2616,修复了 issue 2004)使用新的
DOWNLOAD_FAIL_ON_DATALOSS设置来接受来自网站的不完整响应(issue 2590,修复了 issue 2586)通过
FEED_EXPORT_INDENT设置可选地对 JSON 和 XML 项目进行美化输出(issue 2456,修复了 issue 1327)当传递
None值时,允许在FormRequest.from_response的 formdata 中删除字段(issue 667)使用新的
max_retry_timesmeta 键实现单个请求的重试次数(issue 2642)使用
python -m scrapy作为scrapy命令更明确的替代方式(issue 2740)
错误修复
LinkExtractor 现在会从属性中删除前导和尾随空格(issue 2547,修复了 issue 1614)
正确处理
FormRequest中 action 属性的空格(issue 2548)缓冲来自代理的 CONNECT 响应字节,直到接收到所有 HTTP 标头(issue 2495,修复了 issue 2491)
如果您使用 Twisted>=17.1,FTP 下载器现在可以在 Python 3 上运行(issue 2599)
解压内容后,使用正文来选择响应类型(issue 2393,修复了 issue 2145)
始终在
HttpCompressionMiddleware阶段解压Content-Encoding: gzip(issue 2391)遵守
Spider.custom_settings中的自定义日志级别(issue 2581,修复了 issue 1612)修复了 macOS 的 ‘make htmlview’(issue 2661)
从命令列表中删除 “commands”(issue 2695)
修复了正文为空的 POST 请求中重复的 Content-Length 标头问题(issue 2677)
正确取消大型下载,即超过
DOWNLOAD_MAXSIZE的下载(issue 1616)ImagesPipeline:修复了带调色板的透明 PNG 图像的处理(issue 2675)
清理与重构
测试:删除临时文件和文件夹(issue 2570),修复了 macOS 上的 ProjectUtilsTest(issue 2569),在 Travis CI 上为 Linux 使用便携式 pypy(issue 2710)
在 CrawlSpider 中将构建请求从
_requests_to_follow中分离出来(issue 2562)删除了 “Python 3 progress” 徽章(issue 2567)
在
.gitignore中增加了一些行(issue 2557)删除了 bumpversion 预发布配置(issue 2159)
添加了 codecov.yml 文件(issue 2750)
根据 Twisted 版本设置上下文工厂实现(issue 2577,修复了 issue 2560)
在默认项目中间件模板中添加了遗漏的
self参数(issue 2595)删除了 ExecutionEngine 中冗余的
slot.add_request()调用(issue 2617)在
scrapy.pipelines.files.FSFilesStore中捕获更具体的os.error异常(issue 2644)更改了 “localhost” 测试服务器证书(issue 2720)
删除了未使用的
MEMUSAGE_REPORT设置(issue 2576)
文档
导出器需要二进制模式(issue 2564,修复了 issue 2553)
提到了由于 lxml 中的 bug 导致的
FormRequest.from_response()问题(issue 2572)在模板中统一使用单引号(issue 2596)
记录了
ftp_user和ftp_passwordmeta 键(issue 2587)删除了关于已弃用的
contrib/的章节(issue 2636)在 Windows 上安装 Scrapy 时推荐使用 Anaconda(issue 2477,修复了 issue 2475)
FAQ:重写了关于 Windows 上 Python 3 支持的说明(issue 2690)
重新安排了选择器章节(issue 2705)
从
SelectorList文档中删除了__nonzero__(issue 2683)在
DUPEFILTER_CLASS设置文档中提到了如何禁用请求过滤(issue 2714)在文档设置说明中添加了 sphinx_rtd_theme(issue 2668)
在 JSON 项目写入器示例中以文本模式打开文件(issue 2729)
阐明了
allowed_domains示例(issue 2670)
Scrapy 1.3.3 (2017-03-10)
错误修复
使
SpiderLoader在缺少依赖项或SPIDER_MODULES错误时默认再次抛出ImportError。自 1.3.0 以来,这些异常被作为警告静默处理。现在引入了一个新设置,可以根据需要在警告或异常之间切换;详见SPIDER_LOADER_WARN_ONLY。
Scrapy 1.3.2 (2017-02-13)
错误修复
在转换为 dict 或从 dict 转换时保留请求类 (utils.reqser)(issue 2510)。
在教程中为作者字段使用一致的选择器(issue 2551)。
修复了 Twisted 17+ 中的 TLS 兼容性(issue 2558)
Scrapy 1.3.1 (2017-02-08)
新功能
支持布尔设置的
'True'和'False'字符串值(issue 2519);您现在可以执行类似scrapy crawl myspider -s REDIRECT_ENABLED=False的操作。支持在
response.xpath()中使用 kwargs 以使用 XPath 变量 和临时命名空间声明;这至少需要 Parsel v1.1(issue 2457)。增加对 Python 3.6 的支持(issue 2485)。
在 PyPy 上运行测试(注意:某些测试仍然失败,因此尚未正式支持 PyPy)。
错误修复
强制执行
DNS_TIMEOUT设置(issue 2496)。修复了
view命令;这是 v1.3.0 中的一个回归(issue 2503)。修复了 Files/Images pipeline 中关于
*_EXPIRES settings的测试(issue 2460)。修复了使用基本项目模板时生成的 pipeline 类名称(issue 2466)。
修复了与 Twisted 17+ 的兼容性(issue 2496,issue 2528)。
修复了 Python 3.6 上
scrapy.Item的继承问题(issue 2511)。在
SPIDER_MIDDLEWARES、DOWNLOADER_MIDDLEWARES、EXTENSIONS和SPIDER_CONTRACTS中强制组件顺序使用数值(issue 2420)。
文档
重写了行为准则(Code of Conduct)部分,并升级到 Contributor Covenant v1.4(issue 2469)。
阐明了传递 spider 参数会将它们转换为 spider 属性(issue 2483)。
记录了
FormRequest.from_response()上的formid参数(issue 2497)。为 README 文件添加了 .rst 扩展名(issue 2507)。
提到了 LevelDB 缓存存储后端(issue 2525)。
在示例回调代码中使用
yield(issue 2533)。增加了关于使用
.re()/.re_first()解码 HTML 实体的说明(issue 1704)。错别字修复(issue 2512,issue 2534,issue 2531)。
清理
删除了
MetaRefreshMiddleware中冗余的检查(issue 2542)。加快了
LinkExtractor中 allow/deny 模式的检查速度(issue 2538)。删除了支持旧版本 Twisted 的死代码(issue 2544)。
Scrapy 1.3.0 (2016-12-21)
这个版本在 1.2.2 之后很快发布,主要原因是一个发现:从 0.18 到 1.2.2(含)的版本都使用了来自 Twisted 的一些向后移植代码(scrapy.xlib.tx.*),即使有更新的 Twisted 模块可用。Scrapy 现在直接使用 twisted.web.client 和 twisted.internet.endpoints。(另见下面的清理部分。)
由于这是一个重大更改,我们希望尽快发布错误修复,同时不破坏任何使用 1.2 系列的项目。
新功能
MailSender现在接受单个字符串作为to和cc参数的值(issue 2272)Scrapy shell 内部的
scrapy fetch url、scrapy shell url和fetch(url)现在默认跟随 HTTP 重定向(issue 2290);详见fetch和shell。HttpErrorMiddleware现在以INFO级别记录错误,而不是DEBUG;这在技术上是向后不兼容的,因此请检查您的日志解析器。默认情况下,logger 名称现在使用长路径,例如
[scrapy.extensions.logstats],而不是先前版本中较短的 “顶级” 变体(例如[scrapy]);如果您的日志解析器期待短 logger 名称部分,这是向后不兼容的。您可以将LOG_SHORT_NAMES设置为True以切换回短 logger 名称。
依赖关系与清理
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)
错误修复
修复了当 pipeline 在
open_spider()上失败时出现的难以理解的追溯信息(issue 2011)修复了嵌入式 IPython shell 变量(修复了在 1.2.0 中重新出现的 issue 396,在 issue 2418 中修复)
处理 robots.txt 时的几个补丁:
处理(非标准的)相对站点地图 URL(issue 2390)
处理 Python 2 中的非 ASCII URL 和 User-Agent(issue 2373)
文档
记录了
Request的meta字典中的"download_latency"键(issue 2033)从目录(ToC)中删除了关于(已弃用且不受支持的)Ubuntu 软件包的页面(issue 2335)
修复了一些错别字(issue 2346,issue 2369,issue 2380)和说明(issue 2354,issue 2325,issue 2414)
其他更改
宣传 conda-forge 为 Scrapy 的官方 conda 渠道(issue 2387)
当尝试在非文本响应(non-Text Responses)上使用
.css()或.xpath()时,提供更有用的错误消息(issue 2264)startproject命令现在会生成一个示例middlewares.py文件(issue 2335)在
scrapy version的详细输出中增加了更多依赖项的版本信息(issue 2404)从源分发包(source distribution)中删除了所有
*.pyc文件(issue 2386)
Scrapy 1.2.1 (2016-10-21)
错误修复
在建立 TLS/SSL 连接时,包含了 OpenSSL 更加宽松的默认密码(issue 2314)。
修复了非 ASCII URL 重定向时的 “Location” HTTP 标头解码问题(issue 2321)。
文档
修复了 JsonWriterPipeline 示例(issue 2302)。
各项说明:关于 spider 名称的 issue 2330,关于中间件方法处理顺序的 issue 2329,以及关于以列表形式获取多值 HTTP 标头的 issue 2327。
其他更改
从内置 spider 模板的
start_urls中删除了www.(issue 2299)。
Scrapy 1.2.0 (2016-10-03)
新功能
新的
FEED_EXPORT_ENCODING设置,用于自定义将项目写入文件时使用的编码。这可以用来关闭 JSON 输出中的\uXXXX转义。对于那些希望 XML 或 CSV 输出使用 UTF-8 以外编码的用户,这也很有用(issue 2034)。startproject命令现在支持一个可选的目标目录,以覆盖基于项目名称的默认目录(issue 2005)。新的
SCHEDULER_DEBUG设置,用于记录请求序列化失败(issue 1610)。JSON 编码器现在支持
set实例的序列化(issue 2058)。将
application/json-amazonui-streaming解释为TextResponse(issue 1503)。使用 shell 工具(
shell,inspect_response)时,默认导入scrapy(issue 2248)。
错误修复
DefaultRequestHeaders 中间件现在在 UserAgent 中间件之前运行(issue 2088)。警告:这在技术上是向后不兼容的,尽管我们认为这是一个错误修复。
HTTP 缓存扩展和使用
.scrapy数据目录的插件现在可以在项目外工作(issue 1581)。警告:这在技术上是不向后兼容的,尽管我们将其视为 bug 修复。Selector不再允许同时传递response和text(issue 2153)。修复了
scrapy parse日志中显示错误回调名称的问题(issue 2169)。修复了一个奇怪的 gzip 解压 bug(issue 1606)。
修复了在
CrawlSpider中结合scrapy parse使用所选回调的问题(issue 2225)。修复了当爬虫未产出项目(item)时生成无效 JSON 和 XML 文件的问题(issue 872)。
为
StreamLogger实现flush(),以避免日志中出现警告(issue 2125)。
重构
canonicalize_url已移至 w3lib.url(issue 2168)。
测试与需求
Scrapy 新的需求基准是 Debian 8 "Jessie"。此前为 Ubuntu 12.04 Precise。这意味着在实践中,我们进行持续集成测试时,以下(主要)软件包的版本至少为:Twisted 14.0、pyOpenSSL 0.14、lxml 3.4。
Scrapy 在这些软件包的旧版本上可能仍然可以正常工作(例如,代码库中仍保留了针对旧版 Twisted 的切换逻辑),但不再保证其可靠性(因为不再进行测试)。
文档
语法修复:issue 2128、issue 1566。
从 README 中移除了下载统计徽章(issue 2160)。
新增 Scrapy 架构图(issue 2165)。
更新了
Response参数文档(issue 2197)。改写了具有误导性的
RANDOMIZE_DOWNLOAD_DELAY描述(issue 2190)。添加 StackOverflow 作为支持渠道(issue 2257)。
Scrapy 1.1.4 (2017-03-03)
打包修复:在 setup.py 中禁止不支持的 Twisted 版本
Scrapy 1.1.3 (2016-09-22)
Bug 修复
ImagesPipeline和FilesPipeline子类的类属性恢复到 1.1.1 版本之前的运作方式(issue 2243,修复 issue 2198)。
文档
总览和教程已重写,改用 http://toscrape.com 网站(issue 2236, issue 2249, issue 2252)。
Scrapy 1.1.2 (2016-08-18)
Bug 修复
引入了缺失的
IMAGES_STORE_S3_ACL设置,用于在向 S3 上传图片时覆盖ImagesPipeline中的默认 ACL 策略(注意,自 Scrapy 1.1.0 起,默认 ACL 策略已变为 "private" 而非 "public-read")。IMAGES_EXPIRES默认值恢复为 90(该回归问题是在 1.1.1 中引入的)。
Scrapy 1.1.1 (2016-07-13)
Bug 修复
在发往 HTTPS 代理的 CONNECT 请求中添加 "Host" 请求头(issue 2069)。
在选择响应类时使用响应正文
body(issue 2001,修复 issue 2000)。在规范化具有错误 netloc 的 URL 时不再报错(issue 2038,修复 issue 2010)。
针对
HttpCompressionMiddleware(以及SitemapSpider)的一些修复。不对 HEAD 响应进行解码(issue 2008,修复 issue 1899)。
处理 gzip Content-Type 头中的 charset 参数(issue 2050,修复 issue 2049)。
不对 gzip octet-stream 响应进行解压(issue 2065,修复 issue 2063)。
捕获(并发出警告后忽略)针对 IP 地址主机的证书验证异常(issue 2094,修复 issue 2092)。
使
FilesPipeline和ImagesPipeline在使用旧版类属性进行自定义方面重新实现向后兼容(issue 1989,修复 issue 1985)。
新功能
允许在项目文件夹外使用 genspider 命令(issue 2052)。
默认重试 HTTPS CONNECT
TunnelError(issue 1974)。
文档
FEED_TEMPDIR设置移动至字典序对应位置(commit 9b3c72c)。在总览中使用更符合习惯的
.extract_first()(issue 1994)。更新版权声明中的年份(commit c2c8036)。
添加关于 errback 的信息和示例(issue 1995)。
在下载器中间件示例中使用 "url" 变量(issue 2015)。
语法修复(issue 2054, issue 2120)。
新增关于在爬虫回调中使用 BeautifulSoup 的 FAQ 条目(issue 2048)。
添加关于 Scrapy 在 Windows + Python 3 环境下无法工作的说明(issue 2060)。
鼓励在拉取请求(PR)中使用完整的标题(issue 2026)。
测试
在 Travis CI 上升级 py.test 需求,并将 pytest-cov 固定为 2.2.1(issue 2095)。
Scrapy 1.1.0 (2016-05-11)
1.1 版本带来了许多有趣的功能和 bug 修复。
Scrapy 1.1 提供了对 Python 3 的 Beta 支持(需要 Twisted >= 15.5)。详情及局限性请参阅 Python 3 Beta 支持。
热门新功能
Item loader 现在支持嵌套 loader(issue 1467)。
FormRequest.from_response改进(issue 1382, issue 1137)。添加了设置
AUTOTHROTTLE_TARGET_CONCURRENCY并改进了 AutoThrottle 文档(issue 1324)。添加了
response.text以获取 unicode 格式的正文(issue 1730)。支持匿名 S3 连接(issue 1358)。
下载器中间件支持 Deferred(issue 1473)。这使得处理 robots.txt 更加高效(issue 1471)。
HTTP 缓存现在更严格地遵循 RFC2616,添加了设置
HTTPCACHE_ALWAYS_STORE和HTTPCACHE_IGNORE_RESPONSE_CACHE_CONTROLS(issue 1151)。选择器已提取到 parsel 库中(issue 1409)。这意味着您可以在不使用 Scrapy 的情况下使用 Scrapy 选择器,也可以单独升级选择器引擎而无需升级 Scrapy。
HTTPS 下载器现在默认进行 TLS 协议协商,而非强制使用 TLS 1.0。您还可以使用新的
DOWNLOADER_CLIENT_TLS_METHOD设置 SSL/TLS 方法。
以下 bug 修复可能需要您的关注
默认不再重试错误请求(HTTP 400)(issue 1289)。如果需要旧的行为,请将
400添加到RETRY_HTTP_CODES。修正 shell 文件参数处理(issue 1710, issue 1550)。如果您尝试执行
scrapy shell index.html,它会尝试加载 URLhttp://index.html;请使用scrapy shell ./index.html来加载本地文件。新创建的项目现在默认启用 Robots.txt 合规性(issue 1724)。Scrapy 还会等待 robots.txt 下载完成后再继续抓取(issue 1735)。如果您想禁用此行为,请在创建新项目后更新
settings.py文件中的ROBOTSTXT_OBEY。导出器(Exporter)现在默认处理 unicode 而非字节(bytes)(issue 1080)。如果您使用
PythonItemExporter,您可能需要更新代码以禁用现已废弃的二进制模式。接受包含点的 XML 节点名称为合法名称(issue 1533)。
在使用
FilesPipeline或ImagesPipeline向 S3 上传文件或图片时,默认 ACL 策略现为 "private" 而非 "public"。警告:不向后兼容!。您可以使用FILES_STORE_S3_ACL进行更改。我们重新实现了
canonicalize_url()以获得更准确的输出,特别是对于包含非 ASCII 字符的 URL(issue 1947)。与之前的 Scrapy 版本相比,这可能会改变链接提取器的输出。这也可能使您从 1.1 之前的运行中保留的某些缓存条目失效。警告:不向后兼容!。
继续阅读以了解有关其他改进和 bug 修复的更多细节。
Python 3 Beta 支持
我们一直在努力使 Scrapy 运行在 Python 3 上。因此,现在您可以在 Python 3.3、3.4 和 3.5 上运行爬虫(需要 Twisted >= 15.5)。某些功能仍然缺失(有些可能永远不会移植)。
几乎所有的内置扩展/中间件都应该可以工作。但是,我们已知 Python 3 中存在一些局限性:
Scrapy 无法在 Windows 上的 Python 3 环境下工作
不支持发送电子邮件
不支持 FTP 下载处理程序
不支持 Telnet 控制台
额外的新功能和增强
Scrapy 现在拥有了行为准则(issue 1681)。
命令行工具现在支持 zsh 补全(issue 934)。
scrapy shell的改进支持 bpython,并可通过
SCRAPY_PYTHON_SHELL配置首选 Python shell(issue 1100, issue 1444)。支持不带 scheme 的 URL(issue 1498)。警告:不向后兼容!
恢复了对相对文件路径的支持(issue 1710, issue 1550)。
添加了
MEMUSAGE_CHECK_INTERVAL_SECONDS设置,用于更改默认检查间隔(issue 1282)。下载处理程序现在会在第一次使用其 scheme 发出请求时延迟加载(issue 1390, issue 1421)。
HTTPS 下载处理程序不再强制使用 TLS 1.0;取而代之的是使用 OpenSSL 的
SSLv23_method()/TLS_method(),允许尝试与远程主机协商其支持的最高 TLS 协议版本(issue 1794, issue 1629)。RedirectMiddleware现在会跳过爬虫属性或Request的meta键中handle_httpstatus_list里的状态码(issue 1334, issue 1364, issue 1447)。表单提交
现在也支持
<button>元素(issue 1469)。对于没有 value 的提交按钮,现在使用空字符串(issue 1472)。
类字典(Dict-like)设置现在支持按键(per-key)优先级(issue 1135, issue 1149 和 issue 1586)。
支持发送非 ASCII 电子邮件(issue 1662)。
如果没有设置相关的配置,
CloseSpider和SpiderState扩展现在将被禁用(issue 1723, issue 1725)。添加了
ExecutionEngine.close方法(issue 1423)。添加了
CrawlerRunner.create_crawler方法(issue 1528)。调度器优先级队列现在可以通过
SCHEDULER_PRIORITY_QUEUE进行自定义(issue 1822)。链接提取器现在默认忽略
.pps链接(issue 1835)。FTP 和 S3 Feed 存储的临时数据文件夹现在可以使用新的
FEED_TEMPDIR设置进行自定义(issue 1847)。FilesPipeline和ImagesPipeline设置现在是实例属性而非类属性,从而支持针对特定爬虫的行为(issue 1891)。JsonItemExporter现在会将起始和结束方括号格式化在各自的行上(输出文件的第一行和最后一行)(issue 1950)。如果
botocore可用,则将其用于S3FeedStorage、S3DownloadHandler和S3FilesStore(issue 1761, issue 1883)。大量的文档更新和相关修复(issue 1291, issue 1302, issue 1335, issue 1683, issue 1660, issue 1642, issue 1721, issue 1727, issue 1879)。
其他重构、优化和清理(issue 1476, issue 1481, issue 1477, issue 1315, issue 1290, issue 1750, issue 1881)。
废弃与移除
添加了
to_bytes和to_unicode,废弃了str_to_unicode和unicode_to_str函数(issue 778)。引入了
binary_is_text以替代isbinarytext的使用(但返回值相反)(issue 1851)。移除了
optional_features集合(issue 1359)。移除了
--lsprof命令行选项(issue 1689)。警告:不向后兼容,但不会破坏用户代码。以下数据类型已被废弃(issue 1720):
scrapy.utils.datatypes.MultiValueDictKeyErrorscrapy.utils.datatypes.MultiValueDictscrapy.utils.datatypes.SiteNode
先前捆绑的
scrapy.xlib.pydispatch库已被废弃,并由 pydispatcher 替代。
位置变更
telnetconsole已移动至extensions/(issue 1524)。注意:telnet 在 Python 3 上未启用(https://github.com/scrapy/scrapy/pull/1524#issuecomment-146985595)。
Bug 修复
Scrapy 不再重试获得
HTTP 400 Bad Request响应的请求(issue 1289)。警告:不向后兼容!支持 http_proxy 配置中的空密码(issue 1274)。
将
application/x-json解释为TextResponse(issue 1333)。支持具有多个值的链接 rel 属性(issue 1201)。
修复了存在
<base>标签时scrapy.FormRequest.from_response的问题(issue 1564)。修复了
TEMPLATES_DIR的处理(issue 1575)。多项
FormRequest修复(issue 1595, issue 1596, issue 1597)。使
_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()中的 bug(issue 1212)。从
robots.txt提取站点地图现在不再区分大小写(issue 1902)。当针对同一远程主机使用多个代理时,HTTPS+CONNECT 隧道可能产生混淆的问题已修复(issue 1912)。
Scrapy 1.0.7 (2017-03-03)
打包修复:在 setup.py 中禁止不支持的 Twisted 版本
Scrapy 1.0.6 (2016-05-04)
修复:RetryMiddleware 现在可以兼容非标准 HTTP 状态码(issue 1857)。
修复:文件存储 HTTP 缓存检查了错误的修改时间(issue 1875)。
文档:支持 Sphinx 1.4+(issue 1893)。
文档:统一选择器示例(issue 1869)。
Scrapy 1.0.5 (2016-02-04)
修复:[Backport] 忽略 LinkExtractor 中的伪造链接(修复 issue 907,commit 108195e)。
测试:将 buildbot makefile 改为使用 'pytest'(commit 1f3d90a)。
文档:修复了教程和媒体管道中的拼写错误(commit 808a9ea 和 commit 803bd87)。
文档:在设置文档的 DOWNLOADER_MIDDLEWARES_BASE 中添加了 AjaxCrawlMiddleware(commit aa94121)。
Scrapy 1.0.4 (2015-12-30)
根据 Twisted 版本忽略 xlib/tx 文件夹(commit 7dfa979)。
在新的 travis-ci 基础设施上运行(commit 6e42f0b)。
拼写修复(commit 823a1cc)。
在 xmliter 正则表达式中转义节点名称(commit da3c155)。
测试带点的 XML 节点名称(commit 4418fc3)。
测试:在测试中不使用损坏的 Pillow 版本(commit a55078c)。
在 version 命令中禁用日志。解决 #1426(commit 86fc330)。
在 startproject 命令中禁用日志(commit db4c9fe)。
添加 PyPI 下载统计徽章(commit df2b944)。
如果 PR 是从 scrapy/scrapy 分支发起的,不要在 Travis 上运行两次测试(commit a83ab41)。
在 README 中添加 Python 3 移植状态徽章(commit 73ac80d)。
修复了 RFPDupeFilter 的持久化问题(commit 97d080e)。
测试:用于展示 dupefilter 持久化无法工作的测试(commit 97f2fb3)。
在 file:// 协议处理程序中显式关闭文件(commit d9b4850)。
在 shell 中禁用 dupefilter(commit c0d0734)。
文档:为显示在侧边栏的目录树(toctrees)添加标题(commit aa239ad)。
文档:从安装说明中移除了 pywin32,因为它已被声明为依赖项(commit 10eb400)。
添加了关于在 Windows 和其他操作系统上使用 Conda 的安装说明(commit 1c3600a)。
修复了微小的语法问题(commit 7f4ddd5)。
修复了文档中的一个拼写错误(commit b71f677)。
版本 1 现在已存在(commit 5456c0e)。
修复了另一个无效的 xpath 错误(commit 0a1366e)。
修复了 selectors.rst 中的 ValueError: Invalid XPath: //div/[id=”not-exists”]/text()(commit ca8d60f)。
拼写修正(commit 7067117)。
修复了 downloader-middleware.rst 和 exceptions.rst 中的拼写错误,middlware -> middleware(commit 32f115c)。
在 Ubuntu 安装章节添加了关于 Debian 兼容性的说明(commit 23fda69)。
使用 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)。
更新 tutorial.rst(commit fbc1f25)。
合并拉取请求 #1449,来自 rhoekman/patch-1(commit 7d6538c)。
微小的语法改动(commit 8752294)。
在 version 命令中添加了 openssl 版本(commit 13c45ac)。
Scrapy 1.0.3 (2015-08-11)
在 Scrapy 的 install_requires 中添加了 service_identity(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/ 包含在源码包(source distribution)中(commit eca227e)。
文档:修复 SelectJmes 文档(commit b8567bc)。
文档:将 Ubuntu 和 Archlinux 移出 Windows 子章节(commit 392233f)。
文档:移除 Ubuntu 软件包的版本后缀(commit 5303c66)。
文档:更新 1.0 版本的发布日期(commit c89fa29)。
Scrapy 1.0.0 (2015-06-19)
在此主要版本中,您将发现许多新功能和 bug 修复。请务必查看我们更新后的总览以快速了解部分变化,以及我们润色过的教程。
支持爬虫返回字典
现在不再必须声明并返回 Scrapy Item 来从爬虫中收集抓取的数据,您可以直接返回显式字典。
经典版本
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 编程之夏项目完成了一项重要的设置填充机制重构,引入了显式优先级以覆盖任何给定设置。作为该目标的延伸,我们为仅针对单只爬虫生效的设置引入了一个新的优先级级别,允许它们重新定义项目设置。
通过在您的爬虫中定义一个 custom_settings 类变量来开始使用它:
class MySpider(scrapy.Spider):
custom_settings = {
"DOWNLOAD_DELAY": 5.0,
"RETRY_ENABLED": False,
}
阅读更多关于设置填充的内容:设置
Python 日志 (Logging)
Scrapy 1.0 已从 Twisted logging 迁移到支持 Python 内置 logging 作为默认日志系统。我们为大部分旧的自定义日志函数接口保持了向后兼容,但您会收到切换到完整 Python logging 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')
在日志文档中阅读更多内容:日志记录
Crawler API 重构 (GSoC 2014)
去年 Google 编程之夏的另一个里程碑是对内部 API 的重构,力求更简单、更易用。在以下位置查看新的核心接口:核心 API
您会遇到这些变化的一个常见场景是在脚本中运行 Scrapy。以下是一个如何使用新 API 手动运行爬虫的快速示例:
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)
Selectorlist 的 extract first 方法(issue 624, issue 1145)
添加了 JmesSelect(issue 1016)
为文件系统 HTTP 缓存后端添加 gzip 压缩(issue 1020)
链接提取器支持 CSS 选择器(issue 983)
httpcache dont_cache meta #19 #689(issue 821)
添加请求被调度器丢弃时发送的信号(issue 961)
避免下载过大的响应(issue 946)
允许在 CSVFeedSpider 中指定 quotechar(issue 882)
在 "Spider error processing" 日志消息中添加 referer(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)
针对 0.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 deploy 命令(issue 1102)
解散 contrib_exp(issue 1134)
从根目录删除 bin 文件夹,解决 #913(issue 914)
移除基于 jsonrpc 的 Web 服务(issue 859)
修复了设置中搬迁路径导致的向后不兼容问题(issue 1267)
文档
CrawlerProcess 文档(issue 1190)
在描述中倾向于使用 "Web 抓取" (web scraping) 而非 "屏幕抓取" (screen scraping)(issue 1188)
Scrapy 教程的部分改进(issue 1180)
将文件管道 (Files Pipeline) 与图片管道 (Images Pipeline) 放在一起撰写文档(issue 1150)
部署文档微调(issue 1164)
新增包含 scrapyd-deploy 和 shub 的部署章节(issue 1124)
向项目模板中添加更多设置(issue 1073)
总览页面的一些改进(issue 1106)
更新了 docs/topics/architecture.rst 中的链接(issue 647)
文档:重排主题顺序(issue 1022)
更新 Request.meta 特殊键列表(issue 1071)
文档:完善 download_timeout 说明(issue 898)
文档:简化扩展文档(issue 893)
内存泄漏文档(issue 894)
文档:完善项目管道的 from_crawler 方法说明(issue 904)
Spider_error 不支持 Deferred(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 修复
Item 多重继承修复(issue 353, issue 1228)
ItemLoader.load_item:迭代字段的副本(issue 722)
修复 Deferred (RobotsTxtMiddleware) 中的未处理错误(issue 1131, issue 1197)
强制将 DOWNLOAD_TIMEOUT 读取为整数(issue 954)
scrapy.utils.misc.load_object 应打印完整回溯信息(issue 902)
修复 ".local" 主机名的 bug(issue 878)
修复了不再打印已启用的扩展、中间件和管道信息的问题(issue 879)
修复 dont_merge_cookies 在 meta 中设为 false 时的异常行为(issue 846)
Python 3 支持进展
如果 twisted.conch 不可用,则禁用 scrapy.telnet(issue 1161)
修复 ajaxcrawl.py 中的 Python 3 语法错误(issue 1162)
针对 urllib 进行了更多 Python 3 兼容性更改(issue 1121)
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:针对 robotparser 和 urlparse 使用 six(issue 800)
PY3:使用 six.iterkeys, six.iteritems 和 tempfile(issue 799)
PY3:修复 has_key 并使用 six.moves.configparser(issue 798)
PY3:使用 six.moves.cPickle(issue 797)
PY3:使在 Python 3 中运行部分测试成为可能(issue 776)
测试
从 py3-ignores 中移除不必要的行(issue 1243)
修复收集测试时 pytest 发出的剩余警告(issue 1206)
在 Travis 中添加文档构建步骤(issue 1234)
测试:不要从废弃模块中收集测试(issue 1165)
在测试中安装 service_identity 包以防止警告(issue 1168)
在测试中修复已废弃的设置 API(issue 1152)
为使用 POST 方法且未提供 body 的 webclient 添加测试(issue 1089)
py3-ignores.txt 支持注释(issue 1044)
现代化部分 assert 断言(issue 835)
selector.__repr__ 测试(issue 779)
代码重构
CSVFeedSpider 清理:使用 iterate_spider_output(issue 1079)
从 scrapy.utils.spider.iter_spider_output 中移除不必要的检查(issue 1078)
Pydispatch pep8 规范化(issue 992)
从 walk_modules() 中移除未使用的 'load=False' 参数(issue 871)
为了统一,在
SpiderState扩展中使用job_dir辅助方法(issue 805)将 "sflo" 本地变量重命名为更易懂的 "log_observer"(issue 775)
Scrapy 0.24.6 (2015-04-20)
在 PY2 下使用 unicode_escape 编码无效的 xpath(commit 07cb3e5)
修复 IPython shell 作用域问题并加载 IPython 用户配置(commit 2c8e573)
修复文档中的微小拼写错误(commit d694019)
修复微小拼写错误(commit f92fa83)
在“数据提取”章节中将 sel.xpath() 调用转换为 response.xpath()(commit c2c6d15)
Scrapy 0.24.5 (2015-02-25)
支持 Twisted 15.0.0 上新的 _getEndpoint Agent 签名(commit 540b9bc)
文档:修复了几处引用(commit b4c454b)
文档:修复了一处引用(commit e3c1260)
t.i.b.ThreadedResolver 现在是一个新式类 (new-style class)(commit 9e13f42)
S3DownloadHandler:修复了带有转义路径/查询参数请求的身份验证问题(commit cdb9a0b)
修正了 mailsender 文档中的变量类型(commit bb3a848)
重置 items_scraped 而非 item_count(commit edb07a4)
添加了关于贡献时应阅读哪些文档的提示信息(commit 7ee6f7a)
mitmproxy 0.10.1 也需要 netlib 0.10.1(commit 874fcdd)
固定使用 mitmproxy 0.10.1,因为 >0.11 版本无法通过测试(commit c6b21f0)
在本地测试 parse 命令,而非针对外部 URL(commit c3a6628)
打补丁修复了 HTTPDownloadHandler 关闭连接池时的 Twisted 问题(commit d0bf957)
更新了关于动态项目类的文档(commit eeb589a)
合并拉取请求 #943,来自 Lazar-T/patch-3(commit 5fdab02)
拼写错误(commit b0ae199)
Twisted 需要 pywin32。解决 #937(commit 5cb0cfb)
更新 install.rst(commit 781286b)
合并拉取请求 #928,来自 Lazar-T/patch-1(commit b415d04)
逗号误用为句号(commit 627b9ba)
合并拉取请求 #885,来自 jsma/patch-1(commit de909ad)
更新 request-response.rst(commit 3f3263d)
SgmlLinkExtractor - 修复了解析包含 Unicode 的 <area> 标签时的问题(commit 49b40f0)
Scrapy 0.24.4 (2014-08-09)
pem 文件由 mockserver 使用,且为 scrapy bench 所需(commit 5eddc68b63)
scrapy bench 需要 scrapy.tests*(commit d6cb999)
Scrapy 0.24.3 (2014-08-09)
没必要在 0.24 版本的 py3 环境上浪费 travis-ci 时间(commit 8e080c1)
更新安装文档(commit 1d0c096)
Scrapy 框架现在有了专门的 Trove 分类器!(commit 4c701d7)
更新其他提到 w3lib 版本的地方(commit d109c13)
将 w3lib 需求更新至 1.8.0(commit 39d2ce5)
使用 w3lib.html.replace_entities()(remove_entities() 已废弃)(commit 180d3ad)
设置 zip_safe=False(commit a51ee8b)
不发布 tests 模块 (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)
在 selectors 文档中增加了一些 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)
合并来自 roysc/patch-1 的 pull request #793 (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)
更新 Debian 包的 python 兼容版本设置 (commit fa5d76b)
文档:修复发行说明中的格式 (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)
清理 settings API - “每个爬虫独立的设置” GSoC 项目 的一部分 (issue 737)
Telnet 控制台现在默认绑定到 127.0.0.1 (issue 699)
在 lxml XPath 求值中禁用智能字符串 (smart strings) (issue 535)
恢复基于文件系统的缓存作为 http 缓存中间件的默认设置 (issue 541, issue 500, issue 571)
在 Scrapy shell 中暴露当前的 crawler 对象 (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)通用化文件管道 (file pipeline) 的日志消息 (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)
FormRequest 中 clickdata 的 nr 索引的测试和文档 (issue 646, issue 645)
允许像禁用其他组件一样禁用下载器处理器 (downloader handler) (issue 650)
当请求因重定向次数过多而被丢弃时记录日志 (issue 654)
使用来自 ppa 的最新 pypi 运行 pypy 测试 (issue 674)
使用 pytest 代替 trial 运行测试套件 (issue 679)
在 tox 环境中构建文档并检查死链 (issue 687)
在
url_is_from_any_domain()中支持不区分大小写的域名 (issue 693)移除项目和爬虫模板中的 pep8 警告 (issue 698)
request_fingerprint函数的测试和文档 (issue 597)更新 SEP-19 涉及的 GSoC 项目
per-spider settings(issue 705)当 contract 失败时将退出代码设置为非零 (issue 727)
增加一项设置以控制实例化哪个类作为下载器组件 (issue 738)
在
item_dropped信号中传递 response (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)
修复动态 itemclass 中 type() 的用法示例 (issue 603)
使用 lucasdemarchi/codespell 修复拼写错误 (issue 628)
修复 SgmlLinkExtractor 中 attrs 参数的默认值为元组 (issue 661)
修复站点地图读取器中的 XXE 漏洞 (issue 676)
修复引擎以支持过滤后的起始请求 (start requests) (issue 707)
修复 offsite 中间件在没有主机名的 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)
在合并 #485 后修复 HtmlParserLinkExtractor 及其测试 (commit 368a946)
BaseSgmlLinkExtractor:修复了链接含有内部标签时缺失空格的问题 (commit b566388)
BaseSgmlLinkExtractor:增加了对含有内部标签链接的单元测试 (commit c1cb418)
BaseSgmlLinkExtractor:修复了 unknown_endtag(),使其仅在结束标签与开始标签匹配时才设置 current_link=None (commit 7e4d627)
修复针对 Travis-CI 构建的测试 (commit 76c7e20)
将无法编码的码点替换为 html 实体。修复 #562 和 #285 (commit 5f87b17)
RegexLinkExtractor:在创建链接时编码 URL unicode 值 (commit d0ee545)
使用最新输出更新了教程的抓取输出。 (commit 8da65de)
更新了 shell 文档中的 crawler 引用,并修正了实际的 shell 输出。 (commit 875b9ab)
PEP8 少量编辑。 (commit f89efaf)
在 Scrapy shell 中暴露当前的 crawler。 (commit 5349cec)
移除未使用的 re 导入及 PEP8 少量编辑。 (commit 387f414)
使用 ItemLoader 时忽略 None 值。 (commit 0632546)
文档:修复了 HTTPCACHE_STORAGE 默认值中的拼写错误,现在是 Filesystem 而不是 Dbm。 (commit cde9a8c)
将 Ubuntu 安装说明显示为代码块 (commit fb5c9c5)
更新 Ubuntu 安装说明 (commit 70fb105)
合并来自 stray-leone/patch-1 的 pull request #550 (commit 6f70b6a)
修改 Scrapy Ubuntu 包的版本 (commit 725900d)
修正 0.22.0 发布日期 (commit af0219a)
修复 news.rst 中的拼写错误并移除 (not released yet) 标题 (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)
Selectors 默认注册 EXSLT 命名空间 (issue 472)
统一 item loaders,类似于 selectors 的重命名 (issue 461)
使
RFPDupeFilter类易于子类化 (issue 533)改进测试覆盖率并为即将到来的 Python 3 支持做准备 (issue 525)
将设置和中间件的启动信息提升到 INFO 级别 (issue 520)
允许通过 tox 运行单个测试 (issue 503)
更新链接提取器忽略的扩展名 (issue 498)
增加获取文件/图像/缩略图路径的中间件方法 (issue 490)
改进 offsite 中间件测试 (issue 478)
增加一种跳过由 RefererMiddleware 设置的默认 Referer 头的方法 (issue 475)
默认
Accept-Encoding头中不再发送x-gzip(issue 469)支持使用 settings 定义 http 错误处理 (issue 466)
在发现旧式代码的地方使用现代 Python 习惯用法 (issue 497)
改进并修正文档 (issue 527, issue 524, issue 521, issue 517, issue 512, issue 505, issue 502, issue 489, issue 465, issue 460, issue 425, issue 536)
修正
更新 CrawlSpider 模板中的 Selector 类导入 (issue 484)
修复对不存在的
engine.slots的引用 (issue 464)不要尝试在非 TextResponse 实例上调用
body_as_unicode()(issue 462)对 XPathItemLoader 进行子类化时发出警告,此前仅在实例化时警告。 (issue 523)
对 XPathSelector 进行子类化时发出警告,此前仅在实例化时警告。 (issue 537)
修复
FormRequest.from_response()中 URL 的覆盖问题 (issue 507)修复 pip 1.5 下的测试运行器 (issue 513)
修复爬虫名称为 unicode 时的日志记录错误 (issue 479)
Scrapy 0.20.2 (2013-12-09 发布)
针对 Selector 变化更新 CrawlSpider 模板 (commit 6d1457d)
修复教程中的方法名。关闭 GH-480 (commit b4fc359
Scrapy 0.20.1 (2013-11-28 发布)
从已发布的源码构建 wheels 需要 include_package_data (commit 5ba1ad5)
process_parallel 在其内部 deferreds 上泄露了失败。关闭 #458 (commit 419a780)
Scrapy 0.20.0 (2013-11-08 发布)
增强功能
Request/Response 的 url/body 属性现在是不可变的(修改它们在很早以前就被弃用了)
ITEM_PIPELINES现在定义为字典(而不是列表)站点地图爬虫可以抓取备选 URL (issue 360)
Selector.remove_namespaces()现在也会移除元素属性中的命名空间。 (issue 416)为 Python 3.3+ 铺平道路 (issue 435, issue 436, issue 431, issue 452)
使用原生 Python 类型并支持嵌套的新 item 导出器 (issue 366)
调整 HTTP1.1 连接池大小,使其与设置中定义的并发度匹配 (commit b43b5f575)
scrapy.mail.MailSender 现在可以通过 TLS 连接或使用 STARTTLS 升级连接 (issue 327)
从 ImagesPipeline 提取出功能的新 FilesPipeline (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 的回归问题 (issue 372)
修复 SIGINT 时的抓取关闭问题 (issue 450)
FormRequest.from_response 中不再提交
reset类型的输入 (commit b326b87)当请求 errback 抛出异常时,不要静默下载错误 (commit 684cfc0)
错误修复
修复 Django 1.6 下的测试 (commit b6bed44c)
针对使用 HTTP 1.1 下载处理器的断开连接重试中间件进行了大量错误修复
修复不同 Twisted 版本间的不一致性 (issue 406)
修复 setup.py 中无效的变量名 (issue 429)
修正教程引用 (issue 387)
改进 Request-Response 文档 (issue 391)
改进 Django 集成文档 (issue 404)
为
bindaddress请求 meta 编写文档 (commit 37c24e01d7)改进
Request类文档 (issue 226)
其他
致谢
感谢所有为本版本做出贡献的人!
贡献者名单(按提交数量排序)
69 Daniel Graña <dangra@...>
37 Pablo Hoffman <pablo@...>
13 Mikhail Korobov <kmike84@...>
9 Alex Cepoi <alex.cepoi@...>
9 alexanderlukanin13 <alexander.lukanin.13@...>
8 Rolando Espinoza La fuente <darkrho@...>
8 Lukasz Biedrycki <lukasz.biedrycki@...>
6 Nicolas Ramirez <nramirez.uy@...>
3 Paul Tremberth <paul.tremberth@...>
2 Martin Olveyra <molveyra@...>
2 Stefan <misc@...>
2 Rolando Espinoza <darkrho@...>
2 Loren Davie <loren@...>
2 irgmedeiros <irgmedeiros@...>
1 Stefan Koch <taikano@...>
1 Stefan <cct@...>
1 scraperdragon <dragon@...>
1 Kumara Tharmalingam <ktharmal@...>
1 Francesco Piccinno <stack.box@...>
1 Marcos Campal <duendex@...>
1 Dragon Dave <dragon@...>
1 Capi Etheriel <barraponto@...>
1 cacovsky <amarquesferraz@...>
1 Berend Iwema <berend@...>
Scrapy 0.18.4 (2013-10-10 发布)
IPython 拒绝更新命名空间。修复 #396 (commit 3d32c4f)
修复 shell 命令中替换请求时的 AlreadyCalledError。关闭 #407 (commit b1d8919)
修复
start_requests()的惰性以及过早挂起的问题 (commit 89faf52)
Scrapy 0.18.3 (2013-10-03 发布)
修复 start requests 惰性求值的回归问题 (commit 12693a5)
表单:不提交 reset 类型输入 (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 发布)
移除由拣选 (cherry pick) 的更改引入的额外导入 (commit d20304e)
修复 Twisted 11.0.0 之前的版本下的抓取测试 (commit 1994f38)
py26 无法格式化零长度字段 {} (commit abf756f)
测试未绑定响应上的 PotentiaDataLoss 错误 (commit b15470d)
将没有 content-length 或 Transfer-Encoding 的响应视为正常响应 (commit c4bf324)
如果未启用 http11 处理器,则不包含 ResponseFailed (commit 6cbe684)
新的 HTTP 客户端将连接丢失包装在 ResponseFailed 异常中。修复 #373 (commit 1a20bba)
限制 travis-ci 构建矩阵 (commit 3b01bb8)
合并来自 peterarenot/patch-1 的 pull request #375 (commit fa766d7)
修正使其指向正确的文件夹 (commit 3283809)
增加对 Ubuntu Quantal 和 Raring 版本的支持 (commit 1411923)
修复升级到 http1 客户端后重试中间件无法重试某些连接错误的问题,关闭 GH-373 (commit bb35ed0)
修复 Python 2.7.4 和 2.7.5 中的 XmlItemExporter (commit de3e451)
0.18 发行说明的少量更新 (commit c45e5f1)
修复贡献者列表格式 (commit 0b60031)
Scrapy 0.18.0 (2013-08-09 发布)
使用 Tox 运行测试套件的多项改进,包括在 pypi 上测试的方法
处理 AJAX 可抓取 URL 的 GET 参数 (commit 3fe2a32)
使用 lxml recover 选项解析站点地图 (issue 347)
修复 cookie 按主机名而非 netloc 合并的错误 (issue 352)
支持使用标志设置禁用
HttpCompressionMiddleware(issue 359)在
XMLFeedSpider中使用iternodes解析器支持 XML 命名空间 (issue 12)支持
dont_cache请求 meta 标志 (issue 19)修复因 Python 2.7.4 变化导致的
scrapy.utils.gz.gunzip损坏问题 (commit 4dc76e)修复
SgmlLinkExtractor的 URL 编码错误 (issue 24)修复
TakeFirst处理器不应丢弃零 (0) 值的错误 (issue 59)在 XML 导出器中支持嵌套 Item (issue 66)
改进 cookie 处理性能 (issue 77)
对重复过滤的请求仅记录一次日志 (issue 105)
将重定向中间件拆分为基于状态和基于 meta 的中间件 (issue 78)
在
FormRequest.from_response中支持 xpath 表单选择 (issue 185)修复
SgmlLinkExtractor的 unicode 解码错误 (issue 199)修复 pypi 解释器上的信号分发问题 (issue 205)
改进请求延迟和并发处理 (issue 206)
在
HttpCacheMiddleware中增加 RFC2616 缓存策略 (issue 212)允许自定义引擎记录的消息 (issue 214)
使用 setuptools 入口点扩展 Scrapy 命令 (issue 260)
允许将爬虫的
allowed_domains设置为 set 或元组 (issue 261)支持
settings.getdict(issue 269)简化内部
scrapy.core.scraper插槽 (slot) 处理 (issue 271)增加了
Item.copy(issue 290)回收空闲的下载器插槽 (issue 297)
增加
ftp://协议下载器处理器 (issue 329)增加了下载器基准测试 Web 服务器和爬虫工具 基准测试
将持久化(磁盘上)队列移至独立项目 (queuelib),Scrapy 现在依赖该项目
使用外部库增加 Scrapy 命令 (issue 260)
为
scrapy命令行工具增加--pdb选项增加了
XPathSelector.remove_namespaces,为了方便(使用不带命名空间的 XPath),允许从 XML 文档中移除所有命名空间。在 选择器 中有说明。对爬虫 contracts 的多项改进
名为 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: Error processing %(item)s” (commit c16150c)
整理并改进图像管道错误日志记录 (commit 56b45fc)
修复文档拼写错误 (commit 243be84)
增加文档主题:广度抓取和常用实践 (commit 1fbb715)
修复在未明确指定爬虫时 Scrapy parse 命令的错误。关闭 #209 (commit c72e682)
更新 docs/topics/commands.rst (commit 28eac7a)
Scrapy 0.16.3 (2012-12-07 发布)
移除使用下载延迟时的并发限制,并仍确保强制执行请求间延迟 (commit 487b9b5)
当图像管道失败时增加错误详情 (commit 8232569)
改进 macOS 兼容性 (commit 8dcf8aa)
setup.py:使用 README.rst 填充 long_description (commit 7b5310d)
文档:移除了对 ClientForm 已过时的引用 (commit 80f9bb6)
修正默认存储后端的文档 (commit 2aa491b)
文档:从 FAQ 中移除了失效的 proxyhub 链接 (commit bdf61c4)
修复了 SpiderOpenCloseLogging 示例中的文档拼写错误 (commit 7184094)
Scrapy 0.16.2 (2012-11-09 发布)
Scrapy contracts:兼容 python2.6 (commit a4a9199)
Scrapy contracts 详细 (verbose) 选项 (commit ec41673)
为 Scrapy contracts 提供类似单元测试的输出 (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)
在 news 中设置了 0.16.0 的发布日期 (commit e292246)
Scrapy 0.16.0 (2012-10-18 发布)
Scrapy 变化
增加了 爬虫 Contracts,一种以正式/可复现的方式测试爬虫的机制
为
runspider命令增加了-o和-t选项记录了 AutoThrottle 扩展 并将其加入默认安装的扩展中。你仍需要通过
AUTOTHROTTLE_ENABLED启用它重构了主要的统计收集:移除了全局/单个爬虫统计的分离,移除了统计相关的信号(
stats_spider_opened等)。现在统计更加简单,统计收集器 API 和信号保持了向后兼容性。为爬虫中间件增加了
process_start_requests()方法舍弃了 Signals 单例。现在应通过 Crawler.signals 属性访问信号。详见信号文档。
舍弃了统计收集器单例。现在可以通过 Crawler.stats 属性访问统计数据。详见统计收集文档。
记录了 核心 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 导出器现在完全支持嵌套 Item
增加了
cookiejar请求 meta 键,以支持每个爬虫多个 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设置,用于控制 referer 中间件将默认 User Agent 更改为:
Scrapy/版本号 (+https://scrapy.net.cn)从
scrapy.contrib.linkextractors.image中移除了(未公开的)HTMLImageLinkExtractor类移除了单个爬虫的设置(将被实例化多个 crawler 对象所取代)
USER_AGENT爬虫属性将不再起作用,请改用user_agent属性DOWNLOAD_TIMEOUT爬虫属性将不再起作用,请改用download_timeout属性移除了
ENCODING_ALIASES设置,因为编码自动检测已移至 w3lib 库将 DjangoItem 提升至主要 contrib
LogFormatter 方法现在返回字典(而不是字符串)以支持惰性格式化 (issue 164, commit dcef7b0)
下载器处理器 (
DOWNLOAD_HANDLERS设置) 现在接收 settings 作为__init__方法的第一个参数使用(更具移植性的)resource 模块替换了内存使用统计,移除了
scrapy.utils.memory模块移除了信号:
scrapy.mail.mail_sent移除了
TRACK_REFS设置,现在 trackrefs 总是启用的DBM 现在是 HTTP 缓存中间件的默认存储后端
日志消息数量(按级别)现在通过 Scrapy 统计进行跟踪(统计名称为:
log_count/级别)接收到的响应数量现在通过 Scrapy 统计进行跟踪(统计名称为:
response_received_count)移除了
scrapy.log.started属性
Scrapy 0.14.4
在支持的 Ubuntu 发行版中增加了 precise (commit b7e46df)
修复了在 https://groups.google.com/forum/#!topic/scrapy-users/qgVBmFybNAQ/discussion 中报告的 json-rpc webservice 错误。同时从 extras/scrapy-ws.py 中移除了不再支持的 ‘run’ 命令 (commit 340fbdb)
用于 content-type http equiv 的 meta 标签属性可以以任何顺序出现。#123 (commit 0cb68af)
将 “import Image” 替换为更标准的 “from PIL import Image”。关闭 #88 (commit 4d17048)
将 trial 状态作为 bin/runtests.sh 的退出值返回。#118 (commit b7b2e7f)
Scrapy 0.14.3
忘了包含 pydispatch 的许可证。#118 (commit fd85f9c)
在源码分发中包含测试套件使用的 egg 文件。#118 (commit c897793)
更新项目模板中的 docstring 以避免与 genspider 命令混淆,后者可能被视为高级功能。参考 #107 (commit 2548dcc)
在 docs/topics/firebug.rst 中增加了关于 google directory 关闭的说明 (commit 668e352)
当插槽 (slot) 为空时不要丢弃,而是保存在另一个字典中以便在需要时回收。 (commit 8e9f607)
在基于 libxml2 的选择器中处理 unicode xpath 时不再失败 (commit b830e95)
修复了 Request 对象文档中的微小错误 (commit bf3c9ee)
修复了链接提取器文档中的微小缺陷 (commit ba14f38)
移除了 Scrapy 中一些与 sqlite 支持相关的陈旧残余代码 (commit 0665175)
Scrapy 0.14.2
在计算校验和之前,将缓冲区指针移回文件开头。参考 #92 (commit 6a5bef2)
在持久化图像之前计算图像校验和。关闭 #92 (commit 9817df1)
移除缓存失败项中泄露的引用 (commit 673a120)
修复了 MemoryUsage 扩展中的错误:get_engine_status() 恰好需要 1 个参数(实际给出 0 个) (commit 11133e9)
修复了 http 压缩中间件上的 struct.error。关闭 #87 (commit 1423140)
ajax 抓取此前未对 unicode 网址进行扩展 (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)
修复了对 tutorial 目录的引用 (commit 4b86bd6)
doc: 移除了 Request.replace() 中重复的 callback 参数 (commit 1aeccdd)
修复了 scrapyd 文档的格式 (commit 8bf19e6)
为所有运行中的线程转储堆栈,并修复了 StackTraceDump 扩展转储的引擎状态 (commit 14a8e6e)
添加了关于为什么在 boto 图像上传时禁用 ssl 的注释 (commit 5223575)
当与 S3 建立过多并行连接时,SSL 握手会挂起 (commit 63d583d)
修改 tutorial 以跟随 dmoz 网站的变化 (commit bcb3198)
避免在 Twisted>=11.1.0 中出现 _disconnectedDeferred AttributeError 异常 (commit 98f3f87)
允许 spider 设置 autothrottle 最大并发数 (commit 175a4b5)
Scrapy 0.14
新功能和设置
支持 AJAX 可爬取 URL
新的持久化调度器,可在磁盘上存储请求,允许暂停和恢复爬取 (r2737)
为
scrapy crawl添加了-o选项,用于将爬取到的条目转储到文件(或使用-输出到标准输出)的快捷方式为 S3 下载处理器添加 boto 2.0 支持 (r2763)
在 request 的 errback 中,违规请求现在通过
failure.request属性接收 (r2738)- 对下载器进行了重大重构,以支持按域名/IP 的并发限制 (r2732)
CONCURRENT_REQUESTS_PER_SPIDER设置已被弃用,取而代之的是CONCURRENT_REQUESTS,CONCURRENT_REQUESTS_PER_DOMAIN,CONCURRENT_REQUESTS_PER_IP
详情请查看文档
增加了内置的缓存 DNS 解析器 (r2728)
将亚马逊 AWS 相关的组件/扩展(SQS spider 队列、SimpleDB 统计收集器)移动到了一个独立项目:[scaws](https://github.com/scrapinghub/scaws) (r2706, r2714)
将 spider 队列移动到 scrapyd:
scrapy.spiderqueue->scrapyd.spiderqueue(r2708)将 sqlite 工具移动到 scrapyd:
scrapy.utils.sqlite->scrapyd.sqlite(r2781)真正支持在
start_requests()方法中返回迭代器。现在迭代器在爬取过程中当 spider 变为空闲时被消耗 (r2704)增加了
REDIRECT_ENABLED设置,用于快速启用/禁用重定向中间件 (r2697)增加了
RETRY_ENABLED设置,用于快速启用/禁用重试中间件 (r2694)增加了
CloseSpider异常,用于手动关闭 spider (r2691)通过增加对 HTML5 meta charset 声明的支持,改进了编码检测 (r2690)
重构了关闭 spider 的行为,在关闭 spider 之前等待所有下载完成并由 spider 处理完毕 (r2688)
增加了
SitemapSpider(见 Spiders 页面的文档) (r2658)增加了
LogStats扩展,用于定期记录基本统计信息(如爬取的页面和抓取的条目) (r2657)使对 gzip 响应的处理更加健壮 (#319, r2643)。现在 Scrapy 将尝试从 gzip 响应中解压尽可能多的内容,而不是抛出
IOError失败。简化了 !MemoryDebugger 扩展,使用 stats 来转储内存调试信息 (r2639)
增加了编辑 spider 的新命令:
scrapy edit(r2636),以及在genspider命令中增加使用该功能的-e标志 (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 和链接提取器进行了多项改进
代码重排与移除
- 合并了条目通过 (item passed) 和条目抓取 (item scraped) 的概念,因为这两个概念在过去经常引起混淆。这意味着: (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 item 中对默认字段值的支持 (r2616)
移除了实验性的 crawlspider v2 (r2632)
移除了调度器中间件以简化架构。重复过滤器现在在调度器内部完成,使用与以前相同的重复过滤类(
DUPEFILTER_CLASS设置) (r2640)移除了向
scrapy crawl命令传递 URL 的支持(请改用scrapy parse) (r2704)移除了已弃用的执行队列 (Execution Queue) (r2704)
移除了(未记录的)spider 上下文扩展(来自 scrapy.contrib.spidercontext) (r2780)
移除了
CONCURRENT_SPIDERS设置(请改用 scrapyd maxproc) (r2789)重命名了核心组件的属性:downloader.sites -> downloader.slots, scraper.sites -> scraper.slots (r2717, r2718)
将设置
CLOSESPIDER_ITEMPASSED重命名为CLOSESPIDER_ITEMCOUNT(r2655)。保留了向后兼容性。
Scrapy 0.12
诸如 #NNN 之类的数字参考了旧问题跟踪器 (Trac) 中的工单,该跟踪器现已不再可用。
新功能和改进
通过的条目现在在
item_passed的item参数中发送 (#273)为
scrapy version命令增加了详细选项,对错误报告很有用 (#298)HTTP 缓存现在默认存储在项目数据目录中 (#279)
增加了项目数据存储目录 (#276, #277)
记录了 Scrapy 项目的文件结构(见命令行工具文档)
为 XPath 选择器增加了新的 lxml 后端 (#147)
每个 spider 的独立设置 (#245)
支持退出代码以在 Scrapy 命令中发出错误信号 (#248)
为
scrapy shell命令增加了-c参数使
libxml2成为可选 (#260)新的
deploy命令 (#261)增加了
CLOSESPIDER_PAGECOUNT设置 (#253)增加了
CLOSESPIDER_ERRORCOUNT设置 (#254)
Scrapyd 变化
Scrapyd 现在每个 spider 使用一个进程
它为每次 spider 运行存储一个日志文件,并循环保存它们,(默认情况下)每个 spider 保留最新的 5 个日志
增加了一个最小化的 Web UI,默认可在 https://:6800 访问
现在有一个
scrapy server命令来启动当前项目的 Scrapyd 服务器
设置的变化
增加了
HTTPCACHE_ENABLED设置(默认为 False)以启用 HTTP 缓存中间件更改了
HTTPCACHE_EXPIRATION_SECS的语义:现在零表示“永不过期”。
弃用/过时的功能
弃用
runserver命令,转而使用启动 Scrapyd 服务器的server命令。另请参阅:Scrapyd 变化弃用
queue命令,转而使用 Scrapydschedule.jsonAPI。另请参阅:Scrapyd 变化移除了 !LxmlItemLoader(从未晋升为主要 contrib 的实验性 contrib)
Scrapy 0.10
诸如 #NNN 之类的数字参考了旧问题跟踪器 (Trac) 中的工单,该跟踪器现已不再可用。
新功能和改进
新增名为
scrapyd的 Scrapy 服务,用于在生产环境中部署 Scrapy 爬虫 (#218)(已有文档)简化了 Images pipeline 的使用,现在不需要子类化你自己的 images pipeline 了 (#217)
Scrapy shell 现在默认显示 Scrapy 日志 (#206)
重构了执行队列为通用基代码和名为“spider 队列”的可插拔后端 (#220)
新增持久化 spider 队列(基于 SQLite) (#198),默认可用,允许以服务器模式启动 Scrapy,然后调度 spider 运行。
增加了 Scrapy 命令行工具及其所有可用子命令的文档。(已有文档)
具有可插拔后端的 Feed 导出器 (#197)(已有文档)
延迟信号 (Deferred signals) (#193)
为 item pipeline 增加了两个支持延迟的新方法 open_spider(), close_spider() (#195)
支持为每个 spider 覆盖默认请求头 (#181)
用功能相似但不依赖于 Twisted Plugins 的管理器替换了默认的 Spider Manager (#186)
将 Debian 软件包拆分为两个包——库和服务 (#187)
Scrapy 日志重构 (#188)
用于在不同运行之间保持持久 spider 上下文的新扩展 (#203)
增加了
dont_redirectrequest.meta 键以避免重定向 (#233)增加了
dont_retryrequest.meta 键以避免重试 (#234)
命令行工具变化
新的
scrapy命令取代了旧的scrapy-ctl.py(#199) - 现在只有一个全局的scrapy命令,而不是每个项目一个scrapy-ctl.py- 增加了用于在 Windows 下更方便运行的scrapy.bat脚本为命令行工具增加了 bash 补全支持 (#210)
将命令
start重命名为runserver(#209)
API 变化
Request 对象的
url和body属性现在是只读的 (#230)Request.copy()和Request.replace()现在也会复制它们的callback和errback属性 (#231)从
scrapy.contrib中移除了UrlFilterMiddleware(本就默认禁用)Offsite 中间件不再过滤来自没有 allowed_domains 属性的 spider 的任何请求 (#225)
移除了 Spider Manager 的
load()方法。现在 spider 在__init__方法本身中加载。- Scrapy Manager 的更改(现称为“Crawler”)
scrapy.core.manager.ScrapyManager类更名为scrapy.crawler.Crawlerscrapy.core.manager.scrapymanager单例移动到scrapy.project.crawler
移动了模块:
scrapy.contrib.spidermanager到scrapy.spidermanagerSpider Manager 单例从
scrapy.spider.spiders移动到scrapy.project.crawler单例的spiders属性下。- 移动了 Stats Collector 类:(#204)
scrapy.stats.collector.StatsCollector到scrapy.statscol.StatsCollectorscrapy.stats.collector.SimpledbStatsCollector到scrapy.contrib.statscol.SimpledbStatsCollector
默认的每条命令设置现在在命令对象类的
default_settings属性中指定 (#201)- 将 Item pipeline 的
process_item()方法参数从(spider, item)更改为(item, spider) 保留向后兼容性(带有弃用警告)
- 将 Item pipeline 的
- 将
scrapy.core.signals模块移动到scrapy.signals 保留向后兼容性(带有弃用警告)
- 将
- 将
scrapy.core.exceptions模块移动到scrapy.exceptions 保留向后兼容性(带有弃用警告)
- 将
为
BaseSpider增加了handles_request()类方法删除了
scrapy.log.exc()函数(请改用scrapy.log.err())删除了
scrapy.log.msg()函数的component参数删除了
scrapy.log.log_level属性为 Spider Manager 和 Item Pipeline Manager 增加了
from_settings()类方法
设置的变化
增加了
HTTPCACHE_IGNORE_SCHEMES设置,以在 !HttpCacheMiddleware 中忽略某些方案 (#225)增加了
SPIDER_QUEUE_CLASS设置,定义要使用的 spider 队列 (#220)增加了
KEEP_ALIVE设置 (#220)移除了
SERVICE_QUEUE设置 (#220)移除了
COMMANDS_SETTINGS_MODULE设置 (#201)将
REQUEST_HANDLERS重命名为DOWNLOAD_HANDLERS并将下载处理器设为类(而非函数)
Scrapy 0.9
诸如 #NNN 之类的数字参考了旧问题跟踪器 (Trac) 中的工单,该跟踪器现已不再可用。
新功能和改进
为 scrapy.mail 增加了 SMTP-AUTH 支持
增加了新设置:
MAIL_USER,MAIL_PASS(r2065 | #149)增加了新的 scrapy-ctl view 命令 - 以 Scrapy 的视角在浏览器中查看 URL (r2039)
增加了用于控制 Scrapy 进程的 Web 服务(这也弃用了 Web 控制台)。 (r2053 | #167)
支持将 Scrapy 作为服务运行,适用于生产系统 (r1988, r2054, r2055, r2056, r2057 | #168)
增加了 wrapper 引导库(目前仅在源代码中提供文档)。 (r2011)
增加了
LOG_ENCODING设置 (r1956,已有文档)增加了
RANDOMIZE_DOWNLOAD_DELAY设置(默认启用) (r1923,已有文档)MailSender不再是 IO 阻塞的 (r1955 | #146)Linkextractors 和新的 Crawlspider 现在可以处理相对基准标签 (base tag) URL (r1960 | #148)
对 Item Loader 和处理器进行了多项改进 (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)增加了用于供给 spider 抓取的
ExecutionQueue(r2034)移除了
ExecutionEngine单例 (r2039)移植了
S3ImagesStore(images pipeline) 以使用 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(r1838)移除了已弃用的
scrapy.xpath模块 - 请改用scrapy.selector。 (r1836)移除了已弃用的
core.signals.domain_open信号 - 请改用core.signals.domain_opened(r1822)log.msg()现在接收一个spider参数 (r1822)旧的 domain 参数已被弃用,并将在 0.9 中移除。对于 spider,你应该始终使用
spider参数并传递 spider 引用。如果你确实想传递字符串,请改用component参数。
更改了核心信号
domain_opened,domain_closed,domain_idle- 更改了 Item pipeline,以使用 spider 而非 domain
item pipeline 方法
process_item()的domain参数更改为spider,新签名为:process_item(spider, item)(r1827 | #105)为了快速移植你的代码(以适应 Scrapy 0.8),只需在以前使用
domain的地方使用spider.domain_name即可。
- 更改了 Stats API,以使用 spider 而非 domain (r1849 | #113)
StatsCollector更改为其方法(set_value,inc_value等)接收 spider 引用(而非 domain)。增加了
StatsCollector.iter_spider_stats()方法移除了
StatsCollector.list_domains()方法此外,统计信号已被重命名,现在传递 spider 引用(而非 domain)。以下是更改摘要
为了快速移植你的代码(以适应 Scrapy 0.8),只需在以前使用
domain的地方使用spider.domain_name即可。spider_stats包含与domain_stats完全相同的数据。
CloseDomain扩展移动到了scrapy.contrib.closespider.CloseSpider(r1833)- 其设置也被重命名
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 的第一个版本。