发布说明

Scrapy 2.12.0 (2024-11-18)

亮点:

修改后的需求

向后不兼容的更改

  • 用户定义的用于HTTPS请求的cookies将设置secure标志为True,除非显式设置为False。这在HTTP请求中重用这些cookies时非常重要,例如在重定向到HTTP URL之后。 (issue 6357)

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

  • scrapy.pipelines.media.MediaPipeline 及其子类的初始化 API 已经改进,可能会导致一些以前正常使用的场景不再适用。只有当你定义了 MediaPipeline 的自定义子类,或者通过 from_settings()__init__() 调用而不是 from_crawler() 调用来创建这些管道的实例时,才会影响到你。

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

    现在,根据from_crawler()from_settings()的一般用法以及后者的弃用,推荐的初始化顺序如下:

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

    • 不应定义from_settings()方法。特定于类的初始化代码应放入重写的from_crawler()方法或__init__()中。

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

    • 如果管道实例是通过from_settings()__init__()调用创建的(这在之前也不被支持,因为它缺少 重要的初始化代码),现在应该通过 from_crawler()调用来创建它们。

    (issue 6540)

  • response_body 参数在 ImagesPipeline.convert_image 中现在是仅限位置的,因为它从可选变为必需。 (issue 6500)

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

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

弃用移除

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

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

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

  • 移除了scrapy.downloadermiddlewares.decompression模块, 该模块在Scrapy 2.7.0中已被弃用。 (issue 6100, issue 6113)

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

  • 具有蜘蛛级别HTTP认证的蜘蛛,即具有http_userhttp_pass属性的蜘蛛,现在还必须定义http_auth_domain,这是在Scrapy 2.5.1中引入的。 (issue 6103, issue 6113)

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

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

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

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

  • 移除了scrapy.http.JSONRequest类,在Scrapy 1.8.0中被JsonRequest取代。 (issue 6110, issue 6113)

  • scrapy.utils.log.logformatter_adapter 不再支持缺失的 args, level, 或 msg 参数,也不再支持 format 参数,这些场景在 Scrapy 1.0.0 中已被弃用。 (issue 6109, issue 6116)

  • 分配给SPIDER_LOADER_CLASS设置的未实现ISpiderLoader接口的自定义类现在将在运行时引发zope.interface.verify.DoesNotImplement异常。自Scrapy 1.0.0以来,不符合要求的类已经触发了弃用警告。 (issue 6101, issue 6113)

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

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

  • 子类化 HttpCompressionMiddleware 而不支持__init__()中的crawler参数,并且没有自定义的from_crawler()方法,在Scrapy 2.5.0中已被弃用,不再允许。 (issue 6500)

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

  • 移除了在没有安装boto3包的情况下对S3 feed exports的支持,该功能在Scrapy 2.10.0中已被弃用。 (issue 6500)

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

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

  • response_body 参数在 ImagesPipeline.convert_image 中现在是必需的, 在 Scrapy 2.8.0 中不传递它已被弃用。 (issue 6500)

  • 移除了custom参数,该参数在Scrapy 2.10.0中已被弃用。 (issue 6500)

  • 移除了在Scrapy 2.9.0中已弃用的scrapy.utils.reactor.get_asyncio_event_loop_policy()函数。请使用asyncio.get_event_loop()及相关标准库函数代替。 (issue 6500)

弃用

  • 具有from_settings()方法的Scrapy组件现在已被弃用。现在应该使用from_crawler()代替。受影响的组件:

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

新功能

改进

错误修复

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

  • 修复了在合同提取中处理无效的@前缀行的问题。 (issue 6383, issue 6388)

  • 导入 scrapy.extensions.telnet 不再安装默认的反应器。 (issue 6432)

  • 减少了在2.11.2版本中增加的丢弃请求的日志冗长性。 (issue 6433, issue 6475)

文档

质量保证

其他

Scrapy 2.11.2 (2024-05-14)

安全漏洞修复

错误修复

文档

质量保证

Scrapy 2.11.1 (2024-02-14)

亮点:

  • 安全漏洞修复。

  • 支持 Twisted >= 23.8.0。

  • 文档改进。

安全漏洞修复

修改后的需求

错误修复

文档

质量保证

Scrapy 2.11.0 (2023-09-18)

亮点:

向后不兼容的更改

弃用移除

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

    注意

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

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

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

弃用

新功能

错误修复

文档

质量保证

Scrapy 2.10.1 (2023-08-30)

标记 Twisted >= 23.8.0 为不受支持。 (issue 6024, issue 6026)

Scrapy 2.10.0 (2023-08-04)

亮点:

  • 增加了对Python 3.12的支持,取消了对Python 3.7的支持。

  • 新的附加组件框架简化了支持它的第三方组件的配置。

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

  • 许多针对feed导出的修复和改进。

修改后的需求

向后不兼容的更改

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

弃用移除

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

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

  • scrapy.squeues 类中的 PickleFifoDiskQueueNonRequestPickleLifoDiskQueueNonRequestMarshalFifoDiskQueueNonRequestMarshalLifoDiskQueueNonRequest 在 Scrapy 2.6 中已被弃用,现已被移除。(issue 5994issue 5996

  • 属性 open_spiders 和方法 has_capacity 以及 schedulescrapy.core.engine.ExecutionEngine 中, 已在 Scrapy 2.6 中弃用,现已被移除。(issue 5994, issue 5998)

  • spider参数传递给 spider_is_idle()crawl()download()方法 scrapy.core.engine.ExecutionEngine,在Scrapy 2.6中已弃用,不再支持。(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 5726, issue 5923)

新功能

错误修复

文档

质量保证

Scrapy 2.9.0 (2023-05-08)

亮点:

  • 每个域的下载设置。

  • 兼容新的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.utils.python.to_native_str 函数在 Scrapy 2.0 中已被弃用,现已被移除。请改用 scrapy.utils.python.to_unicode()。 (issue 5719)

  • 在Scrapy 2.0中已弃用的scrapy.utils.python.MutableChain.next方法,现已被移除。请改用__next__()。 (issue 5719)

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

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

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

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

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

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

弃用

新功能

错误修复

文档

质量保证

Scrapy 2.7.1 (2022-11-02)

新功能

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

错误修复

文档

质量保证

Scrapy 2.7.0 (2022-10-17)

亮点:

  • 增加了对Python 3.11的支持,取消了对Python 3.6的支持

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

  • Asyncio support 默认在新项目中启用

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

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

修改后的需求

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

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

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

弃用

新功能

错误修复

文档

质量保证

Scrapy 2.6.3 (2022-09-27)

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版本中引入的以下回归问题:

Scrapy 2.6.1 (2022-03-01)

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

Scrapy 2.6.0 (2022-03-01)

亮点:

安全漏洞修复

  • 当一个定义了cookies的Request对象收到一个重定向响应,导致一个新的Request对象被调度时,原始Request对象中定义的cookies将不再复制到新的Request对象中。

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

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

    注意

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

  • 当cookie的域,无论是在响应的Set-Cookie头中接收到的,还是在Request对象中定义的,被设置为公共后缀时,除非cookie域与请求域相同,否则现在将忽略该cookie。

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

修改后的需求

向后不兼容的更改

  • formdata 参数在 FormRequest 中,如果为非 POST 请求指定,现在会覆盖 URL 查询字符串,而不是附加到它后面。(issue 2919, issue 3579)

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

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

    这些方法过去假设 ExecutionEngine.slot 已经通过先前调用 open_spider() 定义,因此它们会引发 AttributeError 而不是其他错误。

  • 如果配置的scheduler的API不符合预期,现在会在启动时抛出TypeError。在此之前,其他异常会在运行时抛出。(issue 3559)

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

弃用移除

  • scrapy.http.TextResponse.body_as_unicode,在Scrapy 2.2中已弃用,现在已被移除。(issue 5393)

  • scrapy.item.BaseItem,在Scrapy 2.2中已弃用,现已被移除。 (issue 5398)

  • scrapy.item.DictItem,在Scrapy 1.8中已弃用,现已被移除。 (issue 5398)

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

弃用

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

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

  • scrapy.squeues 中,以下队列类已被弃用: PickleFifoDiskQueueNonRequest, PickleLifoDiskQueueNonRequest, MarshalFifoDiskQueueNonRequest, 和 MarshalLifoDiskQueueNonRequest。你应该 改为使用: PickleFifoDiskQueue, PickleLifoDiskQueue, MarshalFifoDiskQueue, 和 MarshalLifoDiskQueue。 (issue 5117)

  • scrapy.core.engine.ExecutionEngine 的许多方面来自于这个类可以同时处理多个 Spider 对象的时代,这些功能已被弃用。(issue 5090)

    • has_capacity() 方法 已被弃用。

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

    • open_spiders 属性 已被弃用,请使用 spider 代替。

    • spider 参数在以下方法中已被弃用:

      • spider_is_idle()

      • crawl()

      • download()

      相反,首先调用 open_spider() 来设置 Spider 对象。

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

新功能

错误修复

文档

质量保证

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)

亮点:

弃用移除

弃用

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

新功能

错误修复

文档

质量保证

Scrapy 2.4.1 (2020-11-17)

Scrapy 2.4.0 (2020-10-11)

亮点:

  • Python 3.5 支持已被放弃。

  • 媒体管道file_path方法现在可以访问源项目

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

  • 新的item_export_kwargs键在FEEDS设置中允许定义关键字参数传递给项目导出类

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

    例如,当使用crawlrunspider命令时,你可以使用-O选项而不是-o来覆盖输出文件。

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

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

修改后的需求

向后不兼容的更改

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

    我们决定撤销这个在Scrapy 2.2.0中引入的错误修复,因为有报告称当前的实现可能会破坏现有代码。

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

    Scrapy的未来版本将包含一个新的、更好的实现,以修复被回滚的错误。

    (issue 4717, issue 4823)

弃用移除

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

  • Rule.process_request 不再接受只期望一个request参数的可调用对象, 而不是同时期望requestresponseissue 4818

弃用

新功能

错误修复

文档

质量保证

Scrapy 2.3.0 (2020-08-04)

亮点:

弃用移除

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

    • htmlparser.HtmlParserLinkExtractor

    • regex.RegexLinkExtractor

    • sgml.BaseSgmlLinkExtractor

    • sgml.SgmlLinkExtractor

    使用 LinkExtractor 代替 (issue 4356, issue 4679)

弃用

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

新功能

错误修复

文档

质量保证

Scrapy 2.2.1 (2020-07-17)

Scrapy 2.2.0 (2020-06-24)

亮点:

向后不兼容的更改

  • 对 Python 3.5.0 和 3.5.1 的支持已被放弃;Scrapy 现在拒绝在低于 3.5.2 的 Python 版本上运行,该版本引入了 typing.Type (issue 4615)

弃用

新功能

错误修复

文档

质量保证

Scrapy 2.1.0 (2020-04-24)

亮点:

向后不兼容的更改

  • AssertionError 异常由 assert 语句触发,已被新的异常类型取代,以支持在优化模式下运行 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)

弃用

新功能

错误修复

  • 请求序列化 不再会破坏那些作为蜘蛛属性的回调函数,这些回调函数被赋予了一个不同名称的函数 (问题 4500)

  • None 值在 allowed_domains 中不再导致 TypeError 异常 (issue 4410)

  • Zsh 补全不再允许在参数后使用选项 (issue 4438)

  • 现在支持 zope.interface 5.0.0 及更高版本 (issue 4447, issue 4448)

  • Spider.make_requests_from_url,在Scrapy 1.4.0中已弃用,现在使用时将发出警告(issue 4412

文档

质量保证

Scrapy 2.0.1 (2020-03-18)

Scrapy 2.0.0 (2020-03-03)

亮点:

向后不兼容的更改

弃用移除

  • Scrapy shell 不再提供 sel 代理对象,请使用 response.selector 代替 (issue 4347)

  • LevelDB 支持已被移除 (issue 4112)

  • 以下函数已从scrapy.utils.python中移除: isbinarytext, is_writable, setattr_default, stringify_dict (issue 4362)

弃用

新功能

错误修复

文档

质量保证

调度器队列类的更改

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

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

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

  • __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.schedulerScrapyPriorityQueueDownloaderAwarePriorityQueue类,并可能影响子类:

  • __init__方法中,上述描述的大部分更改都适用。

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

    • downstream_queue_cls,它取代了qfactory,必须以不同的方式实例化。

      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)

安全漏洞修复:

Scrapy 1.8.3 (2022-07-25)

安全漏洞修复:

  • HttpProxyMiddleware 处理带有proxy元数据的请求时,并且该 proxy元数据包括代理凭证, HttpProxyMiddleware会设置 Proxy-Authorization头,但仅在该头尚未设置的情况下。

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

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

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

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

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

    • 如果正在处理的请求定义了proxy元数据 但没有凭据,则Proxy-Authorization头将被移除 除非它最初是为相同的代理URL定义的。

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

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

      不再可能通过 proxy 元数据设置代理URL,而是通过 Proxy-Authorization 头设置凭证。请通过 proxy 元数据设置代理凭证。

Scrapy 1.8.2 (2022-03-01)

安全漏洞修复:

  • 当一个定义了cookies的Request对象收到一个重定向响应,导致一个新的Request对象被调度时,原始Request对象中定义的cookies将不再复制到新的Request对象中。

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

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

    注意

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

  • 当cookie的域,无论是在响应的Set-Cookie头中接收到的,还是在Request对象中定义的,被设置为公共后缀时,除非cookie域与请求域相同,否则现在将忽略该cookie。

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

Scrapy 1.8.1 (2021-10-05)

  • 安全漏洞修复:

    如果您使用 HttpAuthMiddleware (即 http_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)

亮点:

向后不兼容的更改

另请参阅下面的弃用移除

新功能

错误修复

文档

弃用移除

弃用

其他更改

Scrapy 1.7.4 (2019-10-21)

撤销对问题3804的修复(问题3819),该修复有一些不希望的副作用(问题3897问题3976)。

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

Scrapy 1.7.3 (2019-08-01)

为Python 3.4强制使用lxml 4.3.5或更低版本(issue 3912, issue 3918)。

Scrapy 1.7.2 (2019-07-23)

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

Scrapy 1.7.1 (2019-07-18)

重新打包的Scrapy 1.7.0,该版本在PyPI上缺少一些更改。

Scrapy 1.7.0 (2019-07-18)

注意

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

亮点:

  • 针对多域名爬取的改进

  • 一种更清晰的方式将参数传递给回调函数

  • 用于JSON请求的新类

  • 基于规则的爬虫的改进

  • Feed导出的新功能

向后不兼容的更改

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

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

  • Crawler, CrawlerRunner.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 (参见 Logging)

  • 来自 scrapy.pipelines:

    • files.FilesPipeline.file_key (使用 file_path)

    • images.ImagesPipeline.file_key (使用 file_path)

    • images.ImagesPipeline.image_key (使用 file_path)

    • images.ImagesPipeline.thumb_key (使用 thumb_path)

  • 来自 scrapy.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):

弃用

  • queuelib.PriorityQueue 值用于 SCHEDULER_PRIORITY_QUEUE 设置已被弃用。请使用 scrapy.pqueues.ScrapyPriorityQueue 代替。

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

  • 以下模块已弃用:

  • scrapy.utils.datatypes.MergeDict 类在 Python 3 代码库中已被弃用。请改用 ChainMap。(issue 3878

  • scrapy.utils.gz.is_gzipped 函数已被弃用。请使用 scrapy.utils.gz.gzip_magic_number 代替。

其他更改

Scrapy 1.6.0 (2019-01-30)

亮点:

  • 更好的Windows支持;

  • Python 3.7 兼容性;

  • 大幅改进的文档,包括从.extract_first() + .extract() API切换到.get() + .getall() API;

  • feed 导出,FilePipeline 和 MediaPipeline 的改进;

  • 更好的扩展性:item_errorrequest_reached_downloader 信号;from_crawler 支持 用于feed导出器、feed存储和去重过滤器。

  • scrapy.contracts 修复和新功能;

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

  • 清理已弃用的代码;

  • 各种错误修复,代码库中的小新功能和可用性改进。

选择器API更改

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

最明显的变化是现在更倾向于使用 .get().getall() 选择器方法,而不是 .extract_first().extract()。我们认为这些新方法使代码更加简洁和易读。更多详情请参见 extract() 和 extract_first()

注意

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

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

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

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

Telnet控制台

向后不兼容: Scrapy 的 telnet 控制台现在需要用户名和密码。详情请参见 Telnet 控制台。此更改修复了一个安全问题;详情请参见 Scrapy 1.5.2 (2019-01-22) 发布说明。

新的扩展功能

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

  • from_crawler 支持已添加到 dupefilters (issue 2956); 这允许从 dupefilter 访问例如设置或蜘蛛。

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

  • request_reached_downloader 当下载器接收到一个新的请求时触发;这个信号对于自定义调度器非常有用(issue 3393)。

  • 新的SitemapSpider sitemap_filter() 方法允许 在SitemapSpider子类中根据其属性选择站点地图条目 (issue 3512).

  • 现在,下载处理器的懒加载是可选的;这使得在自定义下载处理器中能够更好地处理初始化错误(问题 3394)。

新文件管道和媒体管道功能

scrapy.contracts 改进

  • 合约代码中的异常处理得到了改进(issue 3377);

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

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

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

可用性改进

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

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

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

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

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

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

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

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

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

错误修复

  • 修复了在Windows下导出的.csv文件中出现额外空白行的问题 (issue 3039);

  • 在Python 3中序列化对象以用于磁盘队列时正确处理pickling错误(issue 3082

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

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

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

文档改进

弃用移除

移除了对1.0版本之前Scrapy模块名称的兼容性填充(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 3327, issue 3359)。

其他改进和清理

Scrapy 1.5.2 (2019-01-22)

  • 安全漏洞修复:Telnet控制台扩展容易被恶意网站通过向http://localhost:6023发送POST内容来利用,我们尚未找到从Scrapy中利用它的方法,但很容易诱使浏览器这样做,从而增加了本地开发环境的风险。

    此修复是向后不兼容的,它默认启用了telnet用户密码认证,并使用随机生成的密码。如果您不能立即升级,请考虑将TELNETCONSOLE_PORT设置为其默认值之外的值。

    查看 telnet console 文档以获取更多信息

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

Scrapy 1.5.1 (2018-07-12)

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

Scrapy 1.5.0 (2017-12-29)

此版本带来了代码库中的一些小新功能和改进。 一些亮点:

  • Google Cloud Storage 在 FilesPipeline 和 ImagesPipeline 中得到支持。

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

  • 警告、异常和日志消息已改进,以使调试更容易。

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

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

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

  • 文档一如既往地得到了改进。

向后不兼容的更改

  • Scrapy 1.5 放弃了对 Python 3.3 的支持。

  • 默认的Scrapy User-Agent现在使用指向scrapy.org的https链接(issue 2983)。 这在技术上是向后不兼容的;如果你依赖旧值,请覆盖 USER_AGENT

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

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

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

新功能

  • 支持在Response.follow中使用标签 (issue 2785)

  • 支持 ptpython REPL (issue 2654)

  • Google Cloud Storage 对 FilesPipeline 和 ImagesPipeline 的支持 (issue 2923).

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

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

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

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

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

  • scrapy.mail.MailSender 现在可以在 Python 3 中工作(需要 Twisted 17.9.0)

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

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

  • 当解析回调未定义时,NotImplementedError 的明确消息 (issue 2831)

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

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

  • 为超过DOWNLOAD_WARNSIZEDOWNLOAD_MAXSIZE限制的响应提供更好的日志消息(问题 2927

  • 当URL被放入Spider.allowed_domains而不是域名时显示警告(问题2250)。

错误修复

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

  • 默认的Scrapy User-Agent现在使用指向scrapy.org的https链接(issue 2983)。 这在技术上是向后不兼容的;如果你依赖旧值,请覆盖 USER_AGENT

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

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

  • 为Debian Jessie的tox测试环境添加cryptographyissue 2848

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

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

  • 在Python 3中使用getfullargspec来停止DeprecationWarning (issue 2862)

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

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

文档

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

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

  • 在文档中包含对Scrapy子版块的引用

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

  • 文档 CloseSpider 扩展改进 (issue 2759)

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

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

  • 澄清 CSVFeedSpider.headers 文档 (issue 2826)

  • 文档 DontCloseSpider 异常并澄清 spider_idle (issue 2791)

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

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

  • 修复了startproject参数描述中的小问题 (issue 2866)

  • 在Response.body文档中明确数据类型 (issue 2922)

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

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

  • 项目结构的最新示例 (issue 2964, issue 2976)

  • ItemExporters 使用的一个更好的例子 (issue 2989)

  • 文档 from_crawler 方法用于爬虫和下载器中间件 (issue 3019)

Scrapy 1.4.0 (2017-05-18)

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

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

有一个新的response.follow方法 用于创建请求;现在这是在Scrapy爬虫中创建请求的推荐方式。这种方法使得编写正确的爬虫更加容易;response.follow相比于直接创建 scrapy.Request对象有几个优势:

  • 它处理相对URL;

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

  • 除了绝对和相对URL外,它还支持选择器; 对于元素,它还可以提取它们的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爬虫更易于调试,Scrapy在1.4版本中默认记录了更多的统计信息:内存使用统计、详细的重试统计、详细的HTTP错误代码统计。一个类似的变化是,HTTP缓存路径现在也在日志中可见。

最后但同样重要的是,Scrapy现在可以选择使JSON和XML项目更易于人类阅读,项目之间有换行,甚至可以使用新的FEED_EXPORT_INDENT设置自定义缩进偏移量。

享受吧!(或者继续阅读本版本中的其他更改。)

弃用和向后不兼容的更改

  • 默认设置为 canonicalize=Falsescrapy.linkextractors.LinkExtractor (issue 2537, 修复了 issue 1941issue 1982): 警告,这在技术上是向后不兼容的

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

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

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

新功能

错误修复

清理与重构

  • 测试:删除临时文件和文件夹(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版本设置上下文工厂实现(问题2577,修复了问题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(问题2457)。

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

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

错误修复

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

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

  • 修复与文件和图像管道相关的*_EXPIRES settings的测试(issue 2460)。

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

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

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

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

文档

  • 重写行为准则部分并升级至贡献者契约v1.4 (issue 2469).

  • 澄清传递蜘蛛参数会将其转换为蜘蛛属性 (issue 2483).

  • 文档 formid 参数在 FormRequest.from_response() 上 (issue 2497).

  • 为README文件添加.rst扩展名(问题2507)。

  • 提到LevelDB缓存存储后端(问题2525)。

  • 在示例回调代码中使用 yield (issue 2533).

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

  • 拼写错误 (issue 2512, issue 2534, issue 2531).

清理

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

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

  • 移除支持旧版Twisted的无效代码(issue 2544)。

Scrapy 1.3.0 (2016-12-21)

这个版本在1.2.2之后很快就发布了,主要原因如下: 发现从0.18到1.2.2(包括1.2.2)的版本使用了一些从Twisted移植的代码(scrapy.xlib.tx.*), 即使有更新的Twisted模块可用。 Scrapy现在直接使用twisted.web.clienttwisted.internet.endpoints。 (另请参阅下面的清理。)

由于这是一个重大变化,我们希望在不破坏任何使用1.2系列的项目的情况下,快速发布错误修复。

新功能

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

  • scrapy fetch url, scrapy shell urlfetch(url) 在 Scrapy shell 中现在默认遵循 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中重新出现的问题396,已在问题2418中修复)

  • 处理robots.txt时的几个补丁:

    • 处理(非标准)相对站点地图URL(issue 2390

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

文档

其他更改

  • 宣传 conda-forge 作为 Scrapy 的官方 conda 渠道 (issue 2387)

  • 在非文本响应上尝试使用.css().xpath()时,提供更有帮助的错误信息(问题2264

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

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

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

Scrapy 1.2.1 (2016-10-21)

错误修复

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

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

文档

  • 修复 JsonWriterPipeline 示例 (issue 2302).

  • 各种注意事项:关于蜘蛛名称的问题2330, 关于中间件方法处理顺序的问题2329, 关于将多值HTTP头作为列表获取的问题2327

其他更改

  • 从内置爬虫模板中的start_urls移除了www.issue 2299)。

Scrapy 1.2.0 (2016-10-03)

新功能

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

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

  • 新增 SCHEDULER_DEBUG 设置以记录请求序列化失败的情况 (issue 1610)。

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

  • application/json-amazonui-streaming 解释为 TextResponse (issue 1503).

  • scrapy 在使用 shell 工具时默认导入 (shell, inspect_response) (issue 2248).

错误修复

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

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

  • Selector 不再允许同时传递 responsetext (issue 2153).

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

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

  • 修复了在使用CrawlSpiderscrapy parse时选择的回调问题 (issue 2225).

  • 修复了当爬虫未产生任何项目时无效的JSON和XML文件的问题(问题 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)

错误修复

  • ImagesPipelineFilesPipeline 子类的类属性在 1.1.1 版本之前的工作方式保持不变 (issue 2243, 修复了 issue 2198)

文档

Scrapy 1.1.2 (2016-08-18)

错误修复

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

  • IMAGES_EXPIRES 默认值恢复为90 (此回归问题在1.1.1版本中引入)

Scrapy 1.1.1 (2016-07-13)

错误修复

新功能

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

  • 默认情况下重试HTTPS CONNECT TunnelError (issue 1974)

文档

测试

  • 在Travis CI上升级py.test要求并将pytest-cov固定到2.2.1 (issue 2095)

Scrapy 1.1.0 (2016-05-11)

此1.1版本带来了许多有趣的功能和错误修复:

  • Scrapy 1.1 支持 Python 3 的测试版(需要 Twisted >= 15.5)。有关更多详情和一些限制,请参见 Beta Python 3 Support

  • 热门新功能:

  • 这些错误修复可能需要您的关注:

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

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

    • 默认情况下,新创建的项目已启用Robots.txt合规性 (issue 1724)。Scrapy还会在继续爬取之前等待robots.txt下载完成 (issue 1735)。如果你想禁用 此行为,请在创建新项目后更新ROBOTSTXT_OBEYsettings.py文件中。

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

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

    • 当上传文件或图片到S3(使用FilesPipelineImagesPipeline)时,默认的ACL策略现在是“private”而不是 “public” 警告:向后不兼容!。 你可以使用FILES_STORE_S3_ACL来更改它。

    • 我们已经重新实现了canonicalize_url()以获得更正确的输出,特别是对于包含非ASCII字符的URL(问题1947)。与之前的Scrapy版本相比,这可能会改变链接提取器的输出。这也可能使您从1.1版本之前的运行中仍然保留的一些缓存条目失效。警告:向后不兼容!

继续阅读以了解更多关于其他改进和错误修复的详细信息。

Beta Python 3 支持

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

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

  • Scrapy 在 Windows 上不支持 Python 3

  • 不支持发送电子邮件

  • 不支持FTP下载处理器

  • 不支持Telnet控制台

其他新功能和增强功能

弃用和移除

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

  • binary_is_text 被引入,以取代 isbinarytext 的使用 (但返回值相反)(issue 1851

  • optional_features 集合已被移除 (issue 1359)。

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

  • 以下数据类型已被弃用(问题 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缓存检查了错误的修改时间(问题 1875

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

  • 文档:选择器示例中的一致性(问题 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)

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

支持在爬虫中返回字典

声明和返回Scrapy Items不再是收集从你的爬虫中抓取的数据的必要步骤,你现在可以返回明确的字典来代替。

经典版本

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

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

新版本

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

每个爬虫的设置 (GSoC 2014)

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

开始使用它,通过在您的爬虫中定义一个custom_settings类变量:

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

了解更多关于设置填充的信息:Settings

Python 日志记录

Scrapy 1.0 已经从 Twisted 日志系统转向支持 Python 内置的日志系统作为默认日志系统。我们保留了大部分旧的自定义接口以调用日志函数,但你会收到警告,建议完全切换到 Python 日志 API。

旧版本

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

新版本

import logging
logging.info('MESSAGE')

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

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

更多信息请参阅日志记录文档:Logging

爬虫API重构(GSoC 2014)

去年Google Summer of Code的另一个里程碑是对内部API进行了重构,旨在寻求更简单和更易用的方式。请查看新的核心接口:Core API

一个常见的情况是,当你从脚本运行Scrapy时,你会面临这些变化。这里有一个快速示例,展示了如何使用新API手动运行一个Spider:

from scrapy.crawler import CrawlerProcess

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

请记住,此功能仍在开发中,其API在达到稳定状态之前可能会发生变化。

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

模块重定位

为了改进Scrapy的整体结构,模块进行了大规模的重新排列。主要变化是将各种子包分离到新项目中,并将scrapy.contribscrapy.contrib_exp合并到顶级包中。在内部重新定位时保持了向后兼容性,而导入已弃用的模块时会出现警告,指示它们的新位置。

完整的重定位列表

外包包

注意

这些扩展经历了一些小的变化,例如一些设置名称被更改。请查看每个新仓库中的文档以熟悉新的使用方法。

旧位置

新位置

scrapy.commands.deploy

scrapyd-client (查看其他替代方案: 部署爬虫

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

更新日志

新功能和增强

弃用和移除

  • 弃用htmlparser链接提取器 (issue 1205)

  • 从FeedExporter中移除已弃用的代码 (issue 1155)

  • 为了兼容.15的遗留问题 (issue 925)

  • 放弃对CONCURRENT_REQUESTS_PER_SPIDER的支持 (issue 895)

  • 删除旧的引擎代码 (issue 911)

  • 弃用 SgmlLinkExtractor (issue 777)

重定位

文档

Bug修复

  • 项目多重继承修复 (issue 353, issue 1228)

  • ItemLoader.load_item: 遍历字段的副本 (issue 722)

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

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

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

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

  • 修复了启用的扩展、中间件、管道信息不再打印的问题 (issue 879)

  • 修复当在meta中设置为false时dont_merge_cookies的不良行为 (issue 846)

Python 3 正在进行中的支持

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

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

  • 更多针对 urllib 的 Python3 兼容性更改 (issue 1121)

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

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

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

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

  • PY3: 在 Python 3 中使用 MutableMapping (issue 810)

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

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

  • PY3: 使用six来处理robotparser和urlparse (issue 800)

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

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

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

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

测试

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

  • 修复在收集测试时来自pytest的剩余警告 (issue 1206)

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

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

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

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

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

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

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

  • selector.__repr__ 测试 (issue 779)

代码重构

  • CSVFeedSpider 清理:使用 iterate_spider_output (issue 1079)

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

  • Pydispatch pep8 (issue 992)

  • 从walk_modules()中移除了未使用的‘load=False’参数 (issue 871)

  • 为了保持一致性,请在SpiderState扩展中使用job_dir辅助工具。 (issue 805)

  • 将“sflo”局部变量重命名为更易理解的“log_observer”(issue 775

Scrapy 0.24.6 (2015-04-20)

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属性的向后兼容性(commit 8e3f20a

Scrapy 0.24.0 (2014-06-26)

增强功能

错误修复

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

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

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

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

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

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

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

  • 使用 lucasdemarchi/codespell 来修复拼写错误 (issue 628)

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

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

  • 修复引擎以支持过滤的启动请求 (issue 707)

  • 修复没有主机名的URL上的异地中间件案例 (issue 745)

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

Scrapy 0.22.2 (发布于 2014-02-14)

Scrapy 0.22.1 (发布于 2014-02-08)

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

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

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

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

  • 文档:最终爬虫示例的4空格缩进 (commit 13846de)

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

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

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

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

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

  • 用HTML实体替换无法编码的代码点。修复了#562和#285 (commit 5f87b17)

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

  • 更新了教程爬取输出以显示最新输出。(commit 8da65de)

  • 更新了shell文档,添加了爬虫参考并修复了实际的shell输出。(commit 875b9ab)

  • PEP8 小修改。 (commit f89efaf)

  • 在Scrapy shell中暴露当前的爬虫。(commit 5349cec)

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

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

  • DOC 修复了默认值中的 HTTPCACHE_STORAGE 拼写错误,现在为 Filesystem 而不是 Dbm。(commit cde9a8c)

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

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

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

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

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

  • 修复news.rst中的拼写错误并移除(尚未发布)的标题 (commit b7f58f4)

Scrapy 0.22.0 (发布于 2014-01-17)

增强功能

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

  • 使用CONNECT方法代理https://网址(问题392, 问题397

  • 添加一个中间件来爬取由Google定义的ajax可爬取页面(issue 343

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

  • 选择器默认注册EXSLT命名空间(问题472

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

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

  • 提高测试覆盖率和即将到来的Python 3支持 (issue 525)

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

  • 支持在get_func_args工具中使用部分参数(问题 506,问题:504

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

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

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

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

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

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

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

  • 在任何你发现遗留代码的地方使用现代的Python习惯用法 (issue 497)

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

修复

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

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

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

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

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

  • 对内存统计的多项修复 (issue 531, issue 530, issue 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 是从发布的源代码构建轮子所必需的 (commit 5ba1ad5)

  • process_parallel 在其内部 deferreds 上泄漏了失败。关闭 #458 (commit 419a780)

Scrapy 0.20.0 (发布于 2013-11-08)

增强功能

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

  • 请求/响应的URL/正文属性现在不可变 (修改它们已经被弃用很长时间了)

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

  • 站点地图蜘蛛可以获取备用URL(issue 360

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

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

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

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

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

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

  • 推荐使用Pillow而不是PIL进行图像处理(issue 317

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

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

  • 从多个核心组件中移除多蜘蛛支持 (issue 422, issue 421, issue 420, issue 419, issue 423, issue 418)

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

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

  • Pylinted, pep8 并从源代码中移除了旧式异常 (issue 430, issue 432)

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

  • 处理在Python 2.7.5中引入的影响XmlItemExporter的回归问题(问题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)

Scrapy 0.18.0 (发布于 2013-08-09)

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

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

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

  • 修复了按主机名而不是按网络位置合并cookie的问题 (issue 352)

  • 支持通过标志设置禁用HttpCompressionMiddlewareissue 359

  • 支持在XMLFeedSpider中使用iternodes解析器处理XML命名空间 (issue 12)

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

  • 修复了由于python 2.7.4的更改导致的scrapy.utils.gz.gunzip问题 (commit 4dc76e)

  • 修复了SgmlLinkExtractor上的URL编码问题 (issue 24)

  • Bugfix TakeFirst 处理器不应丢弃零(0)值 (issue 59)

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

  • 提高cookies处理性能 (issue 77)

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

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

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

  • 添加了下载器基准测试网络服务器和爬虫工具 基准测试

  • 将持久化(在磁盘上)的队列移动到一个单独的项目(queuelib),Scrapy 现在依赖于该项目

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

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

  • 添加了XPathSelector.remove_namespaces,它允许从XML文档中移除所有命名空间以便于使用(以便使用无命名空间的XPaths)。在选择器中进行了文档记录。

  • 对蜘蛛合约的多项改进

  • 新的默认中间件名为MetaRefreshMiddleware,用于处理meta-refresh html标签重定向,

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

  • 向爬虫添加了from_crawler方法

  • 添加了带有模拟服务器的系统测试

  • 更多改进以增强macOS兼容性(感谢Alex Cepoi)

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

  • 支持自定义下载槽

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

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

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

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

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

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

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

  • 文档:移除指向diveintopython.org的链接,该网站已不再可用。关闭 #246 (commit bd58bfa)

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

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

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

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

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

  • 修复了错误消息的格式。log.err() 不支持酷炫的格式化,当发生错误时,消息是:“ERROR: 处理 %(item)s 时出错”(commit c16150c

  • 整理和改进图像管道的错误日志记录 (commit 56b45fc)

  • 修复了文档中的拼写错误 (commit 243be84)

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

  • 修复了在未明确指定蜘蛛时Scrapy解析命令中的错误。关闭 #209 (commit c72e682)

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

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

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 变更:

  • 添加了Spiders Contracts,一种以正式/可重复方式测试蜘蛛的机制

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

  • 记录了 AutoThrottle 扩展 并添加到默认安装的扩展中。您仍然需要通过 AUTOTHROTTLE_ENABLED 启用它

  • 主要统计收集重构:移除了全局/每个爬虫统计的分离,移除了与统计相关的信号(stats_spider_opened等)。现在统计更加简单,统计收集器API和信号的向后兼容性得以保持。

  • 添加了process_start_requests()方法到爬虫中间件

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

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

  • 已记录的 Core API

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

  • 将FormRequest.from_response()移植为使用lxml而不是ClientForm

  • 移除的模块:scrapy.xlib.BeautifulSoupscrapy.xlib.ClientForm

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

  • StackTraceDump 扩展:同时转储 trackref 的实时引用 (commit fe2ce93)

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

  • 添加了cookiejar请求元键,以支持每个蜘蛛的多个cookie会话

  • 将解耦的编码检测代码移至w3lib.encoding,并将Scrapy代码移植以使用该模块

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

  • 放弃了对 Twisted 2.5 的支持

  • 添加了REFERER_ENABLED设置,用于控制引用中间件

  • 更改了默认的用户代理为:Scrapy/VERSION (+http://scrapy.org)

  • 移除了(未记录的)HTMLImageLinkExtractor 类,该类来自 scrapy.contrib.linkextractors.image

  • 移除了每个爬虫的设置(将被替换为实例化多个爬虫对象)

  • USER_AGENT 爬虫属性将不再有效,请使用 user_agent 属性代替

  • DOWNLOAD_TIMEOUT 爬虫属性将不再有效,请使用 download_timeout 属性代替

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

  • DjangoItem 提升为主贡献

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

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

  • 用(更便携的)resource模块替换了内存使用统计,移除了scrapy.utils.memory模块

  • 移除的信号: scrapy.mail.mail_sent

  • 移除了 TRACK_REFS 设置,现在 trackrefs 总是启用

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

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

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

  • 移除了 scrapy.log.started 属性

Scrapy 0.14.4

Scrapy 0.14.3

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

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

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

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

  • 当槽为空时不要丢弃,只需将其保存在另一个字典中以便在需要时再次回收。(commit 8e9f607)

  • 不要在处理libxml2支持的选择器中的unicode xpaths时失败 (commit b830e95)

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

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

  • 移除了Scrapy中与sqlite支持相关的一些过时代码 (commit 0665175)

Scrapy 0.14.2

  • 在计算校验和之前,将缓冲区指针移动到文件的开头。参考 #92 (commit 6a5bef2)

  • 在持久化图像之前计算图像校验和。关闭 #92 (commit 9817df1)

  • 移除缓存失败中的泄漏引用 (commit 673a120)

  • 修复了MemoryUsage扩展中的错误:get_engine_status()需要1个参数(但提供了0个)(commit 11133e9

  • 修复了HTTP压缩中间件中的struct.error。关闭 #87 (commit 1423140)

  • ajax爬取未对unicode网址进行扩展(commit 0de3fb4

  • 捕获start_requests迭代器错误。参考 #83 (commit 454a21d)

  • 加速 libxml2 XPathSelector (commit 2fbd662)

  • 根据最近的更改更新了版本控制文档 (commit 0a070f5)

  • scrapyd: 修复了文档链接 (commit 2b4e4c3)

  • extras/makedeb.py: 不再从git获取版本 (commit caffe0e)

Scrapy 0.14.1

  • extras/makedeb.py: 不再从git获取版本 (commit caffe0e)

  • 版本升级至0.14.1 (commit 6cb9e1c)

  • 修复了对教程目录的引用 (commit 4b86bd6)

  • 文档:从Request.replace()中删除了重复的回调参数 (commit 1aeccdd)

  • 修复了scrapyd文档的格式问题 (commit 8bf19e6)

  • 转储所有运行线程的堆栈并修复由StackTraceDump扩展转储的引擎状态 (commit 14a8e6e)

  • 添加了关于为什么我们在boto图像上传时禁用ssl的评论 (commit 5223575)

  • 当对S3进行过多并行连接时,SSL握手会挂起(commit 63d583d

  • 更改教程以遵循dmoz网站上的更改(commit bcb3198

  • 避免在Twisted>=11.1.0中出现_disconnectedDeferred AttributeError异常 (commit 98f3f87)

  • 允许爬虫设置自动节流最大并发数 (commit 175a4b5)

Scrapy 0.14

新功能和设置

  • 支持AJAX可抓取的URL

  • 新的持久化调度器,将请求存储在磁盘上,允许暂停和恢复爬取 (r2737)

  • 添加了-o选项到scrapy crawl,这是一个将抓取的项目转储到文件中的快捷方式(或使用-的标准输出)

  • 增加了对向Scrapyd schedule.json API传递自定义设置的支持 (r2779, r2783)

  • 新的 ChunkedTransferMiddleware(默认启用)以支持 分块传输编码 (r2769)

  • 为S3下载器处理程序添加boto 2.0支持 (r2763)

  • 添加了marshal到feed导出支持格式中 (r2744)

  • 在请求错误回调中,现在可以在failure.request属性中接收到有问题的请求(r2738

  • Big downloader refactoring to support per domain/ip concurrency limits (r2732)
  • 添加了内置的缓存DNS解析器 (r2728)

  • 已将亚马逊AWS相关的组件/扩展(SQS蜘蛛队列,SimpleDB统计收集器)移至一个单独的项目:[scaws](https://github.com/scrapinghub/scaws) (r2706, r2714)

  • 将蜘蛛队列移动到scrapyd:scrapy.spiderqueue -> scrapyd.spiderqueue (r2708)

  • 将sqlite工具移动到scrapyd:scrapy.utils.sqlite -> scrapyd.sqlite (r2781)

  • 真正支持在start_requests()方法上返回迭代器。现在,当爬虫空闲时,迭代器会在爬取过程中被消耗(r2704

  • 添加了REDIRECT_ENABLED设置,以快速启用/禁用重定向中间件 (r2697)

  • 添加了RETRY_ENABLED设置,以快速启用/禁用重试中间件 (r2694)

  • 添加了CloseSpider异常以手动关闭爬虫 (r2691)

  • 通过增加对HTML5 meta charset声明的支持,改进了编码检测 (r2690)

  • 重构了关闭蜘蛛的行为,以等待所有下载完成并由蜘蛛处理,然后再关闭蜘蛛 (r2688)

  • 添加了SitemapSpider(参见Spiders页面中的文档)(r2658)

  • 添加了LogStats扩展,用于定期记录基本统计信息(如爬取的页面和抓取的项目)(r2657)

  • 使处理gzip响应的方式更加健壮(#319,r2643)。现在Scrapy会尝试尽可能多地从gzip响应中解压缩数据,而不是因为IOError而失败。

  • 简化的 !MemoryDebugger 扩展,用于使用统计数据来转储内存调试信息 (r2639)

  • 新增了编辑爬虫的命令:scrapy edit (r2636) 以及 -e 标志到 genspider 命令中,该命令使用它 (r2653)

  • 更改了项目的默认表示为漂亮打印的字典。(r2631)。这通过使日志在默认情况下更易读来改进默认日志记录,适用于Scraped和Dropped行。

  • 添加了 spider_error 信号 (r2628)

  • 添加了COOKIES_ENABLED设置 (r2625)

  • 统计信息现在被转储到Scrapy日志中(STATS_DUMP设置的默认值已更改为True)。这是为了让Scrapy用户更加了解Scrapy统计信息以及在那里收集的数据。

  • 增加了对动态调整下载延迟和最大并发请求的支持 (r2599)

  • 新增了DBM HTTP缓存存储后端 (r2576)

  • 在Scrapyd中添加了listjobs.json API (r2571)

  • CsvItemExporter: 添加了 join_multivalued 参数 (r2578)

  • xmliter_lxml添加了命名空间支持 (r2552)

  • 通过改进COOKIES_DEBUG使其更友好并记录文档来改进cookies中间件 (r2579)

  • 对Scrapyd和链接提取器的几项改进

代码重新排列并删除

  • Merged item passed and item scraped concepts, as they have often proved confusing in the past. This means: (r2630)
    • 原始的 item_scraped 信号已被移除

    • 原始的 item_passed 信号已重命名为 item_scraped

    • 旧的日志行 Scraped Item... 已被移除

    • 旧的日志行 Passed Item... 被重命名为 Scraped Item... 行,并降级为 DEBUG 级别

  • Reduced Scrapy codebase by striping part of Scrapy code into two new libraries:
    • w3lib (来自 scrapy.utils.{http,markup,multipart,response,url} 的几个函数,在 r2584 中完成)

    • scrapely (之前是 scrapy.contrib.ibl, 在 r2586 中完成)

  • 移除了未使用的函数:scrapy.utils.request.request_info() (r2577)

  • examples/googledir中移除了googledir项目。现在在GitHub上有一个新的示例项目叫做dirbothttps://github.com/scrapy/dirbot

  • 移除了对Scrapy项目中默认字段值的支持 (r2616)

  • 移除了实验性的crawlspider v2 (r2632)

  • 移除了调度器中间件以简化架构。重复过滤器现在在调度器本身完成,使用与之前相同的重复过滤类(DUPEFILTER_CLASS 设置)(r2640

  • 移除了向scrapy crawl命令传递url的支持(请改用scrapy parse)(r2704

  • 移除了已弃用的执行队列 (r2704)

  • 移除了(未记录的)爬虫上下文扩展(来自 scrapy.contrib.spidercontext)(r2780

  • 移除了 CONCURRENT_SPIDERS 设置(改用 scrapyd 的 maxproc 代替)(r2789)

  • 核心组件的属性已重命名:downloader.sites -> downloader.slots, scraper.sites -> scraper.slots (r2717, r2718)

  • 将设置 CLOSESPIDER_ITEMPASSED 重命名为 CLOSESPIDER_ITEMCOUNT (r2655)。保持了向后兼容性。

Scrapy 0.12

像#NNN这样的数字引用的是旧问题跟踪器(Trac)中的票据,该跟踪器已不再可用。

新功能和改进

  • 传递的项目现在在item_passed (#273)的item参数中发送。

  • scrapy version命令添加了详细选项,对错误报告很有用 (#298)

  • HTTP缓存现在默认存储在项目数据目录中(#279)

  • 添加了项目数据存储目录 (#276, #277)

  • Scrapy项目的文档化文件结构(请参阅命令行工具文档)

  • XPath选择器的新lxml后端 (#147)

  • 每个爬虫的设置 (#245)

  • 支持退出代码以指示Scrapy命令中的错误 (#248)

  • scrapy shell命令添加了-c参数

  • 使 libxml2 成为可选项 (#260)

  • 新的 deploy 命令 (#261)

  • 添加了CLOSESPIDER_PAGECOUNT设置 (#253)

  • 添加了 CLOSESPIDER_ERRORCOUNT 设置 (#254)

Scrapyd 变更

  • Scrapyd 现在为每个蜘蛛使用一个进程

  • 它为每次蜘蛛运行存储一个日志文件,并轮换它们,保留每个蜘蛛的最新5个日志(默认情况下)

  • 添加了一个最小的网页用户界面,默认情况下可在http://localhost:6800访问

  • 现在有一个scrapy server命令来启动当前项目的Scrapyd服务器

设置更改

  • 添加了HTTPCACHE_ENABLED设置(默认值为False)以启用HTTP缓存中间件

  • 更改了 HTTPCACHE_EXPIRATION_SECS 的语义:现在零表示“永不过期”。

已弃用/废弃的功能

  • 已弃用 runserver 命令,推荐使用 server 命令来启动 Scrapyd 服务器。另请参阅:Scrapyd 变更

  • 已弃用 queue 命令,推荐使用 Scrapyd 的 schedule.json API。另请参阅:Scrapyd 变更

  • 移除了 !LxmlItemLoader(实验性的贡献,从未升级为主要贡献)

Scrapy 0.10

像#NNN这样的数字引用的是旧问题跟踪器(Trac)中的票据,该跟踪器已不再可用。

新功能和改进

  • 新的Scrapy服务称为scrapyd,用于在生产环境中部署Scrapy爬虫(#218)(文档可用)

  • 简化的图像管道使用,现在不需要子类化你自己的图像管道 (#217)

  • Scrapy shell 现在默认显示 Scrapy 日志 (#206)

  • 在通用基础代码和可插拔后端中重构了执行队列,称为“spider queues”(#220)

  • 新的持久化爬虫队列(基于SQLite)(#198),默认可用,允许在服务器模式下启动Scrapy,然后安排爬虫运行。

  • 添加了Scrapy命令行工具及其所有可用子命令的文档。(文档可用)

  • 具有可插拔后端的Feed导出器(#197)(文档可用)

  • 延迟信号 (#193)

  • 向项目管道添加了两个新方法 open_spider(), close_spider(),并支持延迟 (#195)

  • 支持为每个爬虫覆盖默认请求头 (#181)

  • 替换了默认的Spider Manager,使用了一个具有类似功能但不依赖于Twisted插件的版本 (#186)

  • 将Debian包拆分为两个包 - 库和服务 (#187)

  • Scrapy日志重构 (#188)

  • 用于在不同运行之间保持持久爬虫上下文的新扩展 (#203)

  • 添加了dont_redirect request.meta键以避免重定向 (#233)

  • 添加了dont_retry request.meta键以避免重试 (#234)

命令行工具更改

  • 新的 scrapy 命令取代了旧的 scrapy-ctl.py (#199) - 现在只有一个全局的 scrapy 命令,而不是每个项目都有一个 scrapy-ctl.py - 添加了 scrapy.bat 脚本,以便在 Windows 上更方便地运行

  • 为命令行工具添加了bash自动补全功能 (#210)

  • 将命令 start 重命名为 runserver (#209)

API变更

  • urlbody 属性现在为只读 (#230)

  • Request.copy()Request.replace() 现在也会复制它们的 callbackerrback 属性 (#231)

  • scrapy.contrib 中移除了 UrlFilterMiddleware(默认已禁用)

  • 外部中间件不会过滤掉任何来自没有allowed_domains属性的爬虫的请求(#225)

  • 移除了Spider Manager的load()方法。现在蜘蛛在__init__方法本身中加载。

  • Changes to Scrapy Manager (now called “Crawler”):
    • scrapy.core.manager.ScrapyManager 类已重命名为 scrapy.crawler.Crawler

    • scrapy.core.manager.scrapymanager 单例已移至 scrapy.project.crawler

  • 移动模块:scrapy.contrib.spidermanagerscrapy.spidermanager

  • Spider Manager 单例从 scrapy.spider.spiders 移动到 spiders` attribute of ``scrapy.project.crawler 单例。

  • moved Stats Collector classes: (#204)
    • scrapy.stats.collector.StatsCollectorscrapy.statscol.StatsCollector

    • scrapy.stats.collector.SimpledbStatsCollectorscrapy.contrib.statscol.SimpledbStatsCollector

  • 默认的每个命令设置现在在命令对象类的 default_settings 属性中指定 (#201)

  • changed arguments of Item pipeline process_item() method from (spider, item) to (item, spider)
    • 保持向后兼容性(带有弃用警告)

  • moved scrapy.core.signals module to scrapy.signals
    • 保持向后兼容性(带有弃用警告)

  • moved scrapy.core.exceptions module to scrapy.exceptions
    • 保持向后兼容性(带有弃用警告)

  • 添加了handles_request()类方法到BaseSpider

  • 删除了 scrapy.log.exc() 函数(改用 scrapy.log.err() 代替)

  • 删除了scrapy.log.msg()函数的component参数

  • 删除了 scrapy.log.log_level 属性

  • 添加了from_settings()类方法到Spider Manager和Item Pipeline Manager

设置更改

  • 添加了HTTPCACHE_IGNORE_SCHEMES设置,以在!HttpCacheMiddleware中忽略某些方案(#225)

  • 添加了SPIDER_QUEUE_CLASS设置,用于定义要使用的爬虫队列(#220)

  • 添加了KEEP_ALIVE设置 (#220)

  • 移除了 SERVICE_QUEUE 设置 (#220)

  • 移除了 COMMANDS_SETTINGS_MODULE 设置 (#201)

  • REQUEST_HANDLERS重命名为DOWNLOAD_HANDLERS,并将下载处理程序改为类(而不是函数)

Scrapy 0.9

像#NNN这样的数字引用的是旧问题跟踪器(Trac)中的票据,该跟踪器已不再可用。

新功能和改进

  • 向scrapy.mail添加了SMTP-AUTH支持

  • 新增设置:MAIL_USER, MAIL_PASS (r2065 | #149)

  • 新增了scrapy-ctl view命令 - 用于在浏览器中查看URL,就像Scrapy看到的那样 (r2039)

  • 添加了用于控制Scrapy进程的Web服务(这也弃用了Web控制台。(r2053 | #167)

  • 支持将Scrapy作为服务运行,适用于生产系统 (r1988, r2054, r2055, r2056, r2057 | #168)

  • 添加了包装器归纳库(目前仅源代码中提供文档)。 (r2011)

  • 简化和改进的响应编码支持 (r1961, r1969)

  • 添加了LOG_ENCODING设置(r1956,文档可用)

  • 添加了RANDOMIZE_DOWNLOAD_DELAY设置(默认启用)(r1923,文档可用)

  • MailSender 不再阻塞IO (r1955 | #146)

  • Linkextractors 和新的 Crawlspider 现在可以处理相对基础标签的URL (r1960 | #148)

  • 对项目加载器和处理器的几项改进 (r2022, r2023, r2024, r2025, r2026, r2027, r2028, r2029, r2030)

  • 增加了对在telnet控制台添加变量的支持 (r2047 | #165)

  • 支持没有回调的请求 (r2050 | #166)

API变更

  • Spider.domain_name 更改为 Spider.name (SEP-012, r1975)

  • Response.encoding 现在是检测到的编码 (r1961)

  • HttpErrorMiddleware 现在返回 None 或引发异常 (r2006 | #157)

  • scrapy.command 模块重新定位 (r2035, r2036, r2037)

  • 添加了ExecutionQueue用于向爬虫提供抓取任务 (r2034)

  • 移除了ExecutionEngine单例 (r2039)

  • 移植了S3ImagesStore(图片管道)以使用boto和线程(r2033

  • 移动模块:scrapy.management.telnetscrapy.telnet (r2047)

默认设置的更改

  • 将默认的SCHEDULER_ORDER更改为DFO (r1939)

Scrapy 0.8

像#NNN这样的数字引用的是旧问题跟踪器(Trac)中的票据,该跟踪器已不再可用。

新功能

  • 添加了DEFAULT_RESPONSE_ENCODING设置 (r1809)

  • FormRequest.from_response()方法添加了dont_click参数 (r1813, r1816)

  • FormRequest.from_response()方法添加了clickdata参数 (r1802, r1803)

  • 增加了对HTTP代理的支持(HttpProxyMiddleware)(r1781, r1785

  • 异地蜘蛛中间件现在在过滤请求时记录消息 (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() now receives a spider argument (r1822)
    • 旧域名参数已被弃用,并将在0.9版本中移除。对于爬虫,您应始终使用spider参数并传递爬虫引用。如果您确实想传递字符串,请改用component参数。

  • 更改了核心信号 domain_opened, domain_closed, domain_idle

  • Changed Item pipeline to use spiders instead of domains
    • process_item() 项目管道方法的 domain 参数已更改为 spider,新的签名为:process_item(spider, item) (r1827 | #105)

    • 要快速移植你的代码(以与Scrapy 0.8一起工作),只需在你之前使用domain的地方使用spider.domain_name

  • Changed Stats API to use spiders instead of domains (r1849 | #113)
    • StatsCollector 被更改为在其方法(set_value, inc_value 等)中接收爬虫引用(而不是域名)。

    • 添加了 StatsCollector.iter_spider_stats() 方法

    • 移除了 StatsCollector.list_domains() 方法

    • 此外,Stats信号已被重命名,现在传递的是蜘蛛引用(而不是域名)。以下是更改的摘要:

    • 要快速移植你的代码(以与Scrapy 0.8一起工作),只需在你之前使用domain的地方使用spider.domain_namespider_stats包含与domain_stats完全相同的数据。

  • CloseDomain extension moved to scrapy.contrib.closespider.CloseSpider (r1833)
    • Its settings were also renamed:
      • CLOSEDOMAIN_TIMEOUTCLOSESPIDER_TIMEOUT

      • CLOSEDOMAIN_ITEMCOUNTCLOSESPIDER_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的首次发布。