发行说明

Scrapy 2.12.0 (2024-11-18)

亮点 (Highlights)

修改后的需求

向后不兼容的更改

  • HTTPS 请求的用户定义 Cookie 将会设置 secure 标志为 True,除非显式地将其设置为 False。当这些 Cookie 在 HTTP 请求中重用时,例如在重定向到 HTTP URL 后,这一点很重要。(issue 6357)

  • 基于 Reppy 的 robots.txt 解析器,scrapy.robotstxt.ReppyRobotParser,已被移除,因为它不支持 Python 3.9+。(issue 5230, issue 6099, issue 6499)

  • scrapy.pipelines.media.MediaPipeline 及其子类的初始化 API 进行了改进,并且一些以前有效的用法场景可能不再有效。只有当您定义 MediaPipeline 的自定义子类或通过 from_settings()__init__() 调用而不是 from_crawler() 调用创建这些管道的实例时,才会影响您。

    以前,MediaPipeline.from_crawler() 会调用 from_settings() 方法(如果存在)或 __init__() 方法(否则),然后使用 crawler 实例进行一些额外的初始化。如果 from_settings() 方法存在(如 FilesPipeline 中),它会调用 __init__() 来创建实例。无法覆盖 from_crawler() 而无需从其中调用 MediaPipeline.from_crawler(),而这在某些情况下(包括 FilesPipeline 的子类)无法调用。

    现在,根据 from_crawler()from_settings() 的通用用法以及后者已被弃用,推荐的初始化顺序如下所示

    • 所有 __init__() 方法都应该接受一个 crawler 参数。如果它们也接受 settings 参数,则应忽略它,而使用 crawler.settings。当它们调用基类的 __init__() 时,也应将 crawler 参数传递给它。

    • 不应定义 from_settings() 方法。类特定的初始化代码应该放在覆盖的 from_crawler() 方法或 __init__() 中。

    • 现在可以覆盖 from_crawler(),并且如果遵循其他建议,则无需在其中调用 MediaPipeline.from_crawler()

    • 如果管道实例是使用 from_settings()__init__() 调用创建的(这在之前也不受支持,因为它错过了重要的初始化代码),则现在应使用 from_crawler() 调用创建它们。

    issue 6540

  • ImagesPipeline.convert_imageresponse_body 参数现在是仅位置参数,因为它已从可选更改为必填。 (issue 6500)

  • scrapy.utils.conf.build_component_list()convert 参数现在是仅位置参数,因为前面的参数 (custom) 已被移除。 (issue 6500)

  • scrapy.utils.conf.feed_process_params_from_cli()overwrite_output 参数现在是仅位置参数,因为前面的参数 (output_format) 已被移除。 (issue 6500)

弃用移除

  • 移除了 Scrapy 2.7.0 中弃用的 scrapy.utils.request.request_fingerprint() 函数。 (issue 6212issue 6213)

  • 移除了 Scrapy 2.7.0 中弃用的设置 REQUEST_FINGERPRINTER_IMPLEMENTATION 的值 "2.6" 的支持。 (issue 6212issue 6213)

  • RFPDupeFilter 子类现在需要在其 __init__ 方法中支持 fingerprinter 参数,该参数在 Scrapy 2.7.0 中引入。 (issue 6102issue 6113)

  • 移除了 Scrapy 2.7.0 中弃用的 scrapy.downloadermiddlewares.decompression 模块。 (issue 6100issue 6113)

  • 移除了 Scrapy 2.6.0 中弃用的 scrapy.utils.response.response_httprepr() 函数。 (issue 6111issue 6116)

  • 具有蜘蛛级 HTTP 身份验证的蜘蛛,即具有 http_userhttp_pass 属性的蜘蛛,现在也必须定义 http_auth_domain,该属性在 Scrapy 2.5.1 中引入。 (issue 6103issue 6113)

  • 媒体管道 方法 file_path()file_downloaded()get_images()image_downloaded()media_downloaded()media_to_download()thumb_path() 现在必须支持一个在 Scrapy 2.4.0 中添加的 item 参数。 (issue 6107issue 6113)

  • Feed 存储后端类__init__()from_crawler() 方法现在必须支持在 Scrapy 2.4.0 中引入的仅关键字 feed_options 参数。 (issue 6105issue 6113)

  • 移除了 Scrapy 2.3.0 中弃用的 scrapy.loader.commonscrapy.loader.processors 模块。 (issue 6106issue 6113)

  • 移除了 Scrapy 2.3.0 中弃用的 scrapy.utils.misc.extract_regex() 函数。 (issue 6106issue 6113)

  • 移除了 scrapy.http.JSONRequest 类,在 Scrapy 1.8.0 中替换为 JsonRequest。 (issue 6110issue 6113)

  • scrapy.utils.log.logformatter_adapter 不再支持缺少 argslevelmsg 参数,也不再支持 format 参数,所有这些情况都在 Scrapy 1.0.0 中被弃用。 (issue 6109issue 6116)

  • 分配给 SPIDER_LOADER_CLASS 设置的自定义类,如果未实现 ISpiderLoader 接口,现在将在运行时引发 zope.interface.verify.DoesNotImplement 异常。不符合规范的类从 Scrapy 1.0.0 开始就一直在触发弃用警告。 (issue 6101issue 6113)

  • 移除了 Scrapy 2.1.0 中弃用的 --output-format/-t 命令行选项。应改用 -O <URI>:<FORMAT>。 (issue 6500)

  • 在同一个 Crawler 实例上多次运行 crawl(),在 Scrapy 2.11.0 中弃用,现在会引发异常。 (issue 6500)

  • 在 Scrapy 2.5.0 中弃用,不允许在不为 __init__() 中的 crawler 参数提供支持并且没有自定义 from_crawler() 方法的情况下对 HttpCompressionMiddleware 进行子类化。 (issue 6500)

  • 移除了 Scrapy 2.10.0 中弃用的 RetryMiddlewareEXCEPTIONS_TO_RETRY 属性。 (issue 6500)

  • 移除了在未安装 boto3 包的情况下对 S3 Feed 导出 的支持,在 Scrapy 2.10.0 中弃用。 (issue 6500)

  • 移除了 Scrapy 2.10.0 中弃用的 scrapy.extensions.feedexport._FeedSlot 类。 (issue 6500)

  • 移除了 Scrapy 2.8.0 中弃用的 scrapy.pipelines.images.NoimagesDrop 异常。 (issue 6500)

  • ImagesPipeline.convert_imageresponse_body 参数现在是必需的,在 Scrapy 2.8.0 中弃用未传递它。 (issue 6500)

  • 移除了 Scrapy 2.10.0 中弃用的 scrapy.utils.conf.build_component_list()custom 参数。 (issue 6500)

  • 移除了 Scrapy 2.9.0 中弃用的 scrapy.utils.reactor.get_asyncio_event_loop_policy() 函数。请改用 asyncio.get_event_loop() 和相关的标准库函数。 (issue 6500)

弃用

  • 具有 Scrapy 组件from_settings() 方法现在已弃用。现在应改用 from_crawler()。受影响的组件

    issue 6540

  • 在第三方Scrapy组件中,现在不建议再使用from_settings()方法而没有from_crawler()方法。如果您不想重构代码,可以定义一个简单的from_crawler()方法,该方法调用cls.from_settings(crawler.settings)来解决此问题。请注意,如果您有from_crawler()方法,Scrapy将不会调用from_settings()方法,因此后者可以删除。(issue 6540

  • scrapy.pipelines.media.MediaPipeline及其子类的初始化API得到了改进,一些旧的使用场景现在已弃用(另请参阅“向后不兼容的更改”部分)。具体来说

    • 不建议定义不带crawler参数的__init__()方法。

    • 不建议在不传递crawler参数的情况下调用__init__()方法。如果传递了crawler参数,也不建议再传递settings参数,因为无论如何都会忽略它。

    • 调用from_settings()已弃用,请改用from_crawler()

    • 重写from_settings()已弃用,请改用重写from_crawler()

    issue 6540

  • REQUEST_FINGERPRINTER_IMPLEMENTATION设置现在已弃用。(issue 6212issue 6213

  • scrapy.utils.misc.create_instance()函数现在已弃用,请改用scrapy.utils.misc.build_from_crawler()。(issue 5523issue 5884issue 6162issue 6169issue 6540

  • scrapy.core.downloader.Downloader._get_slot_key()已弃用,请改用scrapy.core.downloader.Downloader.get_slot_key()。(issue 6340issue 6352

  • scrapy.utils.defer.process_chain_both()现在已弃用。(issue 6397

  • scrapy.twisted_version现在已弃用,您应该直接使用twisted.version(但请注意,它是一个incremental.Version对象,而不是元组)。(issue 6509issue 6512)

  • scrapy.utils.python.flatten()scrapy.utils.python.iflatten()现在已弃用。(issue 6517issue 6519

  • scrapy.utils.python.equal_attributes()现在已弃用。(issue 6517issue 6519

  • scrapy.utils.request.request_authenticate()现在已弃用,您应该直接设置Authorization标头。(issue 6517issue 6519

  • scrapy.utils.serialize.ScrapyJSONDecoder现在已弃用,自Scrapy 1.0.0以来它不包含任何代码。(issue 6517issue 6519

  • scrapy.utils.test.assert_samelines()现在已弃用。(issue 6517issue 6519

  • scrapy.extensions.feedexport.build_storage()现在已弃用。您可以直接调用构建器可调用对象。(issue 6540

新功能

改进

错误修复

  • MediaPipeline 现在是一个抽象类,其原本预期在子类中被重写的方法现在是抽象方法。(issue 6365issue 6368)

  • 修复了处理合同提取中无效的以 @ 开头的行的问题。(issue 6383issue 6388)

  • 导入 scrapy.extensions.telnet 不会再安装默认的 reactor。(issue 6432)

  • 降低了在 2.11.2 中提升的已丢弃请求的日志详细程度。(issue 6433issue 6475)

文档

质量保证

其他

Scrapy 2.11.2 (2024-05-14)

安全漏洞修复

错误修复

文档

质量保证

Scrapy 2.11.1 (2024-02-14)

亮点 (Highlights)

  • 安全漏洞修复。

  • 支持 Twisted >= 23.8.0。

  • 文档改进。

安全漏洞修复

修改后的需求

错误修复

文档

质量保证

Scrapy 2.11.0 (2023-09-18)

亮点 (Highlights)

向后不兼容的更改

已移除弃用功能

  • 移除了PythonItemExporter 的二进制导出模式,该模式在 Scrapy 1.1.0 中已弃用。(issue 6006issue 6007)

    注意

    如果在 Scrapy Cloud 上使用此 Scrapy 版本,且堆栈包含旧版本的 Scrapy,并收到“TypeError: Unexpected options: binary”错误,则可能需要将scrapinghub-entrypoint-scrapy >= 0.14.1 添加到项目的依赖项中,或切换到包含 Scrapy 2.11 的堆栈。

  • 移除了CrawlerRunner.spiders 属性,该属性在 Scrapy 1.0.0 中已弃用,请改用CrawlerRunner.spider_loader。(issue 6010)

  • 移除了scrapy.utils.response.response_httprepr() 函数,该函数在 Scrapy 2.6.0 中已弃用。(issue 6111)

弃用功能

新功能

错误修复

文档

质量保证

Scrapy 2.10.1 (2023-08-30)

标记 Twisted >= 23.8.0 为不支持版本。(issue 6024issue 6026

Scrapy 2.10.0 (2023-08-04)

亮点 (Highlights)

  • 添加了 Python 3.12 支持,放弃了 Python 3.7 支持。

  • 新的插件框架简化了支持该框架的第三方组件的配置。

  • 现在可以配置重试的异常。

  • 对 Feed 导出进行了许多修复和改进。

修改了依赖项

向后不兼容的更改

  • FEED_STORE_EMPTY 设置的值现在为 True 而不是 False。在早期的 Scrapy 版本中,即使此设置设置为 False,也会创建空文件(这是一个现在已修复的错误),因此新的默认值应保留旧的行为。(issue 872issue 5847

弃用移除

  • 当将函数分配给 FEED_URI_PARAMS 设置时,在 Scrapy 2.6 中弃用的返回 None 或修改 params 输入参数不再受支持。(issue 5994issue 5996

  • 在 Scrapy 2.6 中弃用的 scrapy.utils.reqser 模块已移除。(issue 5994issue 5996

  • 在 Scrapy 2.6 中弃用的 scrapy.squeuesPickleFifoDiskQueueNonRequestPickleLifoDiskQueueNonRequestMarshalFifoDiskQueueNonRequestMarshalLifoDiskQueueNonRequest 已移除。(issue 5994issue 5996

  • 在 Scrapy 2.6 中弃用的 scrapy.core.engine.ExecutionEngine 的属性 open_spiders 和方法 has_capacityschedule 已移除。(issue 5994issue 5998

  • 在 Scrapy 2.6 中弃用的将 spider 参数传递给 scrapy.core.engine.ExecutionEnginespider_is_idle()crawl()download() 方法不再受支持。(issue 5994issue 5998

弃用

  • scrapy.utils.datatypes.CaselessDict 已弃用,请改用 scrapy.utils.datatypes.CaseInsensitiveDict。(issue 5146

  • custom 参数传递给 scrapy.utils.conf.build_component_list() 已弃用,它过去用于合并 FOOFOO_BASE 设置值,但现在 Scrapy 使用 scrapy.settings.BaseSettings.getwithbase() 来执行相同的操作。使用此参数且无法切换到 getwithbase() 的代码可以切换到显式合并值。(issue 5726issue 5923

新特性

Bug 修复

文档

质量保证

  • 添加了对针对已安装的 Scrapy 版本运行测试的支持。(issue 4914issue 5949

  • 扩展了类型提示。(issue 5925issue 5977

  • 修复了 test_utils_asyncio.AsyncioTest.test_set_asyncio_event_loop 测试。(issue 5951

  • 修复了 Windows 上的 test_feedexport.BatchDeliveriesTest.test_batch_path_differ 测试。(issue 5847

  • 启用了 Windows 上 Python 3.11 的 CI 运行。(issue 5999

  • 简化了跳过依赖于 uvloop 的测试。(issue 5984

  • 修复了 extra-deps-pinned tox 环境。(issue 5948

  • 实现了清理工作。(issue 5965issue 5986

Scrapy 2.9.0 (2023-05-08)

亮点 (Highlights)

  • 每个域的下载设置。

  • 兼容新的 cryptography 和新的 parsel

  • 来自新版 parsel 的 JMESPath 选择器。

  • 错误修复。

弃用

  • scrapy.extensions.feedexport._FeedSlot 重命名为 scrapy.extensions.feedexport.FeedSlot,旧名称已弃用。(issue 5876

新特性

错误修复

文档

质量保证

Scrapy 2.8.0 (2023-02-02)

这是一个维护版本,包含一些小特性、错误修复和清理工作。

弃用移除

  • Scrapy 2.0 中已弃用的 scrapy.utils.gz.read1 函数现已移除。请改用 read1() 方法 GzipFile。(issue 5719

  • Scrapy 2.0 中已弃用的 scrapy.utils.python.to_native_str 函数现已移除。请改用 scrapy.utils.python.to_unicode()。(issue 5719

  • Scrapy 2.0 中已弃用的 scrapy.utils.python.MutableChain.next 方法现已移除。请使用 __next__() 代替。(issue 5719

  • Scrapy 2.0 中已弃用的 scrapy.linkextractors.FilteringLinkExtractor 类现已移除。请使用 LinkExtractor 代替。(issue 5720

  • Scrapy 2.0 中已弃用的使用以 SCRAPY_ 为前缀的环境变量覆盖设置的功能现已移除。(issue 5724

  • Scrapy 2.0 中已弃用的在代理 URL 中使用 noconnect 查询字符串参数的功能现已移除。我们预计以前需要此参数的代理在没有它的情况下也能正常工作。(issue 5731

  • Scrapy 2.3 中已弃用的 scrapy.utils.python.retry_on_eintr 函数现已移除。(issue 5719

  • Scrapy 2.4 中已弃用的 scrapy.utils.python.WeakKeyCache 类现已移除。(issue 5719

  • Scrapy 2.4 中已弃用的 scrapy.utils.boto.is_botocore() 函数现已移除。(issue 5719

弃用功能

新功能

错误修复

文档

质量保证

Scrapy 2.7.1 (2022-11-02)

新特性

  • 放宽了 2.6.2 中引入的限制,以便可以再次显式设置 Proxy-Authorization 标头,只要 proxy 元数据中的代理 URL 没有其他凭据,并且只要该代理 URL 保持不变;这恢复了与 scrapy-zyte-smartproxy 2.1.0 及更早版本 的兼容性(issue 5626)。

错误修复

  • 现在,将 -O/--overwrite-output-t/--output-format 选项一起使用会产生错误,而不是忽略前一个选项(issue 5516issue 5605)。

  • 替换了已弃用的 asyncio API,这些 API 隐式地使用当前事件循环,替换为显式地从事件循环策略请求循环的代码(issue 5685issue 5689)。

  • 修复了 Scrapy 本身中对已弃用 Scrapy API 的使用(issue 5588issue 5589)。

  • 修复了对已弃用 Pillow API 的使用(issue 5684issue 5692)。

  • 改进了检查生成器是否返回值的代码,以便它不再在装饰方法和部分方法上失败(issue 5323issue 5592issue 5599issue 5691)。

文档

质量保证

Scrapy 2.7.0 (2022-10-17)

亮点 (Highlights)

  • 添加了 Python 3.11 支持,放弃了 Python 3.6 支持

  • 改进了对 异步回调 的支持

  • Asyncio 支持 在新项目中默认启用

  • 项目字段的输出名称现在可以是任意字符串

  • 现在可以集中配置 请求指纹

修改了依赖项

现在需要 Python 3.7 或更高版本;已放弃对 Python 3.6 的支持。已添加对即将推出的 Python 3.11 的支持。

一些依赖项的最低要求版本也已更改

(issue 5512issue 5514issue 5524issue 5563issue 5664issue 5670issue 5678)

弃用

新特性

错误修复

文档

质量保证

Scrapy 2.6.3 (2022-09-27)

Scrapy 2.6.2 (2022-07-25)

安全漏洞修复

  • HttpProxyMiddleware 处理带有 proxy 元数据的请求,并且该 proxy 元数据包含代理凭据时,HttpProxyMiddleware 会设置 Proxy-Authorization header,但仅当该 header 未设置时。

    有一些第三方代理轮换下载中间件,会在每次处理请求时设置不同的proxy 元数据。

    由于请求重试和重定向,同一个请求可能会被下载中间件处理多次,包括HttpProxyMiddleware 和任何第三方代理轮换下载中间件。

    这些第三方代理轮换下载中间件可能会将请求的proxy 元数据更改为一个新值,但未能从proxy 元数据的先前值中删除Proxy-Authorization 头,从而导致一个代理的凭据被发送到另一个代理。

    为了防止意外泄露代理凭据,HttpProxyMiddleware 在处理请求时的行为现在如下所示

    • 如果正在处理的请求定义了包含凭据的proxy 元数据,则Proxy-Authorization 头将始终更新为包含这些凭据。

    • 如果正在处理的请求定义了不包含凭据的proxy 元数据,则Proxy-Authorization 头将被删除,*除非*它最初是为同一个代理 URL 定义的。

      要删除代理凭据同时保留相同的代理 URL,请删除Proxy-Authorization 头。

    • 如果请求没有proxy 元数据,或者该元数据是假值(例如None),则Proxy-Authorization 头将被删除。

      现在无法再通过proxy 元数据设置代理 URL,但通过Proxy-Authorization 头设置凭据。请改为通过proxy 元数据设置代理凭据。

还修复了 2.6.0 中引入的以下回归

Scrapy 2.6.1 (2022-03-01)

修复了 2.6.0 中引入的一个回归,该回归会在跟随重定向时取消设置请求方法。

Scrapy 2.6.0 (2022-03-01)

亮点 (Highlights)

安全漏洞修复

  • 当定义了 Cookie 的Request 对象收到重定向响应,导致计划创建新的Request 对象时,原始Request 对象中定义的 Cookie 将不再复制到新的Request 对象中。

    如果您在Request 对象上手动设置了Cookie 头,并且重定向 URL 的域名与原始Request 对象的 URL 域名不完全匹配,则您的Cookie 头现在将从新的Request 对象中删除。

    旧的行为可能被攻击者利用来访问您的 Cookie。请参阅cjvr-mfj7-j4j8 安全公告以获取更多信息。

    注意

    仍然可以通过在定义 Cookie 时将共享的域名后缀(例如example.com)定义为 Cookie 域名来启用不同域名之间共享 Cookie 的功能(例如example.com 和任何子域名)。请参阅Request 类的文档以获取更多信息。

  • 当 Cookie 的域名(在响应的Set-Cookie 头中接收或在Request 对象中定义)设置为公共后缀时,现在将忽略该 Cookie,除非 Cookie 域名与请求域名相同。

    旧的行为可能被攻击者利用,将来自受控域名的 Cookie 注入到您的 CookieJar 中,这些 Cookie 可能会发送到不受攻击者控制的其他域名。请参阅mfjm-vh54-3f96 安全公告以获取更多信息。

修改后的依赖项

向后不兼容的更改

  • FormRequestformdata 参数,如果为非 POST 请求指定,现在将覆盖 URL 查询字符串,而不是附加到它。(issue 2919issue 3579

  • 当将函数分配给FEED_URI_PARAMS 设置时,现在该函数的返回值(而不是params 输入参数)将决定 Feed URI 参数,除非该返回值为None。(issue 4962issue 4966

  • scrapy.core.engine.ExecutionEngine 中,方法crawl()download()schedule()spider_is_idle() 现在会在open_spider() 之前调用时引发RuntimeError。(issue 5090

    这些方法过去假设ExecutionEngine.slot 已由先前对open_spider() 的调用定义,因此它们改为引发AttributeError

  • 如果配置的调度器的API不符合预期,现在会在启动时引发TypeError。之前,其他异常会在运行时引发。(issue 3559

  • 序列化后的Request对象的_encoding字段现在命名为encoding,与所有其他字段保持一致。(issue 5130

移除弃用功能

  • Scrapy 2.2中已弃用的scrapy.http.TextResponse.body_as_unicode现已移除。(issue 5393

  • Scrapy 2.2中已弃用的scrapy.item.BaseItem现已移除。(issue 5398

  • Scrapy 1.8中已弃用的scrapy.item.DictItem现已移除。(issue 5398

  • Scrapy 1.4中已弃用的scrapy.Spider.make_requests_from_url现已移除。(issue 4178issue 4356

弃用功能

  • 当一个函数被赋值给FEED_URI_PARAMS设置时,返回None或修改params输入参数现在已被弃用。请改为返回一个新的字典。(issue 4962issue 4966

  • scrapy.utils.reqser已弃用。(issue 5130

  • scrapy.squeues中,以下队列类已弃用:PickleFifoDiskQueueNonRequestPickleLifoDiskQueueNonRequestMarshalFifoDiskQueueNonRequestMarshalLifoDiskQueueNonRequest。您应该改为使用:PickleFifoDiskQueuePickleLifoDiskQueueMarshalFifoDiskQueueMarshalLifoDiskQueue。(issue 5117

  • scrapy.core.engine.ExecutionEngine中许多来自该类可以同时处理多个Spider对象时的方面已被弃用。(issue 5090

    • has_capacity()方法已弃用。

    • schedule()方法已弃用,请改为使用crawl()download()

    • open_spiders属性已弃用,请改为使用spider

    • 以下方法的spider参数已弃用

      • spider_is_idle()

      • crawl()

      • download()

      请先调用open_spider()来设置Spider对象。

  • scrapy.utils.response.response_httprepr()现已弃用。(issue 4972

新功能

错误修复

文档

质量保证

Scrapy 2.5.1 (2021-10-05)

  • 安全漏洞修复

    如果您使用 HttpAuthMiddleware(即 http_userhttp_pass 爬虫属性)进行 HTTP 身份验证,任何请求都会将您的凭据暴露给请求目标。

    为了防止意外地将身份验证凭据暴露给意外的域名,您现在必须另外设置一个新的爬虫属性 http_auth_domain,并将其指向必须发送身份验证凭据的特定域名。

    如果未设置 http_auth_domain 爬虫属性,则第一个请求的域名将被视为 HTTP 身份验证目标,并且仅在目标为该域名的请求中发送身份验证凭据。

    如果您需要将相同的 HTTP 身份验证凭据发送到多个域名,则可以使用 w3lib.http.basic_auth_header() 来设置请求的 Authorization 标头的值。

    如果您 *确实* 希望您的爬虫将相同的 HTTP 身份验证凭据发送到任何域名,请将 http_auth_domain 爬虫属性设置为 None

    最后,如果您是 scrapy-splash 的用户,请注意,此版本的 Scrapy 与 scrapy-splash 0.7.2 及更早版本不兼容。您需要将 scrapy-splash 升级到更高版本才能继续使用。

Scrapy 2.5.0 (2021-04-06)

亮点 (Highlights)

移除弃用功能

弃用功能

  • scrapy.utils.py36 模块现已弃用,建议使用 scrapy.utils.asyncgen。(issue 4900

新功能

错误修复

文档

质量保证

Scrapy 2.4.1 (2020-11-17)

Scrapy 2.4.0 (2020-10-11)

亮点 (Highlights)

  • 已放弃 Python 3.5 支持。

  • 现在,媒体管道file_path 方法可以访问源 Item

    这允许您根据 Item 数据设置下载文件路径。

  • 现在,FEEDS 设置的新 item_export_kwargs 键允许定义要传递给 Item 导出器类 的关键字参数。

  • 您现在可以选择 Feed 导出 是覆盖还是追加到输出文件。

    例如,当使用 crawlrunspider 命令时,您可以使用 -O 选项代替 -o 来覆盖输出文件。

  • 如果安装了 zstandard,则现在支持 Zstd 压缩的响应。

  • 在设置中,如果需要类的导入路径,现在可以传递类对象。

修改后的要求

向后不兼容的更改

  • CookiesMiddleware 再次丢弃在 Request.headers 中定义的 Cookie。

    我们决定撤回在 Scrapy 2.2.0 中引入的此错误修复,因为据报道,当前的实现可能会破坏现有代码。

    如果需要为请求设置 Cookie,请使用 Request.cookies 参数。

    Scrapy 的未来版本将包含此撤回的错误修复的新、更好的实现。

    (issue 4717issue 4823)

弃用移除

  • scrapy.extensions.feedexport.S3FeedStorage 在未将其传递给其 __init__ 方法时,不再读取运行项目设置中 access_keysecret_key 的值;您必须将这些参数传递给其 __init__ 方法或使用 S3FeedStorage.from_crawler (issue 4356issue 4411issue 4688)

  • Rule.process_request 不再允许期望单个 request 参数的可调用对象,而不是 requestresponse 两个参数 (issue 4818)

弃用

新特性

错误修复

文档

质量保证

Scrapy 2.3.0 (2020-08-04)

亮点 (Highlights)

  • 馈送导出 现在支持 Google Cloud Storage 作为存储后端。

  • 新的 FEED_EXPORT_BATCH_ITEM_COUNT 设置允许以最多指定数量的项目的批次交付输出项目。

    它也作为 延迟文件交付 的解决方法,当使用某些存储后端(S3FTP,以及现在的 GCS)时,它会导致 Scrapy 仅在爬取完成后才开始项目交付。

  • Item Loader 的基础实现已移动到一个单独的库中,itemloaders,允许从 Scrapy 外部使用,并拥有独立的发布计划。

弃用移除

  • scrapy.linkextractors 中删除了以下类及其父模块

    • htmlparser.HtmlParserLinkExtractor

    • regex.RegexLinkExtractor

    • sgml.BaseSgmlLinkExtractor

    • sgml.SgmlLinkExtractor

    请改用 LinkExtractorissue 4356issue 4679

弃用

  • scrapy.utils.python.retry_on_eintr 函数现已弃用(issue 4683

新功能

错误修复

文档

质量保证

  • Item Loader 的基础实现已移动到 itemloadersissue 4005issue 4516

  • 修复了一些调度程序测试中静默的错误(issue 4644issue 4645

  • 更新了用于 SSL 测试的本地主机证书(issue 4650

  • 删除了特定于 Python 2 的 Cookie 处理代码(issue 4682

  • 停止使用 Python 2 的 Unicode 字面量语法(issue 4704

  • 停止使用反斜杠进行续行(issue 4673

  • 从 MyPy 异常列表中删除了不需要的条目(issue 4690

  • 自动化测试现在作为我们持续集成系统的一部分在 Windows 上通过(issue 4458

  • 自动化测试现在在我们的持续集成系统中针对受支持的 Python 版本的最新 PyPy 版本通过(issue 4504

Scrapy 2.2.1 (2020-07-17)

Scrapy 2.2.0 (2020-06-24)

亮点 (Highlights)

向后不兼容的更改

  • 已停止支持 Python 3.5.0 和 3.5.1;Scrapy 现在拒绝在低于 3.5.2 的 Python 版本上运行,因为 3.5.2 引入了 typing.Typeissue 4615

弃用

新功能

错误修复

文档

质量保证

Scrapy 2.1.0 (2020-04-24)

亮点 (Highlights)

向后不兼容的更改

  • assert 语句触发的 AssertionError 异常已被新的异常类型替换,以支持在优化模式下运行 Python(参见 -O),而不会以任何意外的方式更改 Scrapy 的行为。

    如果您的代码捕获了来自 Scrapy 的 AssertionError 异常,请更新您的代码以捕获相应的新的异常。

    (issue 4440)

弃用移除

  • 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)

  • MultiValueDictMultiValueDictKeyErrorSiteNode 类已从 scrapy.utils.datatypes 中移除 (issue 4400)

弃用

新特性

错误修复

  • 请求序列化 对于作为蜘蛛属性并被分配了不同名称的函数的回调不再中断 (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)

文档

质量保证

Scrapy 2.0.1 (2020-03-18)

Scrapy 2.0.0 (2020-03-03)

亮点 (Highlights)

向后不兼容的更改

弃用移除

  • Scrapy shell 不再提供 sel 代理对象,请改用 response.selectorissue 4347

  • 已删除 LevelDB 支持(issue 4112

  • 已从 scrapy.utils.python 中删除了以下函数:isbinarytextis_writablesetattr_defaultstringify_dictissue 4362

弃用

新功能

错误修复

文档

质量保证

调度程序队列类的更改

以下更改可能会影响所有类型的自定义队列类

  • push方法不再接收包含request.priority * -1的第二个位置参数。如果您需要该值,请改为从第一个位置参数request中获取,或者使用scrapy.core.scheduler.ScrapyPriorityQueue子类中的新priority()方法。

以下更改可能会影响自定义优先级队列类

  • __init__方法或from_crawlerfrom_settings类方法中

    • 以前包含工厂函数qfactory的参数现在作为名为downstream_queue_cls的关键字参数传递。

    • 添加了一个新的关键字参数:key。它是一个字符串,对于内存队列始终为空字符串,并且指示磁盘队列的JOB_DIR值。

    • 磁盘队列的参数,其中包含来自先前爬取的数据,startpriosslot_startprios,现在作为名为startprios的关键字参数传递。

    • serialize参数不再传递。磁盘队列类必须在写入磁盘之前自行处理请求序列化,使用scrapy.utils.reqser模块中的request_to_dict()request_from_dict()函数。

以下更改可能会影响自定义磁盘和内存队列类

  • __init__方法的签名现在为__init__(self, crawler, key)

以下更改专门影响scrapy.core.scheduler中的ScrapyPriorityQueueDownloaderAwarePriorityQueue类,并且可能会影响子类

  • __init__方法中,上面描述的大多数更改都适用。

    __init__可能仍然接收所有参数作为位置参数,但是

    • 替换qfactorydownstream_queue_cls必须以不同的方式实例化。

      qfactory是用优先级值(整数)实例化的。

      downstream_queue_cls的实例应该使用新的ScrapyPriorityQueue.qfactoryDownloaderAwarePriorityQueue.pqfactory方法创建。

    • 新的key参数将startprios参数向右移动了1个位置。

  • 添加了以下类属性

    • crawler

    • downstream_queue_cls(以上详细信息)

    • key(以上详细信息)

  • serialize属性已被删除(以上详细信息)

以下更改专门影响ScrapyPriorityQueue类,并且可能会影响子类

  • 添加了一个新的priority()方法,该方法在给定请求的情况下返回request.priority * -1

    它在push()中使用,以弥补其priority参数的移除。

  • spider属性已被删除。请改用crawler.spider

以下更改专门影响DownloaderAwarePriorityQueue类,并且可能会影响子类

  • 新的pqueues属性提供了下载器插槽名称到相应downstream_queue_cls实例的映射。

issue 3884

Scrapy 1.8.4 (2024-02-14)

安全漏洞修复 (Security bug fixes)

Scrapy 1.8.3 (2022-07-25)

安全漏洞修复

  • HttpProxyMiddleware 处理带有 proxy 元数据的请求,并且该 proxy 元数据包含代理凭据时,HttpProxyMiddleware 会设置 Proxy-Authorization header,但仅当该 header 未设置时。

    有一些第三方代理轮换下载中间件,会在每次处理请求时设置不同的proxy 元数据。

    由于请求重试和重定向,同一个请求可能会被下载中间件处理多次,包括HttpProxyMiddleware 和任何第三方代理轮换下载中间件。

    这些第三方代理轮换下载中间件可能会将请求的proxy 元数据更改为一个新值,但未能从proxy 元数据的先前值中删除Proxy-Authorization 头,从而导致一个代理的凭据被发送到另一个代理。

    为了防止意外泄露代理凭据,HttpProxyMiddleware 在处理请求时的行为现在如下所示

    • 如果正在处理的请求定义了包含凭据的proxy 元数据,则Proxy-Authorization 头将始终更新为包含这些凭据。

    • 如果正在处理的请求定义了不包含凭据的proxy 元数据,则Proxy-Authorization 头将被删除,*除非*它最初是为同一个代理 URL 定义的。

      要删除代理凭据同时保留相同的代理 URL,请删除Proxy-Authorization 头。

    • 如果请求没有proxy 元数据,或者该元数据是假值(例如None),则Proxy-Authorization 头将被删除。

      现在无法再通过proxy 元数据设置代理 URL,但通过Proxy-Authorization 头设置凭据。请改为通过proxy 元数据设置代理凭据。

Scrapy 1.8.2 (2022-03-01)

安全漏洞修复 (Security bug fixes)

  • 当定义了 Cookie 的Request 对象收到重定向响应,导致计划创建新的Request 对象时,原始Request 对象中定义的 Cookie 将不再复制到新的Request 对象中。

    如果您在Request 对象上手动设置了Cookie 头,并且重定向 URL 的域名与原始Request 对象的 URL 域名不完全匹配,则您的Cookie 头现在将从新的Request 对象中删除。

    旧的行为可能被攻击者利用来访问您的 Cookie。请参阅cjvr-mfj7-j4j8 安全公告以获取更多信息。

    注意

    仍然可以通过在定义 Cookie 时将共享的域名后缀(例如example.com)定义为 Cookie 域名来启用不同域名之间共享 Cookie 的功能(例如example.com 和任何子域名)。请参阅Request 类的文档以获取更多信息。

  • 当 Cookie 的域名(在响应的Set-Cookie 头中接收或在Request 对象中定义)设置为公共后缀时,现在将忽略该 Cookie,除非 Cookie 域名与请求域名相同。

    旧的行为可能被攻击者利用,将 cookie 注入到您对其他域的一些请求中。请参阅mfjm-vh54-3f96 安全公告以获取更多信息。

Scrapy 1.8.1 (2021-10-05)

  • 安全漏洞修复

    如果您使用 HttpAuthMiddleware(即 http_userhttp_pass 爬虫属性)进行 HTTP 身份验证,任何请求都会将您的凭据暴露给请求目标。

    为了防止意外地将身份验证凭据暴露给意外的域名,您现在必须另外设置一个新的爬虫属性 http_auth_domain,并将其指向必须发送身份验证凭据的特定域名。

    如果未设置 http_auth_domain 爬虫属性,则第一个请求的域名将被视为 HTTP 身份验证目标,并且仅在目标为该域名的请求中发送身份验证凭据。

    如果您需要将相同的 HTTP 身份验证凭据发送到多个域名,则可以使用 w3lib.http.basic_auth_header() 来设置请求的 Authorization 标头的值。

    如果您 *确实* 希望您的爬虫将相同的 HTTP 身份验证凭据发送到任何域名,请将 http_auth_domain 爬虫属性设置为 None

    最后,如果您是 scrapy-splash 的用户,请注意,此版本的 Scrapy 与 scrapy-splash 0.7.2 及更早版本不兼容。您需要将 scrapy-splash 升级到更高版本才能继续使用。

Scrapy 1.8.0 (2019-10-28)

亮点 (Highlights)

向后不兼容的更改

另请参阅下面弃用移除

新特性

错误修复

文档

弃用移除

弃用

其他更改

Scrapy 1.7.4 (2019-10-21)

回退了针对 issue 3804 的修复 (issue 3819),该修复有一些不希望出现的副作用 (issue 3897, issue 3976).

因此,当使用项目初始化项目加载器时,ItemLoader.load_item() 再次使后续对 ItemLoader.get_output_value()ItemLoader.load_item() 的调用返回空数据。

Scrapy 1.7.3 (2019-08-01)

对于 Python 3.4,强制使用 lxml 4.3.5 或更低版本 (issue 3912, issue 3918).

Scrapy 1.7.2 (2019-07-23)

修复 Python 2 支持 (issue 3889, issue 3893, issue 3896).

Scrapy 1.7.1 (2019-07-18)

重新打包 Scrapy 1.7.0,PyPI 中缺少一些更改。

Scrapy 1.7.0 (2019-07-18)

注意

确保安装 Scrapy 1.7.1。PyPI 中的 Scrapy 1.7.0 包是由于错误的提交标记导致的,不包含下面描述的所有更改。

亮点 (Highlights)

  • 针对多个域进行爬取的改进

  • 一种更简洁的方法来将参数传递给回调函数

  • 一个用于 JSON 请求的新类

  • 基于规则的蜘蛛的改进

  • 供稿导出的新功能

向后不兼容的更改

  • 429 现在默认情况下是 RETRY_HTTP_CODES 设置的一部分

    此更改 **向后不兼容**。如果您不想重试 429,则必须相应地覆盖 RETRY_HTTP_CODES

  • CrawlerCrawlerRunner.crawlCrawlerRunner.create_crawler 不再接受 Spider 子类实例,它们现在只接受 Spider 子类。

    Spider 子类实例从未打算使用,并且它们的工作方式并非人们期望的那样:它们没有使用传递的 Spider 子类实例,而是调用了它们的 from_crawler 方法来生成一个新实例。

  • SCHEDULER_PRIORITY_QUEUE 设置的非默认值可能会停止工作。调度程序优先级队列类现在需要处理 Request 对象,而不是任意 Python 数据结构。

  • Scheduler 类的 __init__ 方法中添加了一个额外的 crawler 参数。由于此更改,自定义调度程序子类(在其 __init__ 方法中不接受任意参数)可能会出现问题。

    有关更多信息,请参见 SCHEDULER

另请参见下面 弃用移除

新功能

错误修复

文档

移除弃用功能

以下已弃用的 API 已被移除 (issue 3578)

  • scrapy.conf (使用 Crawler.settings)

  • 来自 scrapy.core.downloader.handlers

    • http.HttpDownloadHandler (使用 http10.HTTP10DownloadHandler)

  • scrapy.loader.ItemLoader._get_values (使用 _get_xpathvalues)

  • scrapy.loader.XPathItemLoader (使用 ItemLoader)

  • scrapy.log (参见 日志记录)

  • 来自 scrapy.pipelines

    • files.FilesPipeline.file_key (使用 file_path)

    • images.ImagesPipeline.file_key (使用 file_path)

    • images.ImagesPipeline.image_key (使用 file_path)

    • images.ImagesPipeline.thumb_key (使用 thumb_path)

  • 来自 scrapy.selectorscrapy.selector.lxmlsel

  • 来自 scrapy.selector.csstranslator

  • 来自 Selector

    • _root__init__ 方法的参数和对象属性都使用 root

    • extract_unquoted(使用 getall

    • select(使用 xpath

  • 来自 SelectorList

    • extract_unquoted(使用 getall

    • select(使用 xpath

    • x(使用 xpath

  • scrapy.spiders.BaseSpider(使用 Spider

  • 来自 Spider(及其子类)

    • DOWNLOAD_DELAY(使用 download_delay

    • set_crawler(使用 from_crawler()

  • scrapy.spiders.spiders(使用 SpiderLoader

  • scrapy.telnet(使用 scrapy.extensions.telnet

  • 来自 scrapy.utils.python

    • str_to_unicode(使用 to_unicode

    • unicode_to_str(使用 to_bytes

  • scrapy.utils.response.body_or_str

以下已弃用的设置也已移除(issue 3578

弃用功能

  • SCHEDULER_PRIORITY_QUEUE 设置的 queuelib.PriorityQueue 值已弃用。请改用 scrapy.pqueues.ScrapyPriorityQueue

  • 传递给 Ruleprocess_request 回调函数,如果未接受两个参数,则已弃用。

  • 以下模块已弃用

  • 对于 Python 3 代码库,scrapy.utils.datatypes.MergeDict 类已弃用。请改用 ChainMap。(issue 3878

  • scrapy.utils.gz.is_gzipped 函数已弃用。请改用 scrapy.utils.gz.gzip_magic_number

其他更改

Scrapy 1.6.0 (2019-01-30)

亮点 (Highlights)

  • 更好的 Windows 支持;

  • Python 3.7 兼容性;

  • 大幅改进文档,包括将 .extract_first() + .extract() API 更改为 .get() + .getall() API;

  • 改进馈送导出、FilePipeline 和 MediaPipeline;

  • 更好的可扩展性:item_errorrequest_reached_downloader 信号;馈送导出器、馈送存储和重复过滤器都支持 from_crawler

  • scrapy.contracts 修复和新功能;

  • Telnet 控制台安全改进,首次作为 Scrapy 1.5.2 (2019-01-22) 中的反向移植发布;

  • 清理已弃用的代码;

  • 整个代码库中各种错误修复、小型新功能和可用性改进。

Selector API 更改

虽然这些不是 Scrapy 本身的更改,而是 Scrapy 用于 xpath/css 选择器的 parsel 库中的更改,但这些更改值得在这里提及。Scrapy 现在依赖于 parsel >= 1.5,并且 Scrapy 文档已更新为遵循最新的 parsel API 约定。

最明显的更改是现在更推荐使用 .get().getall() 选择器方法,而不是 .extract_first().extract()。我们认为这些新方法可以使代码更简洁易读。请参阅 extract() 和 extract_first() 以了解更多详细信息。

注意

目前**没有计划**弃用 .extract().extract_first() 方法。

另一个有用的新功能是引入了 Selector.attribSelectorList.attrib 属性,这使得获取 HTML 元素的属性变得更加容易。请参阅 选择元素属性

在 parsel >= 1.5 中,CSS 选择器会被缓存,这使得在多次使用相同的 CSS 路径时速度更快。这在 Scrapy 爬虫中非常常见:回调通常会在不同的页面上被多次调用。

如果您正在使用自定义的 SelectorSelectorList 子类,parsel 中的一个**向后不兼容**的更改可能会影响您的代码。请参阅 parsel 变更日志 以获取详细说明以及完整的改进列表。

Telnet 控制台

**向后不兼容**: Scrapy 的 telnet 控制台现在需要用户名和密码。请参阅 Telnet 控制台 以获取更多详细信息。此更改修复了一个**安全问题**;请参阅 Scrapy 1.5.2 (2019-01-22) 发行说明以获取详细信息。

新的扩展功能

  • from_crawler 支持已添加到 Feed 导出器和 Feed 存储中。除其他事项外,这允许从自定义 Feed 存储和导出器访问 Scrapy 设置 (issue 1605issue 3348)。

  • from_crawler 支持已添加到重复过滤器中 (issue 2956);这允许例如从重复过滤器访问设置或蜘蛛。

  • item_error 当管道中发生错误时触发 (issue 3256);

  • request_reached_downloader 当下载器获取新的请求时触发;此信号可用于自定义调度程序 (issue 3393)。

  • 新的 SitemapSpider sitemap_filter() 方法,允许根据 SitemapSpider 子类中站点的属性选择站点条目 (issue 3512)。

  • 下载器处理程序的延迟加载现在是可选的;这使得在自定义下载器处理程序中能够更好地处理初始化错误 (issue 3394)。

新的 FilePipeline 和 MediaPipeline 功能

scrapy.contracts 改进

  • 合同代码中的异常处理得更好 (issue 3377);

  • dont_filter=True 用于合同请求,这允许使用相同 URL 测试不同的回调 (issue 3381);

  • 合同子类中的 request_cls 属性允许在合同中使用不同的请求类,例如 FormRequest (issue 3383)。

  • 修复了合同中的错误回调处理,例如,对于返回非 200 响应的 URL 执行合同的情况 (issue 3371)。

可用性改进

  • RobotsTxtMiddleware 的更多统计信息 (issue 3100)

  • 使用 INFO 日志级别显示 telnet 主机/端口 (issue 3115)

  • 在 RobotsTxtMiddleware 中的 IgnoreRequest 中添加了一条消息 (issue 3113)

  • 更好地验证 Response.follow 中的 url 参数 (issue 3131)

  • 当蜘蛛初始化时发生错误时,Scrapy 命令返回非零退出代码 (issue 3226)

  • 链接提取改进:“ftp” 已添加到方案列表中 (issue 3152);“flv” 已添加到常用视频扩展名中 (issue 3165)

  • 当导出器被禁用时,显示更好的错误消息 (issue 3358);

  • scrapy shell --help 提到了本地文件所需的语法 (./file.html) - issue 3496

  • 将 Referer 标头值添加到 RFPDupeFilter 日志消息中 (issue 3588)

错误修复

  • 修复了 Windows 下 .csv 导出中多余空行的问题 (issue 3039);

  • 在 Python 3 中正确处理序列化磁盘队列对象时的 pickle 错误 (issue 3082)

  • 复制请求时,现在保留标志 (issue 3342);

  • FormRequest.from_response clickdata 不应忽略带有 input[type=image] 的元素 (issue 3153)。

  • FormRequest.from_response 应保留重复键 (issue 3247)

文档改进

弃用移除

已删除 1.0 之前 Scrapy 模块名称的兼容性 shim (issue 3318)

  • scrapy.command

  • scrapy.contrib(以及所有子模块)

  • scrapy.contrib_exp(以及所有子模块)

  • scrapy.dupefilter

  • scrapy.linkextractor

  • scrapy.project

  • scrapy.spider

  • scrapy.spidermanager

  • scrapy.squeue

  • scrapy.stats

  • scrapy.statscol

  • scrapy.utils.decorator

请参阅 模块重新定位 以获取更多信息,或使用 Scrapy 1.5.x 弃用警告中的建议来更新您的代码。

其他弃用移除

  • 已删除弃用的 scrapy.interfaces.ISpiderManager;请使用 scrapy.interfaces.ISpiderLoader。

  • 已删除弃用的 CrawlerSettings 类 (issue 3327)。

  • 已删除弃用的 Settings.overridesSettings.defaults 属性 (issue 3327issue 3359)。

其他改进和清理

Scrapy 1.5.2 (2019-01-22)

  • 安全漏洞修复:Telnet 控制台扩展程序很容易被恶意网站利用,通过 POST 内容到 https://127.0.0.1:6023,我们没有找到从 Scrapy 利用它的方法,但很容易诱使浏览器这样做,并提高本地开发环境的风险。

    此修复程序与向后不兼容,它默认启用 telnet 用户密码身份验证,并使用随机生成的密码。如果您无法立即升级,请考虑将 TELNETCONSOLE_PORT 设置为非默认值。

    有关更多信息,请参阅 telnet 控制台 文档

  • 由于 boto 导入错误,回退 CI 构建在 GCE 环境下失败。

Scrapy 1.5.1 (2018-07-12)

这是一个维护版本,包含重要的错误修复,但没有新增功能

Scrapy 1.5.0 (2017-12-29)

此版本在整个代码库中带来了少量的新功能和改进。一些亮点

  • FilesPipeline 和 ImagesPipeline 支持 Google Cloud Storage。

  • 使用代理服务器进行爬取变得更高效,因为现在可以重用与代理的连接。

  • 改进了警告、异常和日志消息,以便于调试。

  • scrapy parse 命令现在允许通过 --meta 参数设置自定义请求元数据。

  • 改进了与 Python 3.6、PyPy 和 PyPy3 的兼容性;PyPy 和 PyPy3 现在通过在 CI 上运行测试正式得到支持。

  • 更好地处理 HTTP 308、522 和 524 状态代码。

  • 像往常一样,文档有所改进。

向后不兼容的更改

  • Scrapy 1.5 不再支持 Python 3.3。

  • 默认的 Scrapy 用户代理现在使用 scrapy.org 的 https 链接 (issue 2983)。**从技术上讲,这与向后不兼容**;如果您依赖旧值,请覆盖 USER_AGENT

  • 修复了由 custom_settings 覆盖的设置的日志记录;**从技术上讲,这与向后不兼容**,因为日志记录器从 [scrapy.utils.log] 更改为 [scrapy.crawler]。如果您正在解析 Scrapy 日志,请更新您的日志解析器 (issue 1343)。

  • LinkExtractor 现在默认忽略 m4v 扩展名,这是行为上的变化。

  • 522 和 524 状态代码已添加到 RETRY_HTTP_CODES (issue 2851)

新功能

  • Response.follow 中支持 <link> 标签 (issue 2785)

  • 支持 ptpython REPL (issue 2654)

  • FilesPipeline 和 ImagesPipeline 支持 Google Cloud Storage (issue 2923)。

  • “scrapy parse”命令的新 --meta 选项允许传递额外的 request.meta (issue 2883)

  • 使用 shell.inspect_response 时填充 spider 变量 (issue 2812)

  • 处理 HTTP 308 永久重定向 (issue 2844)

  • 将 522 和 524 添加到 RETRY_HTTP_CODES (issue 2851)

  • 在启动时记录版本信息 (issue 2857)

  • scrapy.mail.MailSender 现在可以在 Python 3 中使用(它需要 Twisted 17.9.0)

  • 重用与代理服务器的连接 (issue 2743)

  • 添加下载器中间件的模板 (issue 2755)

  • 当未定义解析回调时,显示 NotImplementedError 的显式消息 (issue 2831)

  • CrawlerProcess 获得了一个禁用安装根日志处理程序的选项 (issue 2921)

  • LinkExtractor 现在默认忽略 m4v 扩展名

  • 改进了超过 DOWNLOAD_WARNSIZEDOWNLOAD_MAXSIZE 限制的响应的日志消息 (issue 2927)。

  • 将 URL 放入 Spider.allowed_domains 而不是域时显示警告 (issue 2250)。

错误修复

  • 修复了由 custom_settings 覆盖的设置的日志记录;**从技术上讲,这与向后不兼容**,因为日志记录器从 [scrapy.utils.log] 更改为 [scrapy.crawler],因此如果需要,请更新您的日志解析器 (issue 1343)

  • 默认的 Scrapy 用户代理现在使用 scrapy.org 的 https 链接 (issue 2983)。**从技术上讲,这与向后不兼容**;如果您依赖旧值,请覆盖 USER_AGENT

  • 修复 PyPy 和 PyPy3 测试失败,正式支持它们 (issue 2793issue 2935issue 2990issue 3050issue 2213issue 3048)

  • 修复 DNSCACHE_ENABLED=False 时的 DNS 解析器 (issue 2811)

  • 为 Debian Jessie tox 测试环境添加 cryptography (issue 2848)

  • 添加验证以检查 Request 回调是否可调用 (issue 2766)

  • extras/qpsclient.py 移植到 Python 3 (issue 2849)

  • 在幕后使用 getfullargspec 用于 Python 3 以停止 DeprecationWarning (issue 2862)

  • 更新已弃用的测试别名 (issue 2876)

  • 修复 SitemapSpider 对备用链接的支持 (issue 2853)

文档

  • AUTOTHROTTLE_TARGET_CONCURRENCY 设置添加了缺失的项目符号点。(issue 2756)

  • 更新贡献文档,记录新的支持渠道 (issue 2762,issue:3038)

  • 在文档中包含对 Scrapy subreddit 的引用

  • 修复损坏的链接;对外部链接使用 https:// (issue 2978issue 2982issue 2958)

  • 更好地记录 CloseSpider 扩展 (issue 2759)

  • 在 MongoDB 示例中使用 pymongo.collection.Collection.insert_one() (issue 2781)

  • 拼写错误和错别字 (issue 2828issue 2837issue 2884issue 2924)

  • 澄清 CSVFeedSpider.headers 文档(issue 2826

  • 记录 DontCloseSpider 异常并澄清 spider_idleissue 2791

  • 更新 README 中的“版本发布”部分(issue 2764

  • 修复 DOWNLOAD_FAIL_ON_DATALOSS 文档中的 rst 语法(issue 2763

  • 修复 startproject 参数描述中的一个小错误(issue 2866

  • 澄清 Response.body 文档中的数据类型(issue 2922

  • 在 DepthMiddleware 文档中添加关于 request.meta['depth'] 的注释(issue 2374

  • 在 CookiesMiddleware 文档中添加关于 request.meta['dont_merge_cookies'] 的注释(issue 2999

  • 更新项目结构示例(issue 2964issue 2976

  • 提供一个更好的 ItemExporters 用法示例(issue 2989

  • 记录 Spider 和 Downloader 中间件的 from_crawler 方法(issue 3019

Scrapy 1.4.0 (2017-05-18)

Scrapy 1.4 没有带来太多令人惊叹的新功能,但仍然有一些方便的改进。

Scrapy 现在支持匿名 FTP 会话,可以通过新的 FTP_USERFTP_PASSWORD 设置自定义用户和密码。如果您使用的是 Twisted 17.1.0 或更高版本,则 FTP 现在可以在 Python 3 中使用。

有一个新的 response.follow 方法用于创建请求;**现在推荐在 Scrapy Spider 中使用此方法创建请求**。此方法使编写正确的 Spider 变得更容易;response.follow 与直接创建 scrapy.Request 对象相比,具有以下几个优点

  • 它处理相对 URL;

  • 它在非 UTF8 页面上可以正确处理非 ASCII URL;

  • 除了绝对和相对 URL 之外,它还支持选择器;对于 <a> 元素,它还可以提取其 href 值。

例如,而不是这样

for href in response.css('li.page a::attr(href)').extract():
    url = response.urljoin(href)
    yield scrapy.Request(url, self.parse, encoding=response.encoding)

现在可以这样写

for a in response.css('li.page a'):
    yield response.follow(a, self.parse)

链接提取器也得到了改进。它们的工作方式类似于现代浏览器:在构建 Link 对象时,会从属性(例如 href="   http://example.com")中删除前导和尾随空格。对于使用 FormRequestaction 属性,也会进行此空格去除操作。

**请注意,链接提取器默认不再规范化 URL。**这有时会让用户感到困惑,而且事实上浏览器也不会这样做,因此我们删除了对提取链接的额外转换。

对于那些希望更好地控制 Scrapy 在跟踪链接时发送的 Referer: 标头的用户,您可以设置自己的 Referrer Policy。在 Scrapy 1.4 之前,默认的 RefererMiddleware 会简单地将其设置为生成 HTTP 请求的响应的 URL(这可能会泄露有关您的 URL 种子的信息)。默认情况下,Scrapy 现在的工作方式与您的普通浏览器非常相似。并且此策略可以通过 W3C 标准值(或者如果您愿意,可以使用您自己的自定义值)完全自定义。有关详细信息,请参阅 REFERRER_POLICY

为了使 Scrapy Spider 更易于调试,Scrapy 在 1.4 中默认记录了更多统计信息:内存使用统计信息、详细的重试统计信息、详细的 HTTP 错误代码统计信息。类似的更改是 HTTP 缓存路径现在也显示在日志中。

最后但并非最不重要的一点是,Scrapy 现在可以选择使 JSON 和 XML 项目更易于阅读,在项目之间添加换行符,甚至使用自定义缩进偏移量,使用新的 FEED_EXPORT_INDENT 设置。

尽情享受!(或者继续阅读本版本中其余的更改。)

弃用和向后不兼容的更改

  • scrapy.linkextractors.LinkExtractor 中将 canonicalize=False 设为默认值(issue 2537,修复了 issue 1941issue 1982):**警告,这在技术上是不兼容的**

  • 默认启用 memusage 扩展(issue 2539,修复了 issue 2187);**这在技术上是不兼容的**,因此请检查您是否设置了任何非默认的 MEMUSAGE_*** 选项。

  • EDITOR 环境变量现在优先于 settings.py 中定义的 EDITOR 选项(issue 1829);Scrapy 默认设置不再依赖于环境变量。**这在技术上是不兼容的更改**。

  • Spider.make_requests_from_url 已弃用(issue 1728,修复了 issue 1495)。

新功能

错误修复

  • LinkExtractor 现在会从属性中去除前导和尾随空格(issue 2547,修复了 issue 1614

  • FormRequest 中正确处理 action 属性中的空格(issue 2548

  • 缓冲来自代理的 CONNECT 响应字节,直到接收到所有 HTTP 头部(issue 2495,修复了 issue 2491

  • FTP 下载器现在可以在 Python 3 上运行,前提是您使用 Twisted>=17.1(issue 2599

  • 解压缩内容后,使用主体选择响应类型(issue 2393,修复了 issue 2145

  • 始终在 HttpCompressionMiddleware 阶段解压缩 Content-Encoding: gzipissue 2391

  • 尊重 Spider.custom_settings 中的自定义日志级别(issue 2581,修复了 issue 1612

  • macOS 上的“make htmlview”修复(issue 2661

  • 从命令列表中删除“commands”(issue 2695

  • 修复了带有空主体的 POST 请求的重复 Content-Length 标头问题(issue 2677

  • 正确取消大型下载,即超过 DOWNLOAD_MAXSIZE 的下载(issue 1616

  • ImagesPipeline:修复了使用调色板的透明 PNG 图像的处理问题(issue 2675

清理和重构

  • 测试:删除临时文件和文件夹(issue 2570),修复了 macOS 上的 ProjectUtilsTest(issue 2569),在 Travis CI 上为 Linux 使用可移植的 pypy(issue 2710

  • 在 CrawlSpider 中将构建请求与 _requests_to_follow 分开(issue 2562

  • 删除“Python 3 进度”徽章(issue 2567

  • .gitignore 中添加几行内容(issue 2557

  • 删除 bumpversion 预发布配置(issue 2159

  • 添加 codecov.yml 文件(issue 2750

  • 根据 Twisted 版本设置上下文工厂实现(issue 2577,修复了 issue 2560

  • 在默认项目中间件模板中添加省略的 self 参数(issue 2595

  • 删除 ExecutionEngine 中冗余的 slot.add_request() 调用(issue 2617

  • scrapy.pipelines.files.FSFilesStore 中捕获更具体的 os.error 异常(issue 2644

  • 更改“localhost”测试服务器证书(issue 2720

  • 删除未使用的 MEMUSAGE_REPORT 设置(issue 2576

文档

Scrapy 1.3.3 (2017-03-10)

错误修复

  • 使 SpiderLoader 再次默认情况下为缺少的依赖项和错误的 SPIDER_MODULES 抛出 ImportError。从 1.3.0 开始,这些异常被静默为警告。引入了新的设置以在需要时在警告或异常之间切换;有关详细信息,请参阅 SPIDER_LOADER_WARN_ONLY

Scrapy 1.3.2 (2017-02-13)

错误修复

  • 在转换为/从字典转换时保留请求类 (utils.reqser)(issue 2510)。

  • 在教程中对作者字段使用一致的选择器(issue 2551)。

  • 修复 Twisted 17+ 中的 TLS 兼容性(issue 2558

Scrapy 1.3.1 (2017-02-08)

新功能

  • 支持布尔设置的 'True''False' 字符串值(issue 2519);您现在可以执行类似 scrapy crawl myspider -s REDIRECT_ENABLED=False 的操作。

  • 支持使用 response.xpath() 的 kwargs 来使用 XPath 变量 和临时命名空间声明;这至少需要 Parsel v1.1(issue 2457)。

  • 添加对 Python 3.6 的支持(issue 2485)。

  • 在 PyPy 上运行测试(警告:一些测试仍然失败,因此 PyPy 尚未得到支持)。

错误修复

  • 强制执行 DNS_TIMEOUT 设置(issue 2496)。

  • 修复 view 命令;这是 v1.3.0 中的回归(issue 2503)。

  • 修复与 Files/Images 管道一起使用 *_EXPIRES settings 相关的测试(issue 2460)。

  • 修复使用基本项目模板时生成的管道类的名称(issue 2466)。

  • 修复与 Twisted 17+ 的兼容性(issue 2496issue 2528)。

  • 修复 Python 3.6 上的 scrapy.Item 继承问题(issue 2511)。

  • 强制 SPIDER_MIDDLEWARESDOWNLOADER_MIDDLEWARESEXTENSIONSSPIDER_CONTRACTS 中组件顺序的数值(issue 2420)。

文档

  • 改写行为准则部分并升级到 Contributor Covenant v1.4(issue 2469)。

  • 阐明传递蜘蛛参数会将其转换为蜘蛛属性(issue 2483)。

  • 记录 formid 参数在 FormRequest.from_response() 中的使用(issue 2497)。

  • 将 .rst 扩展名添加到 README 文件(issue 2507)。

  • 提及 LevelDB 缓存存储后端(issue 2525)。

  • 在示例回调代码中使用 yieldissue 2533)。

  • 添加关于使用.re()/.re_first()解码HTML实体的说明(issue 1704)。

  • 拼写错误修复(issue 2512issue 2534issue 2531)。

代码清理

  • 移除MetaRefreshMiddleware中冗余的检查(issue 2542)。

  • LinkExtractor中针对允许/拒绝模式进行更快的检查(issue 2538)。

  • 移除支持旧版Twisted版本的冗余代码(issue 2544)。

Scrapy 1.3.0 (2016-12-21)

这个版本在1.2.2之后发布得很快,主要原因是:发现从0.18到1.2.2(包含)的版本都使用了从Twisted移植过来的某些代码(scrapy.xlib.tx.*),即使有更新的Twisted模块可用。Scrapy现在直接使用twisted.web.clienttwisted.internet.endpoints。(参见下面的代码清理部分。)

由于这是一个重大更改,我们希望快速发布该错误修复,同时不破坏任何使用1.2系列项目的项目。

新特性

  • MailSender现在接受单个字符串作为tocc参数的值(issue 2272

  • scrapy fetch urlscrapy shell url和Scrapy shell内部的fetch(url)现在默认情况下会跟随HTTP重定向(issue 2290);请参阅fetchshell了解详细信息。

  • HttpErrorMiddleware现在使用INFO级别而不是DEBUG级别记录错误;从技术上讲,这与向后不兼容,因此请检查您的日志解析器。

  • 默认情况下,日志记录器名称现在使用长格式路径,例如[scrapy.extensions.logstats],而不是先前版本中较短的“顶级”变体(例如[scrapy]);如果您使用的是期望短日志记录器名称部分的日志解析器,则此更改与向后不兼容。您可以使用LOG_SHORT_NAMES设置为True将其切换回短日志记录器名称。

依赖项和代码清理

  • Scrapy现在需要Twisted >= 13.1,这在许多Linux发行版中已经是这种情况。

  • 因此,我们去除了scrapy.xlib.tx.*模块,该模块复制了一些Twisted代码,供那些使用“旧”Twisted版本的用户使用。

  • ChunkedTransferMiddleware已弃用,并从默认下载器中间件中删除。

Scrapy 1.2.3 (2017-03-03)

  • 打包修复:在setup.py中禁止不支持的Twisted版本。

Scrapy 1.2.2 (2016-12-06)

错误修复

  • 修复当管道在open_spider()上失败时出现的难以理解的回溯(issue 2011

  • 修复嵌入式IPython shell变量(修复在1.2.0中重新出现的issue 396,在issue 2418中已修复)

  • 处理robots.txt时的一些补丁。

    • 处理(非标准)相对sitemap URL(issue 2390

    • 在Python 2中处理非ASCII URL和用户代理(issue 2373

文档

其他更改

  • conda-forge宣传为Scrapy的官方conda频道(issue 2387

  • 在尝试对非文本响应使用.css().xpath()时提供更有帮助的错误消息(issue 2264

  • startproject命令现在生成一个示例middlewares.py文件(issue 2335

  • scrapy version详细输出中添加更多依赖项的版本信息(issue 2404

  • 从源代码分发中删除所有*.pyc文件(issue 2386

Scrapy 1.2.1 (2016-10-21)

错误修复

  • 在建立TLS/SSL连接时包含OpenSSL的更宽松的默认密码(issue 2314)。

  • 修复非ASCII URL重定向时“Location”HTTP标头解码问题(issue 2321)。

文档

  • 修复JsonWriterPipeline示例(issue 2302)。

  • 各种说明:关于spider名称的issue 2330,关于中间件方法处理顺序的issue 2329,关于将多值HTTP标头作为列表获取的issue 2327

其他更改

  • 从内置spider模板中的start_urls中删除www.issue 2299)。

Scrapy 1.2.0 (2016-10-03)

新特性

  • 新的FEED_EXPORT_ENCODING设置用于自定义将项目写入文件时使用的编码。这可以用于关闭JSON输出中的\uXXXX转义。对于那些希望使用除UTF-8以外的XML或CSV输出的人来说,这也很有用(issue 2034)。

  • startproject命令现在支持可选的目标目录,以覆盖基于项目名称的默认目录(issue 2005)。

  • 新的SCHEDULER_DEBUG设置用于记录请求序列化失败(issue 1610)。

  • JSON编码器现在支持set实例的序列化(issue 2058)。

  • application/json-amazonui-streaming解释为TextResponseissue 1503)。

  • 使用shell工具(shellinspect_response)时,默认情况下会导入scrapyissue 2248)。

错误修复

  • DefaultRequestHeaders中间件现在在UserAgent中间件之前运行(issue 2088)。**警告:从技术上讲,这与向后不兼容**,但我们认为这是一个错误修复。

  • 使用.scrapy数据目录的HTTP缓存扩展和插件现在可以在项目外部工作(issue 1581)。**警告:从技术上讲,这与向后不兼容**,但我们认为这是一个错误修复。

  • Selector不再允许同时传递responsetextissue 2153)。

  • 修复使用scrapy parse时错误的回调名称日志记录问题(issue 2169)。

  • 修复一个奇怪的gzip解压缩错误(issue 1606)。

  • 修复在使用 CrawlSpider 结合 scrapy parse 命令时部分回调函数的问题(issue 2225)。

  • 修复当 Spider 不产出任何 Item 时导致的无效 JSON 和 XML 文件问题(issue 872)。

  • StreamLogger 实现 flush() 方法,避免日志中出现警告(issue 2125)。

重构

测试与依赖

Scrapy 的新依赖基础版本为 Debian 8 “Jessie”。之前为 Ubuntu 12.04 Precise。这意味着我们至少使用以下主要软件包版本运行持续集成测试:Twisted 14.0、pyOpenSSL 0.14、lxml 3.4。

Scrapy 很有可能与这些软件包的旧版本兼容(例如,代码库中仍然保留了针对旧版 Twisted 的切换),但不能保证(因为不再进行测试)。

文档

Scrapy 1.1.4 (2017-03-03)

  • 打包修复:在setup.py中禁止不支持的Twisted版本。

Scrapy 1.1.3 (2016-09-22)

Bug 修复

  • ImagesPipelineFilesPipeline 子类的类属性恢复到 1.1.1 之前的行为(issue 2243,修复了 issue 2198)。

文档

Scrapy 1.1.2 (2016-08-18)

Bug 修复

  • 引入缺失的 IMAGES_STORE_S3_ACL 设置,用于在将图片上传到 S3 时覆盖默认的 ACL 策略(注意,自 Scrapy 1.1.0 起,默认 ACL 策略为“private”而非“public-read”)。

  • IMAGES_EXPIRES 的默认值恢复为 90(回归问题出现在 1.1.1 中)。

Scrapy 1.1.1 (2016-07-13)

Bug 修复

  • 在连接到 HTTPS 代理的 CONNECT 请求中添加 “Host” 头(issue 2069)。

  • 在选择响应类时使用响应的 bodyissue 2001,修复了 issue 2000)。

  • 规范化 URL 时,不再因错误的 netloc 导致失败(issue 2038,修复了 issue 2010)。

  • HttpCompressionMiddleware(以及 SitemapSpider)进行了一些修复。

  • 捕获(并以警告方式忽略)在针对 IP 地址主机验证证书时发生的异常(issue 2094,修复了 issue 2092)。

  • 使 FilesPipelineImagesPipeline 再次向后兼容,关于使用旧版类属性进行自定义(issue 1989,修复了 issue 1985)。

新特性

  • 启用在项目文件夹外部使用 genspider 命令(issue 2052)。

  • 默认情况下重试 HTTPS CONNECT TunnelErrorissue 1974)。

文档

  • FEED_TEMPDIR 设置在词典顺序位置(commit 9b3c72c)。

  • 在概述中使用惯用的 .extract_first()issue 1994)。

  • 更新版权声明中的年份(commit c2c8036)。

  • 添加关于 errbacks 的信息和示例(issue 1995)。

  • 在下载器中间件示例中使用 “url” 变量(issue 2015)。

  • 语法修复(issue 2054issue 2120)。

  • 新增关于在 Spider 回调函数中使用 BeautifulSoup 的常见问题解答条目(issue 2048)。

  • 添加关于 Scrapy 在 Windows 上与 Python 3 不兼容的说明(issue 2060)。

  • 鼓励在拉取请求中使用完整的标题(issue 2026)。

测试

  • 升级 Travis CI 上的 py.test 依赖项,并将 pytest-cov 固定到 2.2.1(issue 2095)。

Scrapy 1.1.0 (2016-05-11)

这个 1.1 版本带来了许多有趣的特性和 Bug 修复。

  • Scrapy 1.1 提供了 Beta 版的 Python 3 支持(需要 Twisted >= 15.5)。有关更多详细信息和一些限制,请参阅 Beta 版 Python 3 支持

  • 热门新特性

  • 这些 Bug 修复可能需要您关注

    • 默认情况下不再重试错误请求(HTTP 400)(issue 1289)。如果您需要旧的行为,请将 400 添加到 RETRY_HTTP_CODES 中。

    • 修复了 shell 文件参数处理(issue 1710issue 1550)。如果您尝试 scrapy shell index.html,它将尝试加载 URL http://index.html,请使用 scrapy shell ./index.html 加载本地文件。

    • 现在默认情况下为新创建的项目启用 robots.txt 兼容性(issue 1724)。Scrapy 还会在继续爬取之前等待 robots.txt 下载完成(issue 1735)。如果您想禁用此行为,请在创建新项目后更新 settings.py 文件中的 ROBOTSTXT_OBEY 设置。

    • 导出器现在默认使用 Unicode 而不是字节进行工作(issue 1080)。如果您使用 PythonItemExporter,您可能需要更新您的代码以禁用现在已弃用的二进制模式。

    • 接受包含点的 XML 节点名称作为有效名称(issue 1533)。

    • 当将文件或图像上传到 S3(使用 FilesPipelineImagesPipeline)时,默认的 ACL 策略现在为“private”(私有)而不是“public”(公开)**警告:不兼容!**。您可以使用 FILES_STORE_S3_ACL 进行更改。

    • 我们重新实现了 canonicalize_url() 以获得更正确的输出,尤其是在包含非 ASCII 字符的 URL 中(issue 1947)。这可能会改变链接提取器的输出,与之前的 Scrapy 版本相比。这还可能使您可能仍然保留的来自 1.1 之前版本的某些缓存条目失效。**警告:不兼容!**。

继续阅读以获取有关其他改进和错误修复的更多详细信息。

Python 3 支持 Beta版

我们一直在 努力使 Scrapy 在 Python 3 上运行。因此,您现在可以在 Python 3.3、3.4 和 3.5 上运行爬虫(需要 Twisted >= 15.5)。某些功能仍然缺失(并且某些功能可能永远不会移植)。

几乎所有内置扩展/中间件都应该可以工作。但是,我们意识到 Python 3 中存在一些限制。

  • Scrapy 在 Python 3 的 Windows 上无法运行。

  • 不支持发送电子邮件。

  • 不支持 FTP 下载处理器。

  • 不支持 Telnet 控制台。

其他新功能和增强功能

弃用和移除

  • 添加了 to_bytesto_unicode,弃用了 str_to_unicodeunicode_to_str 函数(issue 778)。

  • binary_is_text 已引入,以替换 isbinarytext 的使用(但返回值相反)(issue 1851)。

  • 已删除 optional_features 集(issue 1359)。

  • 已删除 --lsprof 命令行选项(issue 1689)。**警告:不兼容**,但不会破坏用户代码。

  • 以下数据类型已弃用(issue 1720)。

    • scrapy.utils.datatypes.MultiValueDictKeyError

    • scrapy.utils.datatypes.MultiValueDict

    • scrapy.utils.datatypes.SiteNode

  • 之前捆绑的 scrapy.xlib.pydispatch 库已弃用,并替换为 pydispatcher

重新定位

错误修复

Scrapy 1.0.7 (2017-03-03)

  • 打包修复:在setup.py中禁止不支持的Twisted版本。

Scrapy 1.0.6 (2016-05-04)

  • 修复:RetryMiddleware 现在可以更稳健地处理非标准 HTTP 状态码(issue 1857

  • 修复:Filestorage HTTP 缓存正在检查错误的修改时间(issue 1875

  • 文档:支持 Sphinx 1.4+(issue 1893

  • 文档:选择器示例的一致性(issue 1869

Scrapy 1.0.5 (2016-02-04)

Scrapy 1.0.4 (2015-12-30)

Scrapy 1.0.3 (2015-08-11)

Scrapy 1.0.2 (2015-08-06)

Scrapy 1.0.1 (2015-07-01)

Scrapy 1.0.0 (2015-06-19)

在这个主要版本中,您将发现许多新功能和错误修复。请务必查看我们更新的概述,以快速了解一些更改,以及我们改进的教程

支持在 Spider 中返回字典

不再需要声明和返回 Scrapy Item 来收集 Spider 抓取的数据,您现在可以改为返回显式的字典。

经典版本

class MyItem(scrapy.Item):
    url = scrapy.Field()

class MySpider(scrapy.Spider):
    def parse(self, response):
        return MyItem(url=response.url)

新版本

class MySpider(scrapy.Spider):
    def parse(self, response):
        return {'url': response.url}

每个 Spider 的设置 (GSoC 2014)

最后一个 Google Summer of Code 项目完成了一个重要的重新设计,该设计重新设计了用于填充设置的机制,引入了显式优先级以覆盖任何给定的设置。作为该目标的扩展,我们添加了一个新的优先级级别,用于专门针对单个 Spider 的设置,允许它们重新定义项目设置。

通过在您的 Spider 中定义一个custom_settings 类变量来开始使用它

class MySpider(scrapy.Spider):
    custom_settings = {
        "DOWNLOAD_DELAY": 5.0,
        "RETRY_ENABLED": False,
    }

阅读有关设置填充的更多信息:设置

Python 日志记录

Scrapy 1.0 已停止使用 Twisted 日志记录,并支持 Python 内置的日志记录系统作为默认日志记录系统。我们正在维护大多数旧自定义接口的后向兼容性以调用日志记录函数,但您会收到警告,提示您完全切换到 Python 日志记录 API。

旧版本

from scrapy import log
log.msg('MESSAGE', log.INFO)

新版本

import logging
logging.info('MESSAGE')

使用 Spider 进行日志记录保持不变,但在log() 方法之上,您还可以访问为 Spider 创建的自定义logger 来发出日志事件

class MySpider(scrapy.Spider):
    def parse(self, response):
        self.logger.info('Response received')

在日志记录文档中阅读更多内容:日志记录

Crawler API 重构 (GSoC 2014)

上一个 Google Summer of Code 的另一个里程碑是内部 API 的重构,旨在寻求更简单易用的方式。查看以下内容中的新核心接口:核心 API

当您从脚本运行 Scrapy 时,您将遇到这些更改的常见情况。以下是如何使用新 API 手动运行 Spider 的快速示例

from scrapy.crawler import CrawlerProcess

process = CrawlerProcess({
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})
process.crawl(MySpider)
process.start()

请记住,此功能仍在开发中,其 API 可能会更改,直到达到稳定状态。

查看更多运行 Scrapy 脚本的示例:常见实践

模块重定位

对模块进行了一次大规模的重新排列,试图改进 Scrapy 的整体结构。主要更改包括将各种子包分离到新的项目中,并将scrapy.contribscrapy.contrib_exp 都分解成顶级包。在内部重定位之间保持了向后兼容性,而导入已弃用的模块则会发出警告,指示其新的位置。

重定位的完整列表

外包的包

注意

这些扩展进行了一些细微的更改,例如,一些设置名称已更改。请查看每个新存储库中的文档,以熟悉新的用法。

旧位置

新位置

scrapy.commands.deploy

scrapyd-client (在此处查看其他替代方案:部署 Spider)

scrapy.contrib.djangoitem

scrapy-djangoitem

scrapy.webservice

scrapy-jsonrpc

scrapy.contrib_expscrapy.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.contrib.closespider

  • scrapy.contrib.corestats

  • scrapy.contrib.debug

  • scrapy.contrib.feedexport

  • scrapy.contrib.httpcache

  • scrapy.contrib.logstats

  • scrapy.contrib.memdebug

  • scrapy.contrib.memusage

  • scrapy.contrib.spiderstate

  • scrapy.contrib.statsmailer

  • scrapy.contrib.throttle

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

变更日志

新功能和增强功能

弃用和移除 (Deprecations and Removals)

重新定位 (Relocations)

文档 (Documentation)

错误修复 (Bugfixes)

  • Item 多重继承修复(issue 353issue 1228

  • ItemLoader.load_item: 迭代字段的副本(issue 722

  • 修复 Deferred 中的未处理错误(RobotsTxtMiddleware)(issue 1131issue 1197

  • 强制将 DOWNLOAD_TIMEOUT 读取为整数(issue 954

  • scrapy.utils.misc.load_object 应该打印完整的回溯信息(issue 902

  • 修复“.local”主机名的错误(issue 878

  • 修复启用的扩展、中间件、管道信息不再打印的错误(issue 879

  • 修复 dont_merge_cookies 在 meta 中设置为 false 时行为异常的错误(issue 846

Python 3 支持正在进行中

  • 如果 twisted.conch 不可用,则禁用 scrapy.telnet(issue 1161

  • 修复 ajaxcrawl.py 中的 Python 3 语法错误(issue 1162

  • 针对 urllib 的更多 Python 3 兼容性更改(issue 1121

  • 在 Python 3 中,assertItemsEqual 重命名为 assertCountEqual。(issue 1070

  • 如果可用,导入 unittest.mock。(issue 1066

  • 将已弃用的 cgi.parse_qsl 更新为使用 six 的 parse_qsl(issue 909

  • 防止 Python 3 端口出现回归(issue 830

  • PY3: 对于 Python 3,使用 MutableMapping(issue 810

  • PY3: 使用 six.BytesIO 和 six.moves.cStringIO(issue 803

  • PY3: 修复 xmlrpclib 和 email 导入(issue 801

  • PY3: 对于 robotparser 和 urlparse,使用 six(issue 800

  • PY3: 使用 six.iterkeys、six.iteritems 和 tempfile(issue 799

  • PY3: 修复 has_key 并使用 six.moves.configparser(issue 798

  • PY3: 使用 six.moves.cPickle(issue 797

  • PY3 使在 Python3 中运行一些测试成为可能(issue 776

测试 (Tests)

  • 从 py3-ignores 中删除不必要的行(issue 1243

  • 修复在收集测试时 pytest 发出的剩余警告(issue 1206

  • 将文档构建添加到 travis(issue 1234

  • TST 不要从已弃用的模块中收集测试。(issue 1165

  • 在测试中安装 service_identity 包以防止出现警告(issue 1168

  • 修复测试中已弃用的设置 API(issue 1152

  • 添加对使用 POST 方法且未提供主体内容的 webclient 的测试(issue 1089

  • py3-ignores.txt 支持注释(issue 1044

  • 使一些断言现代化(issue 835

  • selector.__repr__ 测试(issue 779

代码重构

  • CSVFeedSpider 清理:使用 iterate_spider_output(issue 1079

  • 从 scrapy.utils.spider.iter_spider_output 中删除不必要的检查(issue 1078

  • Pydispatch pep8(issue 992

  • 从 walk_modules() 中删除未使用的“load=False”参数(issue 871

  • 为了一致性,在 SpiderState 扩展中使用 job_dir 帮助程序。(issue 805

  • 将“sflo”局部变量重命名为不太神秘的“log_observer”(issue 775

Scrapy 0.24.6 (2015-04-20)

  • 在 PY2 下使用 unicode_escape 对无效 xpath 进行编码(commit 07cb3e5

  • 修复 IPython shell 范围问题并加载 IPython 用户配置(commit 2c8e573

  • 修复文档中的一个小错误(commit d694019

  • 修复一个小错误(commit f92fa83

  • 在“提取数据”中将 sel.xpath() 调用转换为 response.xpath()(commit c2c6d15

Scrapy 0.24.5 (2015-02-25)

Scrapy 0.24.4 (2014-08-09)

Scrapy 0.24.3 (2014-08-09)

Scrapy 0.24.2 (2014-07-08)

Scrapy 0.24.1 (2014-06-27)

  • 修复已弃用的 CrawlerSettings 并提高与 .defaults 属性的向后兼容性 (提交 8e3f20a)

Scrapy 0.24.0 (2014-06-26)

增强功能

错误修复

  • 在 RegexLinkExtractor 中创建链接时对 unicode URL 值进行编码 (issue 561)

  • 在 ItemLoader 处理器中忽略 None 值 (issue 556)

  • 修复 SGMLLinkExtractor 和 HtmlParserLinkExtractor 中存在内部标签时的链接文本 (issue 485issue 574)

  • 修复对已弃用类子类的错误检查 (issue 581issue 584)

  • 处理由 inspect.stack() 失败导致的错误 (issue 582)

  • 修复对不存在的引擎属性的引用 (issue 593issue 594)

  • 修复动态 itemclass 示例中 type() 的用法 (issue 603)

  • 使用 lucasdemarchi/codespell 修复错别字 (issue 628)

  • 修复 SgmlLinkExtractor 中 attrs 参数的默认值为元组 (issue 661)

  • 修复站点地图读取器中的 XXE 漏洞 (issue 676)

  • 修复引擎以支持过滤后的起始请求 (issue 707)

  • 修复 url 没有主机名时 offsite 中间件的情况 (issue 745)

  • 测试套件不再需要 PIL (issue 585)

Scrapy 0.22.2 (发布日期:2014-02-14)

Scrapy 0.22.1 (发布日期:2014-02-08)

  • localhost666 在某些情况下可以解析 (commit 2ec2279)

  • 测试 inspect.stack 失败 (commit cc3eda3)

  • 处理 inspect.stack() 失败的情况 (commit 8cb44f9)

  • 修复对已弃用类子类的错误检查。关闭 #581 (commit 46d98d6)

  • 文档:最终蜘蛛示例使用 4 个空格缩进 (commit 13846de)

  • 合并 #485 后修复 HtmlParserLinkExtractor 和测试 (commit 368a946)

  • BaseSgmlLinkExtractor:修复链接具有内部标签时缺少空格的问题 (commit b566388)

  • BaseSgmlLinkExtractor:添加具有内部标签的链接单元测试 (commit c1cb418)

  • BaseSgmlLinkExtractor:修复 unknown_endtag(),使其仅在结束标签与开始标签匹配时设置 current_link=None (commit 7e4d627)

  • 修复 Travis-CI 构建的测试 (commit 76c7e20)

  • 将不可编码的代码点替换为 html 实体。修复 #562 和 #285 (commit 5f87b17)

  • RegexLinkExtractor:在创建链接时对 URL unicode 值进行编码 (commit d0ee545)

  • 使用最新输出更新教程抓取输出。 (commit 8da65de)

  • 使用爬虫引用更新 shell 文档,并修复了实际的 shell 输出。 (commit 875b9ab)

  • PEP8 小幅修改。 (commit f89efaf)

  • 在 Scrapy shell 中公开当前爬虫。 (commit 5349cec)

  • 未使用的 re 导入和 PEP8 小幅修改。 (commit 387f414)

  • 使用 ItemLoader 时忽略 None 值。 (commit 0632546)

  • 文档:修复 HTTPCACHE_STORAGE 默认值中的错别字,现在为 Filesystem 而不是 Dbm。 (commit cde9a8c)

  • 将 Ubuntu 设置说明显示为代码字面量 (commit fb5c9c5)

  • 更新 Ubuntu 安装说明 (commit 70fb105)

  • 合并拉取请求 #550 来自 stray-leone/patch-1 (commit 6f70b6a)

  • 修改 Scrapy Ubuntu 软件包的版本 (commit 725900d)

  • 修复 0.22.0 发布日期 (commit af0219a)

  • 修复 news.rst 中的错别字并删除 (尚未发布) 标题 (commit b7f58f4)

Scrapy 0.22.0 (发布日期:2014-01-17)

增强功能

  • [**向后不兼容**] 将 HTTPCacheMiddleware 后端切换到文件系统 (issue 541) 要恢复旧后端,请将 HTTPCACHE_STORAGE 设置为 scrapy.contrib.httpcache.DbmCacheStorage

  • 使用 CONNECT 方法代理 https:// url (issue 392issue 397)

  • 添加一个中间件来根据 google 定义的规则抓取 ajax 可抓取页面 (issue 343)

  • 将 scrapy.spider.BaseSpider 重命名为 scrapy.spider.Spider (issue 510issue 519)

  • 选择器默认注册 EXSLT 命名空间 (issue 472)

  • 统一项加载器,类似于选择器重命名 (issue 461)

  • 使 RFPDupeFilter 类易于子类化 (issue 533)

  • 提高测试覆盖率并支持即将推出的 Python 3 (issue 525)

  • 将设置和中间件中的启动信息提升到 INFO 级别 (issue 520)

  • get_func_args 实用程序中支持部分应用 (issue 506,issue:504)

  • 允许通过 tox 运行单个测试 (issue 503)

  • 更新链接提取器忽略的扩展 (issue 498)

  • 添加中间件方法以获取文件/图像/缩略图路径 (issue 490)

  • 改进 offsite 中间件测试 (issue 478)

  • 添加一种方法来跳过 RefererMiddleware 设置的默认 Referer 标头 (issue 475)

  • 不要在默认的 Accept-Encoding 标头中发送 x-gzip (issue 469)

  • 支持使用设置定义 http 错误处理 (issue 466)

  • 在发现遗留代码时使用现代 python 习惯用法 (issue 497)

  • 改进和更正文档 (issue 527issue 524issue 521issue 517issue 512issue 505issue 502issue 489issue 465issue 460issue 425issue 536)

修复

  • 更新 CrawlSpider 模板中的 Selector 类导入 (issue 484)

  • 修复对 engine.slots 的不存在引用 (issue 464)

  • 不要尝试在非 TextResponse 实例上调用 body_as_unicode() (issue 462)

  • 在子类化 XPathItemLoader 时发出警告,以前它仅在实例化时发出警告。 (issue 523)

  • 在子类化 XPathSelector 时发出警告,以前它仅在实例化时发出警告。 (issue 537)

  • 多个内存统计修复 (issue 531issue 530issue 529)

  • 修复 FormRequest.from_response() 中的 url 覆盖 (issue 507)

  • 修复 pip 1.5 下的测试运行程序 (issue 513)

  • 修复蜘蛛名称为 unicode 时的日志记录错误 (issue 479)

Scrapy 0.20.2 (发布日期:2013-12-09)

Scrapy 0.20.1 (发布日期 2013-11-28)

  • 需要 `include_package_data` 从已发布的源代码构建 wheel 文件 (commit 5ba1ad5)

  • `process_parallel` 在其内部延迟对象中泄漏了错误。关闭 #458 (commit 419a780)

Scrapy 0.20.0 (发布日期 2013-11-08)

增强功能

  • 新的 Selector API,包括 CSS 选择器 (issue 395issue 426),

  • Request/Response 的 url/body 属性现在是不可变的(修改它们已被弃用很长时间了)

  • ITEM_PIPELINES 现在定义为字典(而不是列表)

  • 站点地图爬虫可以获取备用 URL (issue 360)

  • Selector.remove_namespaces() 现在从元素的属性中删除命名空间。(issue 416)

  • 为 Python 3.3+ 铺平道路 (issue 435issue 436issue 431issue 452)

  • 新的项目导出器使用带嵌套支持的原生 Python 类型 (issue 366)

  • 调整 HTTP1.1 池大小,使其与设置中定义的并发性匹配 (commit b43b5f575)

  • `scrapy.mail.MailSender` 现在可以通过 TLS 连接或使用 STARTTLS 升级 (issue 327)

  • 新的 FilesPipeline,其功能从 ImagesPipeline 中分解出来 (issue 370issue 409)

  • 建议使用 Pillow 而不是 PIL 进行图像处理 (issue 317)

  • 为 Ubuntu Quantal 和 Raring 添加了 Debian 软件包 (commit 86230c0)

  • 模拟服务器(用于测试)可以监听 HTTPS 请求 (issue 410)

  • 从多个核心组件中删除多爬虫支持 (issue 422issue 421issue 420issue 419issue 423issue 418)

  • Travis-CI 现在针对 w3libqueuelib Python 包的开发版本测试 Scrapy 的更改。

  • 将 pypy 2.1 添加到持续集成测试中 (commit ecfa7431)

  • 使用 Pylinted、pep8 并从源代码中删除旧式异常 (issue 430issue 432)

  • 使用 importlib 进行参数化导入 (issue 445)

  • 处理 Python 2.7.5 中引入的影响 XmlItemExporter 的回归 (issue 372)

  • 修复 SIGINT 信号下爬取的关闭问题 (issue 450)

  • 不要在 FormRequest.from_response 中提交 `reset` 类型的输入 (commit b326b87)

  • 当请求错误回调引发异常时,不要抑制下载错误 (commit 684cfc0)

错误修复

其他

  • 放弃 Python 2.6 支持 (issue 448)

  • 添加 cssselect Python 包作为安装依赖项

  • 放弃 libxml2 和多选择器后端支持,从现在开始需要 lxml

  • 最低 Twisted 版本提升到 10.0.0,放弃 Twisted 8.0 支持。

  • 运行测试套件现在需要 mock Python 库 (issue 390)

致谢

感谢所有为本次发布做出贡献的人!

按提交次数排序的贡献者列表

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)

Scrapy 0.18.2 (发布日期 2013-09-03)

  • 反向移植 scrapy check 命令修复和向后兼容的多爬虫进程(issue 339)

Scrapy 0.18.1 (发布日期 2013-08-27)

  • 删除 cherry-pick 更改添加的额外导入 (commit d20304e)

  • 修复 Twisted 11.0.0 之前的版本下的爬取测试 (commit 1994f38)

  • py26 无法格式化零长度字段 {} (commit abf756f)

  • 测试未绑定响应上的 PotentiaDataLoss 错误 (commit b15470d)

  • 将没有内容长度或传输编码的响应视为良好响应 (commit c4bf324)

  • 如果未启用 http11 处理程序,则不包含 ResponseFailed (commit 6cbe684)

  • 新的 HTTP 客户端将连接丢失包装在 ResponseFailed 异常中。修复 #373 (commit 1a20bba)

  • 限制 travis-ci 构建矩阵 (commit 3b01bb8)

  • 合并拉取请求 #375 来自 peterarenot/patch-1 (commit fa766d7)

  • 修复使其引用正确的文件夹 (commit 3283809)

  • 添加 Quantal 和 Raring 以支持 Ubuntu 版本 (commit 1411923)

  • 修复重试中间件,该中间件在升级到 http1 客户端后未重试某些连接错误,关闭 GH-373 (commit bb35ed0)

  • 修复 Python 2.7.4 和 2.7.5 中的 XmlItemExporter (commit de3e451)

  • 0.18 版发行说明的次要更新 (commit c45e5f1)

  • 修复贡献者列表格式 (commit 0b60031)

Scrapy 0.18.0 (发布日期 2013-08-09)

  • 对使用 Tox 运行的测试套件进行了大量改进,包括在 pypi 上进行测试的方法

  • 处理 AJAX 可爬取 URL 的 GET 参数 (commit 3fe2a32)

  • 使用 lxml recover 选项解析站点地图 (issue 347)

  • 修复按主机名而不是按 netloc 合并 cookie 的错误 (issue 352)

  • 支持使用标志设置禁用 HttpCompressionMiddleware (issue 359)

  • XMLFeedSpider 中使用 iternodes 解析器支持 xml 命名空间 (issue 12)

  • 支持 dont_cache 请求元数据标志 (issue 19)

  • 修复 Python 2.7.4 中 scrapy.utils.gz.gunzip 由于更改而导致的错误 (commit 4dc76e)

  • 修复 SgmlLinkExtractor 上的 URL 编码错误 (issue 24)

  • 修复 TakeFirst 处理器不应丢弃零 (0) 值的错误 (issue 59)

  • 支持 xml 导出器中的嵌套项目 (issue 66)

  • 改进 cookie 处理性能 (issue 77)

  • 仅记录一次重复过滤的请求 (issue 105)

  • 将重定向中间件拆分为基于状态和元数据的中间件 (issue 78)

  • 使用 HTTP1.1 作为默认下载处理器(issue 109issue 318

  • 支持在 FormRequest.from_response 中使用 xpath 表达式选择表单 (issue 185)

  • 修复 SgmlLinkExtractor 中的 Unicode 解码错误 (issue 199)

  • 修复 pypi 解释器上的信号分发错误 (issue 205)

  • 改进请求延迟和并发处理 (issue 206)

  • 将 RFC2616 缓存策略添加到 HttpCacheMiddleware (issue 212)

  • 允许自定义引擎记录的消息 (issue 214)

  • DjangoItem 进行多项改进 (issue 217, issue 218, issue 221)

  • 使用 setuptools 入口点扩展 Scrapy 命令 (issue 260)

  • 允许蜘蛛的 allowed_domains 值设置为集合或元组 (issue 261)

  • 支持 settings.getdict (issue 269)

  • 简化内部 scrapy.core.scraper 槽位处理 (issue 271)

  • 添加 Item.copy (issue 290)

  • 收集空闲下载器槽位 (issue 297)

  • 添加 ftp:// 方案的下载处理器 (issue 329)

  • 添加下载器基准测试 Web 服务器和蜘蛛工具 基准测试

  • 将持久性(磁盘上)队列移至一个单独的项目 (queuelib),Scrapy 现在依赖于它

  • 使用外部库添加 Scrapy 命令 (issue 260)

  • scrapy 命令行工具添加了 --pdb 选项

  • 添加了 XPathSelector.remove_namespaces,它允许为了方便(使用无命名空间的 XPath)从 XML 文档中删除所有命名空间。在 选择器 中有文档记录。

  • 对蜘蛛契约进行了一些改进

  • 新的默认中间件名为 MetaRefreshMiddleware,它处理元刷新 html 标签重定向,

  • MetaRefreshMiddleware 和 RedirectMiddleware 具有不同的优先级以解决 #62

  • 为蜘蛛添加了 from_crawler 方法

  • 添加了使用模拟服务器的系统测试

  • 对 macOS 兼容性进行了更多改进(感谢 Alex Cepoi)

  • 对单例和多蜘蛛支持进行了更多清理(感谢 Nicolas Ramirez)

  • 支持自定义下载槽位

  • 为“shell”命令添加了 –spider 选项。

  • Scrapy 启动时记录覆盖的设置

感谢所有为本次发布做出贡献的人。以下是按提交次数排序的贡献者列表

130 Pablo Hoffman <pablo@...>
 97 Daniel Graña <dangra@...>
 20 Nicolás Ramírez <nramirez.uy@...>
 13 Mikhail Korobov <kmike84@...>
 12 Pedro Faustino <pedrobandim@...>
 11 Steven Almeroth <sroth77@...>
  5 Rolando Espinoza La fuente <darkrho@...>
  4 Michal Danilak <mimino.coder@...>
  4 Alex Cepoi <alex.cepoi@...>
  4 Alexandr N Zamaraev (aka tonal) <tonal@...>
  3 paul <paul.tremberth@...>
  3 Martin Olveyra <molveyra@...>
  3 Jordi Llonch <llonchj@...>
  3 arijitchakraborty <myself.arijit@...>
  2 Shane Evans <shane.evans@...>
  2 joehillen <joehillen@...>
  2 Hart <HartSimha@...>
  2 Dan <ellisd23@...>
  1 Zuhao Wan <wanzuhao@...>
  1 whodatninja <blake@...>
  1 vkrest <v.krestiannykov@...>
  1 tpeng <pengtaoo@...>
  1 Tom Mortimer-Jones <tom@...>
  1 Rocio Aramberri <roschegel@...>
  1 Pedro <pedro@...>
  1 notsobad <wangxiaohugg@...>
  1 Natan L <kuyanatan.nlao@...>
  1 Mark Grey <mark.grey@...>
  1 Luan <luanpab@...>
  1 Libor Nenadál <libor.nenadal@...>
  1 Juan M Uys <opyate@...>
  1 Jonas Brunsgaard <jonas.brunsgaard@...>
  1 Ilya Baryshev <baryshev@...>
  1 Hasnain Lakhani <m.hasnain.lakhani@...>
  1 Emanuel Schorsch <emschorsch@...>
  1 Chris Tilden <chris.tilden@...>
  1 Capi Etheriel <barraponto@...>
  1 cacovsky <amarquesferraz@...>
  1 Berend Iwema <berend@...>

Scrapy 0.16.5 (发布于 2013-05-30)

  • 当 Scrapy 部署重定向到新端点时,遵守请求方法 (commit 8c4fcee)

  • 修复不准确的下载器中间件文档。refs #280 (commit 40667cb)

  • 文档:删除指向 diveintopython.org 的链接,该链接不再可用。closes #246 (commit bd58bfa)

  • 在无效的 html5 文档中查找表单节点 (commit e3d6945)

  • 修复将 attrs 类型标记为 bool 而不是列表的拼写错误 (commit a274276)

Scrapy 0.16.4 (发布于 2013-01-23)

  • 修复文档中的拼写错误 (commit 6d2b3aa)

  • 添加关于禁用扩展的文档。refs #132 (commit c90de33)

  • 修复错误消息格式。log.err() 不支持酷炫格式,并且当发生错误时,消息为:“ERROR: Error processing %(item)s” (commit c16150c)

  • 整理并改进图像管道错误日志 (commit 56b45fc)

  • 修复文档中的错别字 (commit 243be84)

  • 添加文档主题:广泛抓取和常见实践 (commit 1fbb715)

  • 修复 Scrapy parse 命令在未显式指定蜘蛛时的错误。closes #209 (commit c72e682)

  • 更新 docs/topics/commands.rst (commit 28eac7a)

Scrapy 0.16.3 (发布于 2012-12-07)

Scrapy 0.16.2 (发布于 2012-11-09)

Scrapy 0.16.1 (发布于 2012-10-26)

  • 修复 LogStats 扩展,它在 0.16 版本之前的错误合并后被破坏 (commit 8c780fd)

  • 更好的 scrapy.conf.settings 向后兼容性 (commit 3403089)

  • 扩展了有关如何从扩展访问爬虫统计信息的文档 (commit c4da0b5)

  • 删除 .hgtags(Scrapy 现在使用 git,因此不再需要)(commit d52c188)

  • 修复 rst 标题下的破折号 (commit fa4f7f9)

  • 在新闻中设置 0.16.0 的发布日期 (commit e292246)

Scrapy 0.16.0 (发布于 2012-10-18)

Scrapy 更改

  • 添加了 蜘蛛契约,这是一种以正式/可重现的方式测试蜘蛛的机制

  • runspider 命令添加了 -o-t 选项

  • 记录了 自动节流扩展 并将其添加到默认安装的扩展中。您仍然需要使用 AUTOTHROTTLE_ENABLED 启用它

  • 主要的统计信息收集重构:删除了全局/每个蜘蛛统计信息的划分,删除了与统计信息相关的信号(stats_spider_opened 等)。统计信息现在变得简单多了,在统计信息收集器 API 和信号上保持了向后兼容性。

  • 为蜘蛛中间件添加了 process_start_requests() 方法

  • 删除了 Signals 单例。现在应通过 Crawler.signals 属性访问 Signals。有关更多信息,请参阅信号文档。

  • 删除了 Stats Collector 单例。现在可以通过 Crawler.stats 属性访问 Stats。有关更多信息,请参阅统计信息收集文档。

  • 记录了 核心 API

  • lxml 现在是默认的选择器后端,而不是 libxml2

  • 移植了 FormRequest.from_response() 以使用 lxml 而不是 ClientForm

  • 删除了模块:scrapy.xlib.BeautifulSoupscrapy.xlib.ClientForm

  • SitemapSpider:添加了对以 .xml 和 .xml.gz 结尾的站点地图 URL 的支持,即使它们宣传了错误的内容类型 (commit 10ed28b)

  • StackTraceDump 扩展:还转储 trackref 活动引用 (commit fe2ce93)

  • 嵌套项现在在 JSON 和 JSONLines 导出器中得到完全支持

  • 添加了 cookiejar Request 元数据键以支持每个蜘蛛的多个 Cookie 会话

  • 将编码检测代码分离到 w3lib.encoding,并将 Scrapy 代码移植到使用该模块

  • 放弃对 Python 2.5 的支持。请参阅 https://www.zyte.com/blog/scrapy-0-15-dropping-support-for-python-2-5/

  • 放弃对 Twisted 2.5 的支持

  • 添加了 REFERER_ENABLED 设置,以控制推荐来源中间件

  • 将默认用户代理更改为:Scrapy/VERSION (+https://scrapy.net.cn)

  • scrapy.contrib.linkextractors.image中删除了(未记录的)HTMLImageLinkExtractor

  • 删除了每个蜘蛛的设置(将由实例化多个爬虫对象替换)

  • USER_AGENT蜘蛛属性将不再起作用,请改用user_agent属性

  • DOWNLOAD_TIMEOUT蜘蛛属性将不再起作用,请改用download_timeout属性

  • 删除了ENCODING_ALIASES设置,因为编码自动检测已移至w3lib

  • DjangoItem提升到主contrib

  • LogFormatter方法现在返回字典(而不是字符串),以支持延迟格式化(issue 164commit dcef7b0

  • 下载器处理器(DOWNLOAD_HANDLERS设置)现在接收设置作为__init__方法的第一个参数

  • 用(更可移植的)resource模块替换内存使用情况统计,删除了scrapy.utils.memory模块

  • 删除信号:scrapy.mail.mail_sent

  • 删除了TRACK_REFS设置,现在trackrefs始终启用

  • DBM现在是HTTP缓存中间件的默认存储后端

  • 日志消息数量(每个级别)现在通过Scrapy统计信息进行跟踪(统计信息名称:log_count/LEVEL

  • 接收到的响应数量现在通过Scrapy统计信息进行跟踪(统计信息名称:response_received_count

  • 删除了scrapy.log.started属性

Scrapy 0.14.4

Scrapy 0.14.3

  • 忘记包含pydispatch许可证。#118(commit fd85f9c

  • 在源代码分发版中包含测试套件使用的egg文件。#118(commit c897793

  • 更新项目模板中的文档字符串,以避免与genspider命令混淆,genspider命令可能被视为高级功能。引用#107(commit 2548dcc

  • 在docs/topics/firebug.rst中添加了关于Google目录关闭的注释(commit 668e352

  • 当为空时不要丢弃插槽,只需保存在另一个字典中,以便在需要时再次循环使用。(commit 8e9f607

  • 在libxml2支持的选择器中,不要在处理Unicode XPath时失败(commit b830e95

  • 修复了Request对象文档中的一个小错误(commit bf3c9ee

  • 修复了链接提取器文档中的一个小缺陷(commit ba14f38

  • 删除了一些与Scrapy中SQLite支持相关的老旧代码(commit 0665175

Scrapy 0.14.2

  • 在计算校验和之前,将缓冲区指向文件的开头。引用#92(commit 6a5bef2

  • 在持久化图像之前计算图像校验和。关闭#92(commit 9817df1

  • 删除缓存故障中的泄漏引用(commit 673a120

  • 修复了MemoryUsage扩展中的错误:get_engine_status() 恰好需要1个参数(给出0个)(commit 11133e9

  • 修复了HTTP压缩中间件上的struct.error。关闭#87(commit 1423140

  • AJAX爬取对于Unicode URL没有扩展(commit 0de3fb4

  • 捕获start_requests迭代器错误。引用#83(commit 454a21d

  • 加速libxml2 XPathSelector(commit 2fbd662

  • 根据最近的更改更新了版本控制文档(commit 0a070f5

  • scrapyd:修复了文档链接(commit 2b4e4c3

  • extras/makedeb.py:不再从git获取版本(commit caffe0e

Scrapy 0.14.1

  • extras/makedeb.py:不再从git获取版本(commit caffe0e

  • 将版本提升到0.14.1(commit 6cb9e1c

  • 修复了对教程目录的引用(commit 4b86bd6

  • 文档:从Request.replace()中删除了重复的回调参数(commit 1aeccdd

  • 修复了scrapyd文档的格式(commit 8bf19e6

  • 转储所有正在运行线程的堆栈,并修复StackTraceDump扩展转储的引擎状态(commit 14a8e6e

  • 添加了关于为什么我们在boto图像上传中禁用ssl的注释(commit 5223575

  • 当对S3进行太多并行连接时,SSL握手挂起(commit 63d583d

  • 更改教程以遵循dmoz网站上的更改(commit bcb3198

  • 避免Twisted>=11.1.0中的_disconnectedDeferred AttributeError异常(commit 98f3f87

  • 允许蜘蛛设置自动节流最大并发数(commit 175a4b5

Scrapy 0.14

新功能和设置

  • 支持可爬取AJAX的URL

  • 新的持久调度程序,将请求存储在磁盘上,允许暂停和恢复爬取(r2737

  • scrapy crawl添加了-o选项,这是将抓取的项目转储到文件(或使用-转储到标准输出)的快捷方式

  • 添加了对将自定义设置传递给Scrapyd schedule.json api的支持(r2779r2783

  • 新的ChunkedTransferMiddleware(默认启用)以支持分块传输编码r2769

  • 添加了对S3下载器处理程序的boto 2.0支持(r2763

  • marshal添加到提要导出支持的格式中(r2744

  • 在请求错误回调中,现在可以在failure.request属性中接收到有问题的请求(r2738

  • 对下载器进行了重大重构,以支持每个域/IP的并发限制(r2732
  • 添加了内置缓存DNS解析器(r2728

  • 将与Amazon AWS相关的组件/扩展(SQS蜘蛛队列,SimpleDB统计信息收集器)移至单独的项目:[scaws](https://github.com/scrapinghub/scaws)(r2706r2714

  • 将蜘蛛队列移至scrapyd:scrapy.spiderqueue -> scrapyd.spiderqueuer2708

  • 将sqlite实用程序移至scrapyd:scrapy.utils.sqlite -> scrapyd.sqliter2781

  • 真正支持在start_requests()方法中返回迭代器。当蜘蛛空闲时,迭代器现在在爬取过程中被消耗(r2704

  • 添加了REDIRECT_ENABLED设置以快速启用/禁用重定向中间件(r2697

  • 添加了RETRY_ENABLED设置以快速启用/禁用重试中间件(r2694

  • 添加了CloseSpider异常以手动关闭蜘蛛(r2691

  • 通过添加对HTML5元字符集声明的支持来改进编码检测(r2690

  • 重构了关闭爬虫的行为,使其在关闭爬虫之前等待所有下载完成并被爬虫处理(r2688)。

  • 添加了 SitemapSpider(请参阅“爬虫”页面中的文档)(r2658)。

  • 添加了 LogStats 扩展,用于定期记录基本统计信息(例如已抓取的页面和提取的项目)(r2657)。

  • 使压缩响应的处理更加健壮(#319,r2643)。现在 Scrapy 将尝试尽可能地解压缩压缩响应,而不是因 IOError 而失败。

  • 简化了 !MemoryDebugger 扩展,使其使用统计信息来转储内存调试信息(r2639)。

  • 添加了用于编辑爬虫的新命令:scrapy editr2636)和 -e 标志到 genspider 命令中使用它(r2653)。

  • 将项目的默认表示形式更改为漂亮打印的字典。(r2631)。这通过使日志在默认情况下更易读来改善了默认日志记录,适用于“Scraped”和“Dropped”行。

  • 添加了 spider_error 信号(r2628)。

  • 添加了 COOKIES_ENABLED 设置(r2625)。

  • 统计信息现在被转储到 Scrapy 日志中(STATS_DUMP 设置的默认值已更改为 True)。这样做是为了让 Scrapy 用户更加了解 Scrapy 统计信息以及在那里收集的数据。

  • 添加了对动态调整下载延迟和最大并发请求的支持(r2599)。

  • 添加了新的 DBM HTTP 缓存存储后端(r2576)。

  • 向 Scrapyd 添加了 listjobs.json API(r2571)。

  • CsvItemExporter:添加了 join_multivalued 参数(r2578)。

  • xmliter_lxml 添加了命名空间支持(r2552)。

  • 通过使 COOKIES_DEBUG 更友好并对其进行文档化来改进了 Cookie 中间件(r2579)。

  • 对 Scrapyd 和链接提取器进行了多项改进。

代码重排并删除

  • 合并了传递的项目和提取的项目概念,因为它们在过去经常造成混淆。这意味着:(r2630)。
    • 删除了原始的 item_scraped 信号。

    • 将原始的 item_passed 信号重命名为 item_scraped

    • 删除了旧的日志行 Scraped Item...

    • 将旧的日志行 Passed Item... 重命名为 Scraped Item... 行,并将其降级到 DEBUG 级别。

  • 通过将部分 Scrapy 代码剥离到两个新的库中来减少 Scrapy 代码库。
    • w3lib(来自 scrapy.utils.{http,markup,multipart,response,url} 的几个函数,在 r2584 中完成)。

    • scrapely(以前是 scrapy.contrib.ibl,在 r2586 中完成)。

  • 删除了未使用的函数:scrapy.utils.request.request_info()r2577)。

  • examples/googledir 中删除了 googledir 项目。现在 GitHub 上有一个名为 dirbot 的新示例项目:https://github.com/scrapy/dirbot

  • 删除了 Scrapy 项目中默认字段值的支持(r2616)。

  • 删除了实验性的 CrawlSpider v2(r2632)。

  • 删除了调度程序中间件以简化架构。重复项过滤器现在在调度程序本身中完成,使用与之前相同的重复项过滤类(DUPEFILTER_CLASS 设置)(r2640)。

  • 删除了将 URL 传递给 scrapy crawl 命令的支持(请改用 scrapy parse)(r2704)。

  • 删除了已弃用的执行队列(r2704)。

  • 删除了(未记录的)爬虫上下文扩展(来自 scrapy.contrib.spidercontext)(r2780)。

  • 删除了 CONCURRENT_SPIDERS 设置(请改用 scrapyd maxproc)(r2789)。

  • 重命名了核心组件的属性:downloader.sites -> downloader.slots,scraper.sites -> scraper.slots(r2717r2718)。

  • 将设置 CLOSESPIDER_ITEMPASSED 重命名为 CLOSESPIDER_ITEMCOUNTr2655)。保留了向后兼容性。

Scrapy 0.12

类似 #NNN 的数字引用了旧问题跟踪器 (Trac) 中的工单,该跟踪器已不再可用。

新功能和改进

  • 传递的项目现在在 item_passeditem 参数中发送(#273)。

  • scrapy version 命令添加了详细选项,对错误报告很有用(#298)。

  • HTTP 缓存现在默认存储在项目数据目录中(#279)。

  • 添加了项目数据存储目录(#276,#277)。

  • 记录了 Scrapy 项目的文件结构(请参阅命令行工具文档)。

  • XPath 选择器的新 lxml 后端(#147)。

  • 每个爬虫的设置(#245)。

  • 支持退出代码以在 Scrapy 命令中发出错误信号(#248)。

  • scrapy shell 命令添加了 -c 参数。

  • 使 libxml2 可选(#260)。

  • 新的 deploy 命令(#261)。

  • 添加了 CLOSESPIDER_PAGECOUNT 设置(#253)。

  • 添加了 CLOSESPIDER_ERRORCOUNT 设置(#254)。

Scrapyd 更改

  • Scrapyd 现在每个爬虫使用一个进程。

  • 它为每个爬虫运行存储一个日志文件,并轮换它们,保留每个爬虫的最新 5 个日志(默认情况下)。

  • 添加了一个最小的 Web UI,默认情况下可在 https://127.0.0.1:6800 访问。

  • 现在有一个 scrapy server 命令来启动当前项目的 Scrapyd 服务器。

设置更改

  • 添加了 HTTPCACHE_ENABLED 设置(默认为 False)以启用 HTTP 缓存中间件。

  • 更改了 HTTPCACHE_EXPIRATION_SECS 的语义:现在零表示“永不过期”。

已弃用/过时的功能

  • 已弃用 runserver 命令,而支持 server 命令,该命令启动 Scrapyd 服务器。另请参阅:Scrapyd 更改。

  • 已弃用 queue 命令,而支持使用 Scrapyd 的 schedule.json API。另请参阅:Scrapyd 更改。

  • 删除了 !LxmlItemLoader(从未升级到主 contrib 的实验性 contrib)。

Scrapy 0.10

类似 #NNN 的数字引用了旧问题跟踪器 (Trac) 中的工单,该跟踪器已不再可用。

新功能和改进

  • 名为 scrapyd 的新 Scrapy 服务,用于在生产环境中部署 Scrapy 爬虫(#218)(文档可用)。

  • 简化了 Images 管道的使用,现在不需要子类化自己的 Images 管道了(#217)。

  • Scrapy shell 现在默认显示 Scrapy 日志(#206)。

  • 在公共基础代码和称为“爬虫队列”的可插拔后端中重构了执行队列(#220)。

  • 新的持久性爬虫队列(基于 SQLite)(#198),默认情况下可用,允许在服务器模式下启动 Scrapy,然后安排爬虫运行。

  • 添加了 Scrapy 命令行工具及其所有可用子命令的文档。(文档可用)。

  • 带有可插拔后端的 Feed 导出器(#197)(文档可用)。

  • 延迟信号(#193)。

  • 向项目管道添加了两个新方法 open_spider()、close_spider(),并支持延迟(#195)。

  • 支持按爬虫覆盖默认请求标头(#181)。

  • 用具有类似功能但不依赖于 Twisted 插件的管理器替换了默认的爬虫管理器(#186)。

  • 将 Debian 包拆分为两个包——库和服务(#187)。

  • Scrapy 日志重构(#188)。

  • 用于在不同运行之间保持持久性爬虫上下文的新的扩展(#203)。

  • 添加了 dont_redirect request.meta 密钥以避免重定向(#233)。

  • 添加了 dont_retry request.meta 密钥以避免重试(#234)。

命令行工具更改

  • 新增了 scrapy 命令,取代了旧的 scrapy-ctl.py (#199) - 现在只有一个全局的 scrapy 命令,而不是每个项目一个 scrapy-ctl.py - 为 Windows 添加了 scrapy.bat 脚本,方便在 Windows 上运行。

  • 为命令行工具添加了 bash 自动补全功能 (#210)

  • 将命令 start 重命名为 runserver (#209)

API 更改

  • Request 对象的 urlbody 属性现在是只读的 (#230)

  • Request.copy()Request.replace() 现在也复制它们的 callbackerrback 属性 (#231)

  • scrapy.contrib 中删除了 UrlFilterMiddleware(默认情况下已禁用)

  • 如果一个 spider 没有 allowed_domains 属性,则 Offsite 中间件不会过滤掉来自该 spider 的任何请求 (#225)

  • 删除了 Spider Manager 的 load() 方法。现在 spiders 在 __init__ 方法本身中加载。

  • Scrapy Manager(现称为“Crawler”)的更改
    • scrapy.core.manager.ScrapyManager 类重命名为 scrapy.crawler.Crawler

    • scrapy.core.manager.scrapymanager 单例移动到 scrapy.project.crawler

  • 移动模块:scrapy.contrib.spidermanager 移动到 scrapy.spidermanager

  • Spider Manager 单例从 scrapy.spider.spiders 移动到 spiders` attribute of ``scrapy.project.crawler 单例。

  • 移动了 Stats Collector 类:(#204)
    • scrapy.stats.collector.StatsCollector 移动到 scrapy.statscol.StatsCollector

    • scrapy.stats.collector.SimpledbStatsCollector 移动到 scrapy.contrib.statscol.SimpledbStatsCollector

  • 默认的每个命令设置现在在命令对象类的 default_settings 属性中指定 (#201)

  • 将 Item Pipeline 的 process_item() 方法的参数从 (spider, item) 更改为 (item, spider)
    • 保留了向后兼容性(并带有弃用警告)

  • 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_USERMAIL_PASS (r2065 | #149)

  • 添加了新的 scrapy-ctl view 命令 - 在浏览器中查看 Scrapy 所看到的 URL (r2039)

  • 添加了用于控制 Scrapy 进程的 Web 服务(这也弃用了 Web 控制台)。(r2053 | #167)

  • 支持将 Scrapy 作为服务运行,用于生产系统 (r1988r2054r2055r2056r2057 | #168)

  • 添加了包装归纳库(目前仅在源代码中提供文档)。(r2011)

  • 简化并改进了响应编码支持 (r1961r1969)

  • 添加了 LOG_ENCODING 设置 (r1956,文档可用)

  • 添加了 RANDOMIZE_DOWNLOAD_DELAY 设置(默认启用)(r1923,文档可用)

  • MailSender 不再是 IO 阻塞的 (r1955 | #146)

  • Linkextractors 和新的 Crawlspider 现在处理相对 base 标签 url (r1960 | #148)

  • 对 Item Loaders 和处理器进行了一些改进 (r2022r2023r2024r2025r2026r2027r2028r2029r2030)

  • 添加了向 telnet 控制台添加变量的支持 (r2047 | #165)

  • 支持没有回调的请求 (r2050 | #166)

API 更改

  • Spider.domain_name 更改为 Spider.name (SEP-012,r1975)

  • Response.encoding 现在是检测到的编码 (r1961)

  • HttpErrorMiddleware 现在返回 None 或引发异常 (r2006 | #157)

  • scrapy.command 模块重定位 (r2035r2036r2037)

  • 添加了 ExecutionQueue 用于为 spiders 提供抓取内容 (r2034)

  • 删除了 ExecutionEngine 单例 (r2039)

  • 移植了 S3ImagesStore(图像管道),以使用 boto 和线程 (r2033)

  • 移动模块:scrapy.management.telnet 移动到 scrapy.telnet (r2047)

默认设置更改

  • 将默认的 SCHEDULER_ORDER 更改为 DFO (r1939)

Scrapy 0.8

类似 #NNN 的数字引用了旧问题跟踪器 (Trac) 中的工单,该跟踪器已不再可用。

新功能

  • 添加了 DEFAULT_RESPONSE_ENCODING 设置 (r1809)

  • FormRequest.from_response() 方法添加了 dont_click 参数 (r1813r1816)

  • FormRequest.from_response() 方法添加了 clickdata 参数 (r1802r1803)

  • 添加了对 HTTP 代理的支持 (HttpProxyMiddleware) (r1781r1785)

  • Offsite spider 中间件现在在过滤掉请求时记录消息 (r1841)

向后不兼容的更改

  • 更改了 scrapy.utils.response.get_meta_refresh() 的签名 (r1804)

  • 删除了已弃用的 scrapy.item.ScrapedItem 类 - 请改用 scrapy.item.Item instead (r1838)

  • 删除了已弃用的 scrapy.xpath 模块 - 请改用 scrapy.selector。(r1836)

  • 删除了已弃用的 core.signals.domain_open 信号 - 请改用 core.signals.domain_opened (r1822)

  • log.msg() 现在接收一个 spider 参数 (r1822)

    • 旧的 domain 参数已弃用,将在 0.9 版本中移除。对于 spider,您应该始终使用 spider 参数并传递 spider 引用。如果您确实想传递字符串,请改用 component 参数。

  • 更改了核心信号 domain_openeddomain_closeddomain_idle

  • 更改了 Item Pipeline 以使用 spider 而不是 domain
    • process_item() Item Pipeline 方法的 domain 参数已更改为 spider,新的签名为:process_item(spider, item) (r1827 | #105)

    • 要快速移植您的代码(使其与 Scrapy 0.8 兼容),只需在以前使用 domain 的地方使用 spider.domain_name

  • 更改了 Stats API 以使用 spider 而不是 domain (r1849 | #113)
    • StatsCollector 已更改为在其方法(set_valueinc_value 等)中接收 spider 引用(而不是 domain)。

    • 添加了 StatsCollector.iter_spider_stats() 方法

    • 移除了 StatsCollector.list_domains() 方法

    • 此外,Stats 信号已重命名,现在传递 spider 引用(而不是 domain)。以下是更改摘要

    • 要快速移植您的代码(使其与 Scrapy 0.8 兼容),只需在以前使用 domain 的地方使用 spider.domain_namespider_stats 包含与 domain_stats 完全相同的数据。

  • CloseDomain 扩展已移动到 scrapy.contrib.closespider.CloseSpider (r1833)
    • 其设置也已重命名
      • CLOSEDOMAIN_TIMEOUT 重命名为 CLOSESPIDER_TIMEOUT

      • CLOSEDOMAIN_ITEMCOUNT 重命名为 CLOSESPIDER_ITEMCOUNT

  • 已移除弃用的 SCRAPYSETTINGS_MODULE 环境变量 - 请改用 SCRAPY_SETTINGS_MODULE (r1840)

  • 重命名设置:REQUESTS_PER_DOMAIN 重命名为 CONCURRENT_REQUESTS_PER_SPIDER (r1830r1844)

  • 重命名设置:CONCURRENT_DOMAINS 重命名为 CONCURRENT_SPIDERS (r1830)

  • 重构了 HTTP 缓存中间件

  • HTTP 缓存中间件已进行了大量重构,保留了相同的功能,除了已移除的 domain 分区功能。( r1843 )

  • 重命名异常:DontCloseDomain 重命名为 DontCloseSpider (r1859 | #120)

  • 重命名扩展:DelayedCloseDomain 重命名为 SpiderCloseDelay (r1861 | #121)

  • 已移除过时的 scrapy.utils.markup.remove_escape_chars 函数 - 请改用 scrapy.utils.markup.replace_escape_chars (r1865)

Scrapy 0.7

Scrapy 的第一个版本。