发布说明

Scrapy 2.13.0 (2025-05-08)

亮点

修改后的要求

  • 放弃了对 PyPy 3.9 的支持。( issue 6613 )

  • 增加了对 PyPy 3.11 的支持。( issue 6697 )

向后不兼容的更改

  • TWISTED_REACTOR 设置的默认值已从 None 更改为 "twisted.internet.asyncioreactor.AsyncioSelectorReactor"。自 Scrapy 2.7.0 以来,新生成的项目已经使用此值,但现在未显式设置此设置的现有项目也将使用 asyncio reactor。您可以在 您的项目中更改此设置 以使用不同的 reactor。( issue 6659, issue 6713 )

  • 起始请求和 Item 的迭代不再在调度器中存在请求时停止,而是持续运行直到所有起始请求都被调度。

    要重现之前的行为,请参阅 延迟起始请求迭代。( issue 6729 )

  • 来自 爬虫中间件open_spider() 方法的未处理异常不再停止爬取。( issue 6729 )

  • scrapy.core.engine.ExecutionEngine

    • open_spider() 的第二个参数 start_requests 已被移除。起始请求改为由 spider 参数确定(参见 start())。

    • slot 属性已重命名为 _slot 且不应使用。

    ( issue 6729 )

  • scrapy.core.engine 中,Slot 类已重命名为 _Slot 且不应使用。( issue 6729 )

  • 删除已移除的 slot telnet 变量。( issue 6729 )

  • scrapy.core.spidermw.SpiderMiddlewareManager 中,process_start_requests() 已被 process_start() 替换。( issue 6729 )

  • 现在已废弃的 start_requests() 方法,当它返回一个可迭代对象而不是定义为生成器时,现在在 调度器 实例创建之后执行。( issue 6729 )

  • 使用 JOBDIR 时,起始请求 现在序列化到它们自己的以 s 为后缀的优先级文件夹中。您可以将 SCHEDULER_START_DISK_QUEUE 设置为 None"" 来更改此行为,但这可能会产生不希望的副作用。详情请参阅 SCHEDULER_START_DISK_QUEUE。( issue 6729 )

  • URL 长度限制,由 URLLENGTH_LIMIT 设置,现在也对起始请求强制执行。( issue 6777 )

  • 在 Scrapy 2.12.0 中废弃的 UrlLengthMiddlewarefrom_settings() 方法提前移除(这是必要的,因为引入 BaseSpiderMiddleware 基类并将内置爬虫中间件切换到它之后,这些中间件在运行时需要 Crawler 实例)。请改用 from_crawler()。( issue 6693 )

  • scrapy.utils.url.escape_ajax() 在创建 Request 实例时不再被调用。它仅对支持 _escaped_fragment_ 功能的网站有用,而大多数现代网站不支持该功能。如果您仍然需要此功能,可以在将 URL 传递给 Request 之前修改它们。( issue 6523, issue 6651 )

移除的废弃功能

  • 移除了某些信号的旧废弃名称别名

    • stats_spider_opened (请改用 spider_opened

    • stats_spider_closingstats_spider_closed (请改用 spider_closed

    • item_passed (请改用 item_scraped

    • request_received (请改用 request_scheduled

    ( issue 6654, issue 6655 )

废弃

  • Spiderstart_requests() 方法已废弃,请改用 start(),或者同时使用两者以保持对较低 Scrapy 版本的支持。( issue 456, issue 3477, issue 4467, issue 5627, issue 6729 )

  • 爬虫中间件process_start_requests() 方法已废弃,请改用 process_start(),或者同时使用两者以保持对较低 Scrapy 版本的支持。( issue 456, issue 3477, issue 4467, issue 5627, issue 6729 )

  • 优先级队列类(参见 SCHEDULER_PRIORITY_QUEUE)的 __init__ 方法现在应支持一个仅限关键字的 start_queue_cls 参数。( issue 6752 )

  • 不支持异步爬虫输出的爬虫中间件 已废弃。在使用此类中间件与异步回调以及其他产生异步可迭代对象的爬虫中间件时所需的异步可迭代对象降级功能也已废弃。请更新所有此类中间件以支持异步爬虫输出。( issue 6664 )

  • w3lib.url 导入并在 scrapy.utils.url 中重新导出的函数现已废弃,您应该直接从 w3lib.url 导入它们。它们是

    • scrapy.utils.url.add_or_replace_parameter()

    • scrapy.utils.url.add_or_replace_parameters()

    • scrapy.utils.url.any_to_uri()

    • scrapy.utils.url.canonicalize_url()

    • scrapy.utils.url.file_uri_to_path()

    • scrapy.utils.url.is_url()

    • scrapy.utils.url.parse_data_uri()

    • scrapy.utils.url.parse_url()

    • scrapy.utils.url.path_to_file_uri()

    • scrapy.utils.url.safe_download_url()

    • scrapy.utils.url.safe_url_string()

    • scrapy.utils.url.url_query_cleaner()

    • scrapy.utils.url.url_query_parameter()

    ( issue 4577, issue 6583, issue 6586 )

  • HTTP/1.0 支持代码已废弃。它默认禁用,且无法与 HTTP/1.1 一起使用。如果您仍然需要它,您应该编写自己的下载处理程序或从 Scrapy 复制代码。废弃项包括

    • scrapy.core.downloader.handlers.http10.HTTP10DownloadHandler

    • scrapy.core.downloader.webclient.ScrapyHTTPClientFactory

    • scrapy.core.downloader.webclient.ScrapyHTTPPageGetter

    • 覆盖 scrapy.core.downloader.contextfactory.ScrapyClientContextFactory.getContext()

    ( issue 6634 )

  • 以下仅在测试中使用的模块和函数已废弃

    • scrapy/utils/testproc 模块

    • scrapy/utils/testsite 模块

    • scrapy.utils.test.assert_gcs_environ()

    • scrapy.utils.test.get_ftp_content_and_delete()

    • scrapy.utils.test.get_gcs_content_and_delete()

    • scrapy.utils.test.mock_google_cloud_storage()

    • scrapy.utils.test.skip_if_no_boto()

    如果您需要在您的测试或代码中使用它们,您可以从 Scrapy 复制代码。( issue 6696 )

  • scrapy.utils.test.TestSpider 已废弃。如果您需要一个空的爬虫类,您可以使用 scrapy.utils.spider.DefaultSpider 或创建您自己的 scrapy.Spider 子类。( issue 6678 )

  • scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware 已废弃。它默认禁用,对大多数现有网站没有用处。( issue 6523, issue 6651, issue 6656 )

  • scrapy.utils.url.escape_ajax() 已废弃。( issue 6523, issue 6651 )

  • scrapy.spiders.init.InitSpider 已废弃。如果您觉得它有用,您可以从 Scrapy 复制其代码。( issue 6708, issue 6714 )

  • scrapy.utils.versions.scrapy_components_versions() 已废弃,请改用 scrapy.utils.versions.get_versions()。( issue 6582 )

  • BaseDupeFilter.log() 已废弃。它不起作用,不应调用。( issue 4151 )

  • Scraper 的以下方法传递 spider 参数已废弃

    • close_spider()

    • enqueue_scrape()

    • handle_spider_error()

    • handle_spider_output()

    ( issue 6764 )

新特性

改进

  • 移除或推迟了部分 itemadapter.is_item() 调用以提高性能。(issue 6719

  • 改进了在项目目录外部运行需要项目(例如 scrapy crawl)的 scrapy 命令时的错误消息。(issue 2349, issue 3426

  • 为新项目的 settings.py 模板添加了一个空的 ADDONS 设置。(issue 6587

错误修复

文档

打包

质量保证

Scrapy 2.12.0 (2024-11-18)

亮点

修改的要求

向后不兼容的更改

  • 用户定义的 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() 调用创建这些管道的实例时影响您。

    之前,如果存在 from_settings() 方法,则 MediaPipeline.from_crawler() 调用该方法,否则调用 __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

    (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.utils.request.request_fingerprint() 函数,该函数在 Scrapy 2.7.0 中已被弃用。(issue 6212, issue 6213

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

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

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

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

  • 具有 Spider 级别 HTTP 认证(即具有 http_userhttp_pass 属性)的 Spider 现在也必须定义 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() 现在必须支持 item 参数,该参数在 Scrapy 2.4.0 中添加。(issue 6107, issue 6113

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

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

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

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

  • scrapy.utils.log.logformatter_adapter 不再支持缺失的 argslevelmsg 参数,也不再支持 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

  • 移除了 --output-format/-t 命令行选项,该选项在 Scrapy 2.1.0 中已被弃用。应改为使用 -O <URI>:<FORMAT>。(issue 6500

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

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

  • 移除了 RetryMiddlewareEXCEPTIONS_TO_RETRY 属性,该属性在 Scrapy 2.10.0 中已被弃用。(issue 6500

  • 移除了在未安装 boto3 包时对 S3 feed 导出 的支持,该支持在 Scrapy 2.10.0 中已被弃用。(issue 6500

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

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

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

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

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

弃用功能

  • 具有 from_settings() 方法的 Scrapy 组件 现在已被弃用。from_crawler() 现在应改用 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__() 方法已被弃用。如果传递了该参数,传递 settings 参数也已被弃用,无论如何它都将被忽略。

    • 调用 from_settings() 已被弃用,请改用 from_crawler()。(issue 6540

    • 覆盖 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 不再安装默认的 reactor。

  • 降低了在 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)

亮点

向后不兼容的更改

移除的已弃用功能

  • 移除了 PythonItemExporter 的二进制导出模式,该模式在 Scrapy 1.1.0 中已弃用。(问题 6006问题 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。(问题 6010

  • 在 Scrapy 2.6.0 中已弃用的 scrapy.utils.response.response_httprepr() 函数现已移除。(问题 6111

已弃用功能

新功能

错误修复

文档

质量保证

Scrapy 2.10.1 (2023-08-30)

Twisted >= 23.8.0 标记为不受支持。(问题 6024问题 6026

Scrapy 2.10.0 (2023-08-04)

亮点

  • 添加了 Python 3.12 支持,移除了 Python 3.7 支持。

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

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

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

修改后的依赖要求

向后不兼容的更改

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

移除的已弃用功能

已弃用功能

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

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

新功能

错误修复

文档

质量保证

Scrapy 2.9.0 (2023-05-08)

亮点

  • 按域下载设置。

  • 与新版 cryptography 和新版 parsel 的兼容性。

  • 新版 parsel 中的 JMESPath 选择器。

  • 错误修复。

已弃用功能

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

新功能

错误修复

文档

质量保证

Scrapy 2.8.0 (2023-02-02)

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

移除的已弃用内容

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

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

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

  • Scrapy 2.0 中已弃用的 scrapy.linkextractors.FilteringLinkExtractor 类现已移除。请改用 LinkExtractor。(问题 5720)

  • Scrapy 2.0 中已弃用的、使用 SCRAPY_ 前缀的环境变量来覆盖设置的支持现已移除。(问题 5724)

  • Scrapy 2.0 中已弃用的、在代理 URL 中使用 noconnect 查询字符串参数的支持现已移除。我们认为过去需要此参数的代理现在无需此参数也能正常工作。(问题 5731)

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

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

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

已弃用

新功能

错误修复

文档

质量保证

Scrapy 2.7.1 (2022-11-02)

新功能

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

错误修复

文档

质量保证

Scrapy 2.7.0 (2022-10-17)

亮点

修改的要求

现在需要 Python 3.7 或更高版本;已移除对 Python 3.6 的支持。已添加对即将发布的 Python 3.11 的支持。

一些依赖项的最低所需版本也发生了变化

(问题 5512, 问题 5514, 问题 5524, 问题 5563, 问题 5664, 问题 5670, 问题 5678)

已弃用

新功能

错误修复

文档

质量保证

Scrapy 2.6.3 (2022-09-27)

Scrapy 2.6.2 (2022-07-25)

安全错误修复

  • HttpProxyMiddleware 处理带有 proxy 元数据的请求,并且该 proxy 元数据包含代理凭据时,HttpProxyMiddleware 会设置 Proxy-Authorization 头部,但仅在尚未设置该头部时执行此操作。

    存在第三方代理旋转 downloader middleware,它们在每次处理请求时都会设置不同的 proxy 元数据。

    由于请求重试和重定向,同一个请求可以被 downloader middleware 处理多次,包括 HttpProxyMiddleware 和任何第三方代理旋转 downloader middleware。

    这些第三方代理旋转 downloader middleware 可能会将请求的 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)

亮点

安全错误修复

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

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

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

    注意

    仍然可以通过在定义 cookie 时将共享域名后缀(例如 `example.com` 和任何子域名)定义为 cookie 域名来实现在具有共享域名后缀的不同域名之间共享 cookie。有关详细信息,请参阅 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

  • 如果配置的 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 4178issue 4356

已废弃的功能

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

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

  • scrapy.squeues 中,以下队列类已废弃: PickleFifoDiskQueueNonRequest, PickleLifoDiskQueueNonRequest, MarshalFifoDiskQueueNonRequestMarshalLifoDiskQueueNonRequest。你应该改用: PickleFifoDiskQueue, PickleLifoDiskQueue, MarshalFifoDiskQueueMarshalLifoDiskQueue。(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)

新功能

Bug 修复

文档

质量保证

Scrapy 2.4.1 (2020-11-17)

Scrapy 2.4.0 (2020-10-11)

亮点

  • 已停止支持 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 中引入的这个 bug 修复,因为有报告称当前的实现可能会破坏现有代码。

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

    Scrapy 的未来版本将包含一个新的、更好的实现来替代被撤销的 bug 修复。

    (issue 4717, issue 4823)

移除已弃用的功能

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

  • Rule.process_request 不再接受只接收单个 request 参数而不是同时接收 requestresponse 的可调用对象 (issue 4818)

弃用

新功能

Bug 修复

文档

质量保证

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)

新特性

Bug 修复

文档

质量保证

  • Item loaders 的基本实现已移至 itemloaders (issue 4005, issue 4516)

  • 修复了某些调度器测试中被隐藏的错误 (issue 4644, issue 4645)

  • 更新了用于 SSL 测试的 localhost 证书 (issue 4650)

  • 移除了 Python 2 特定的 cookie 处理代码 (issue 4682)

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

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

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

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

  • 自动测试现在作为我们持续集成系统的一部分,在支持的 Python 版本的最新 PyPy 版本上通过 (issue 4504)

Scrapy 2.2.1 (2020-07-17)

Scrapy 2.2.0 (2020-06-24)

亮点

向后不兼容的更改

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

废弃项

新特性

Bug 修复

文档

质量保证

Scrapy 2.1.0 (2020-04-24)

亮点

向后不兼容的变更

  • 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_CLASSissue 4398

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

废弃项

新特性

Bug 修复

  • 请求序列化 不再会因为那些作为 spider 属性但被赋值了不同名称函数的 callback 而中断 (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)

亮点

向后不兼容的变更

已移除的废弃项

废弃项

新特性

错误修复

文档

质量保证

调度器队列类的更改

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

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

安全 Bug 修复

Scrapy 1.8.3 (2022-07-25)

安全错误修复

  • HttpProxyMiddleware 处理带有 proxy 元数据的请求,并且该 proxy 元数据包含代理凭据时,HttpProxyMiddleware 会设置 Proxy-Authorization 头部,但仅在尚未设置该头部时执行此操作。

    存在第三方代理旋转 downloader middleware,它们在每次处理请求时都会设置不同的 proxy 元数据。

    由于请求重试和重定向,同一个请求可以被 downloader middleware 处理多次,包括 HttpProxyMiddleware 和任何第三方代理旋转 downloader middleware。

    这些第三方代理旋转 downloader middleware 可能会将请求的 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)

安全 Bug 修复

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

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

    旧的行为可能被攻击者利用以获取您的 cookie。请参阅 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)

亮点

向后不兼容的更改

另请参阅下面的 移除的弃用功能

新功能

Bug 修复

文档

移除的弃用功能

弃用

其他更改

Scrapy 1.7.4 (2019-10-21)

回退了 issue 3804 的修复(issue 3819),该修复有一些不良副作用(issue 3897, issue 3976)。

因此,当使用一个 item 初始化 item loader 时,ItemLoader.load_item() 会再次导致后续调用 ItemLoader.get_output_value()ItemLoader.load_item() 返回空数据。

Scrapy 1.7.3 (2019-08-01)

对 Python 3.4 强制要求 lxml 4.3.5 或更低版本 (issue 3912, issue 3918)。

Scrapy 1.7.2 (2019-07-23)

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

Scrapy 1.7.1 (2019-07-18)

对 Scrapy 1.7.0 进行了重新打包,之前的 PyPI 版本缺少一些更改。

Scrapy 1.7.0 (2019-07-18)

注意

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

亮点

  • 针对多域抓取的改进

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

  • 用于 JSON 请求的新类

  • 基于规则的 spider 的改进

  • Feed 导出新功能

向后不兼容的更改

  • 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

另请参阅下方的 移除的弃用功能

新功能

Bug 修复

文档

移除的弃用功能

以下弃用的 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)

弃用功能

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

  • 传递给 Rule 且不接受两个参数的 process_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)

亮点

  • 更好的 Windows 支持;

  • Python 3.7 兼容性;

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

  • Feed 导出、FilePipeline 和 MediaPipeline 改进;

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

  • scrapy.contracts 修复和新功能;

  • Telnet 控制台安全改进,首次作为向后兼容版本发布在 Scrapy 1.5.2 (2019-01-22) 中;

  • 清理了弃用代码;

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

Selector API 变更

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

最明显的改变是,现在推荐使用 .get().getall() Selector 方法,而不是 .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) 发布说明。

新的扩展特性

  • feed 导出器和 feed 存储器添加了 from_crawler 支持。这使得可以从自定义 feed 存储器和导出器访问 Scrapy 设置等功能(issue 1605, issue 3348)。

  • 去重过滤器(dupefilters)添加了 from_crawler 支持(issue 2956);这使得可以从去重过滤器访问设置或爬虫等。

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

  • 当下载器(Downloader)接收到新的请求(Request)时,会触发 request_reached_downloader 信号;此信号对于自定义调度器(Schedulers)等非常有用(issue 3393)。

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

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

新的 FilePipeline 和 MediaPipeline 特性

scrapy.contracts 改进

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

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

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

  • 修复了合约中的 errback 处理,例如在为返回非 200 响应的 URL 执行合约时(issue 3371)。

可用性改进

  • RobotsTxtMiddleware 增加更多统计信息(issue 3100

  • 使用 INFO 级别日志显示 telnet host/port(issue 3115

  • 在 RobotsTxtMiddleware 中为 IgnoreRequest 添加消息(issue 3113

  • 改进了 Response.followurl 参数的验证(issue 3131

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

  • 链接提取改进:scheme 列表中添加 "ftp"(issue 3152);常见视频扩展名列表中添加 "flv"(issue 3165

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

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

  • Referer header 值添加到 RFPDupeFilter 日志消息中(issue 3588

错误修复

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

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

  • 复制 Requests 时,flags 现在会被保留(issue 3342);

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

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

文档改进

移除弃用项

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

其他改进和清理

Scrapy 1.5.2 (2019-01-22)

  • 安全错误修复:Telnet 控制台扩展可能被恶意网站通过向 http://localhost:6023 POST 内容而轻易利用,我们尚未找到从 Scrapy 内部利用的方法,但很容易欺骗浏览器来实现,从而增加了本地开发环境的风险。

    此修复向后不兼容,它默认启用了 telnet 用户名-密码认证,密码随机生成。如果无法立即升级,请考虑将 TELNETCONSOLE_PORT 设置为非默认值。

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

  • Backport CI 在 GCE 环境下由于 boto 导入错误导致构建失败。

Scrapy 1.5.1 (2018-07-12)

这是一个维护版本,包含重要的错误修复,但不包含新特性

Scrapy 1.5.0 (2017-12-29)

此版本带来了一些小的新特性和改进,遍布整个代码库。一些亮点包括:

  • FilesPipeline 和 ImagesPipeline 支持 Google Cloud Storage。

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

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

  • scrapy parse 命令现在允许通过 --meta 参数设置自定义的 request meta。

  • 改进了对 Python 3.6、PyPy 和 PyPy3 的兼容性;现在通过在 CI 上运行测试,官方支持 PyPy 和 PyPy3。

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

  • 文档照例得到改进。

向后不兼容的更改

  • Scrapy 1.5 不再支持 Python 3.3。

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

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

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

  • RETRY_HTTP_CODES 中添加了 522 和 524 状态码(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 Permanent Redirect(issue 2844

  • 将 522 和 524 添加到 RETRY_HTTP_CODESissue 2851

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

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

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

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

  • 未定义 parse 回调时,为 NotImplementedError 提供明确消息(issue 2831

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

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

  • 对于超过 DOWNLOAD_WARNSIZEDOWNLOAD_MAXSIZE 限制的响应,提供更好的日志消息(issue 2927

  • 当将 URL 放到 Spider.allowed_domains 而非域名时显示警告(issue 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 对 alternate links 的支持(issue 2853

文档

  • AUTOTHROTTLE_TARGET_CONCURRENCY 设置添加了缺失的要点(issue 2756

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

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

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

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

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

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

  • 澄清 CSVFeedSpider.headers 文档(issue 2826

  • 记录 DontCloseSpider 异常并澄清 spider_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 2964, issue 2976

  • ItemExporters 使用的更好示例(issue 2989

  • 记录 spider 和 downloader 中间件的 from_crawler 方法(issue 3019

Scrapy 1.4.0 (2017-05-18)

Scrapy 1.4 并未带来太多令人惊叹的新特性,但带来了一些便捷的改进。

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

新增了创建请求的 response.follow 方法;这现在是在 Scrapy 爬虫中创建 Requests 的推荐方式。此方法使得编写正确的爬虫更加容易;相比直接创建 scrapy.Request 对象,response.follow 有以下几个优点:

  • 它处理相对 URL;

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

  • 除了绝对和相对 URL,它还支持 Selector;对于 <a> 元素,它还可以提取它们的 href 值。

例如,现在可以这样写,而非之前的

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

现在可以这样写

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

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

另请注意,链接提取器默认不再对 URL 进行规范化。这偶尔会让用户困惑,而且实际上与浏览器行为不符,因此我们移除了对提取链接的额外转换。

对于那些希望更精细控制 Scrapy 在跟随链接时发送的 Referer: header 的用户,您可以设置自己的 Referrer Policy。在 Scrapy 1.4 之前,默认的 RefererMiddleware 会简单地、盲目地将其设置为生成 HTTP 请求的响应 URL(这可能会泄露您的 URL 种子信息)。现在,Scrapy 的默认行为更接近普通浏览器。并且此策略可以通过 W3C 标准值进行完全自定义(或者如果需要,也可以使用您自己的自定义值)。详情请参阅 REFERRER_POLICY

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

最后但同样重要的是,Scrapy 现在可以选择通过新的 FEED_EXPORT_INDENT 设置,使 JSON 和 XML 项目更具可读性,在项目之间添加换行符,甚至自定义缩进偏移。

尽情使用吧!(或继续阅读本版本的其他更改。)

弃用和向后不兼容的更改

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

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

  • EDITOR 环境变量现在优先于 EDITOR 选项在 settings.py 中定义的值 (issue 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 progress”徽章 (issue 2567)

  • .gitignore 添加更多行 (issue 2557)

  • 移除 bumpversion prerelease 配置 (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)

错误修复

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

  • 在教程中使用一致的选择器获取 author 字段 (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 变量 和 ad-hoc 命名空间声明;这需要至少 Parsel v1.1 (issue 2457)。

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

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

错误修复

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

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

  • 修复与 Files/Images pipelines 的 *_EXPIRES settings 相关的测试 (issue 2460)。

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

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

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

  • 强制要求 SPIDER_MIDDLEWARESDOWNLOADER_MIDDLEWARESEXTENSIONSSPIDER_CONTRACTS 中组件顺序为数字值 (issue 2420)。

文档

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

  • 澄清传递 spider 参数会将它们转换为 spider 属性的说明 (issue 2483)。

  • 文档化 FormRequest.from_response() 上的 formid 参数 (issue 2497)。

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

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

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

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

  • 错别字 (issue 2512, issue 2534, issue 2531)。

清理

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

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

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

Scrapy 1.3.0 (2016-12-21)

此版本发布距 1.2.2 不久,主要原因在于发现自 0.18 至 1.2.2(包含)的版本即使有较新的 Twisted 模块可用,也使用了 Twisted 的一些回溯代码 (scrapy.xlib.tx.*)。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 现在将错误级别日志从 DEBUG 更改为 INFO;这在技术上是向后不兼容的,请检查你的日志解析器。

  • 默认情况下,logger 名称现在使用长路径形式,例如 [scrapy.extensions.logstats],而不是先前版本的短“顶层”形式(例如 [scrapy]);如果你有期望短 logger 名称部分的日志解析器,这是向后不兼容的。你可以将 LOG_SHORT_NAMES 设置为 True 以切换回短 logger 名称。

依赖与清理

  • Scrapy 现在需要 Twisted >= 13.1,许多 Linux 发行版已满足此要求。

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

  • ChunkedTransferMiddleware 已被废弃并从默认的下载器中间件中移除。

Scrapy 1.2.3 (2017-03-03)

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

Scrapy 1.2.2 (2016-12-06)

错误修复

  • 修复 pipeline 在 open_spider() 失败时出现的隐晦追溯信息 (issue 2011)

  • 修复嵌入式 IPython shell 变量 (修复了 1.2.0 中再次出现的 issue 396,在 issue 2418 中修复)

  • 关于 robots.txt 的几个补丁

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

    • 在 Python 2 中处理非 ASCII URL 和 User-Agents (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 设置,用于自定义将 item 写入文件时使用的编码。这可以用于在 JSON 输出中关闭 \uXXXX 转义符。对于那些希望 XML 或 CSV 输出使用 UTF-8 以外编码的用户来说也很有用 (issue 2034)。

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

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

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

  • application/json-amazonui-streaming 解析为 TextResponse (issue 1503)。

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

错误修复

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

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

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

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

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

  • 修复了将 CrawlSpiderscrapy parse 一起使用时,选定 callbacks 的问题 (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)

错误修复

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

错误修复

  • 在 CONNECT 请求中向 HTTPS 代理添加“Host”头部 (issue 2069)。

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

  • 标准化带有错误 netloc 的 URL 时不再失败 (issue 2038, 修复了 issue 2010)。

  • HttpCompressionMiddleware (和 SitemapSpider) 的一些修复。

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

  • 重新使 FilesPipelineImagesPipeline 在使用遗留类属性进行自定义方面向后兼容 (issue 1989, 修复了 issue 1985)。

新功能

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

  • 默认重试 HTTPS CONNECT TunnelError (issue 1974)。

文档

  • FEED_TEMPDIR 设置按字母顺序排序 (commit 9b3c72c)。

  • 在概览中使用更地道的 .extract_first() (issue 1994)。

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

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

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

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

  • 新增了关于在 spider callbacks 中使用 BeautifulSoup 的 FAQ 条目 (issue 2048)。

  • 添加了关于 Scrapy 在 Windows 上使用 Python 3 不工作的说明 (issue 2060)。

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

测试

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

Scrapy 1.1.0 (2016-05-11)

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

  • Scrapy 1.1 支持 Python 3 的 beta 版本(需要 Twisted >= 15.5)。更多详情和一些限制请参见Python 3 Beta 支持

  • 热门新功能

  • 这些错误修复可能需要您注意

    • 默认情况下不重试错误请求(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)。如果您想禁用此行为,请在创建新项目后更新 settings.py 文件中的 ROBOTSTXT_OBEY 设置。

    • Exporter 现在默认处理 unicode,而不是 bytes (issue 1080)。如果您使用 PythonItemExporter,您可能需要更新您的代码以禁用已弃用的二进制模式。

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

    • 使用 FilesPipelineImagesPipeline 上传文件或图像到 S3 时,默认 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 上运行 spider(需要 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)。警告:不向后兼容,但不会破坏用户代码。

  • 以下数据类型已被弃用 (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)

  • FIX:RetryMiddleware 现在能够健壮地处理非标准 HTTP 状态码 (issue 1857)。

  • FIX:文件存储 HTTP 缓存检查了错误的修改时间 (issue 1875)。

  • DOC:支持 Sphinx 1.4+ (issue 1893)。

  • DOC:选择器示例保持一致 (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 Items 来收集从 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

更新日志

新功能和增强

废弃和移除

  • 弃用 htmlparser link extractor (issue 1205)

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

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

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

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

  • 弃用 SgmlLinkExtractor (issue 777)

重定位

文档

Bug 修复

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

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

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

  • 强制将 DOWNLOAD_TIMEOUT 读取为 int 类型 (issue 954)

  • scrapy.utils.misc.load_object 应该打印完整的堆栈跟踪 (issue 902)

  • 修复“.local”主机名 bug (issue 878)

  • 修复 Enabled extensions, middlewares, pipelines 信息不再打印的问题 (issue 879)

  • 修复当 meta 中 dont_merge_cookies 设置为 false 时的错误行为 (issue 846)

Python 3 支持进展中

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

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

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

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

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

  • 更新已弃用的 cgi.parse_qsl 以使用 six 的 parse_qsl (issue 909)

  • 防止 Python 3 移植回归问题 (issue 830)

  • Python 3:为 Python 3 使用 MutableMapping (issue 810)

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

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

  • Python 3:对 robotparser 和 urlparse 使用 six (issue 800)

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

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

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

  • Python 3:使部分测试可以在 Python 3 中运行 (issue 776)

测试

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

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

  • 在 travis 中添加文档构建 (issue 1234)

  • 测试:不从已弃用模块中收集测试。(issue 1165)

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

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

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

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

  • 现代化一些 assert (issue 835)

  • selector.__repr__ 测试 (issue 779)

代码重构

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

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

  • Pydispatch pep8 规范 (issue 992)

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

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

  • 将本地变量“sflo”重命名为更清晰的“log_observer” (issue 775)

Scrapy 0.24.6 (2015-04-20)

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)

改进

  • 改进 Scrapy 顶级命名空间 (issue 494, issue 684)

  • 为响应添加选择器快捷方式 (issue 554, issue 690)

  • 添加新的基于 lxml 的 LinkExtractor 以替换不再维护的 SgmlLinkExtractor (issue 559, issue 761, issue 763)

  • 清理 settings API - per-spider settings GSoC 项目 的一部分 (issue 737)

  • 为模板添加 UTF8 编码头 (issue 688, issue 762)

  • Telnet 控制台现在默认绑定到 127.0.0.1 (issue 699)

  • 更新 Debian/Ubuntu 安装说明 (issue 509, issue 549)

  • 在 lxml XPath 求值中禁用 smart strings (issue 535)

  • 将基于文件系统的缓存恢复为 http 缓存中间件的默认设置 (issue 541, issue 500, issue 571)

  • 在 Scrapy shell 中暴露当前爬虫 (issue 557)

  • 改进比较 CSV 和 XML 导出器的测试套件 (issue 570)

  • 新增 offsite/filteredoffsite/domains 统计信息 (issue 566)

  • 在 CrawlSpider 中支持 process_links 作为生成器 (issue 555)

  • 为 DupeFilter 添加更详细的日志记录和新的统计计数器 (issue 553)

  • MailSender.send() 添加 mimetype 参数 (issue 602)

  • 泛化文件管道的日志消息 (issue 622)

  • 在 SGMLLinkExtractor 中用 html 实体替换无法编码的码位 (issue 565)

  • 将 SEP 文档转换为 rst 格式 (issue 629, issue 630, issue 638, issue 632, issue 636, issue 640, issue 635, issue 634, issue 639, issue 637, issue 631, issue 633, issue 641, issue 642)

  • FormRequest 中 clickdata 的 nr 索引的测试和文档 (issue 646, issue 645)

  • 允许像禁用其他组件一样禁用下载器处理程序 (issue 650)

  • 请求在重定向过多后被丢弃时记录日志 (issue 654)

  • 如果错误响应未由爬虫回调处理,则记录日志 (issue 612, issue 656)

  • 为 http 压缩中间件添加 content-type 检查 (issue 193, issue 660)

  • 使用来自 ppa 的最新 pypi 运行 pypy 测试 (issue 674)

  • 使用 pytest 而非 trial 运行测试套件 (issue 679)

  • 在 tox 环境中构建文档并检查死链接 (issue 687)

  • 将 scrapy.version_info 设为整数元组 (issue 681, issue 692)

  • 从文件名扩展名推断导出器的输出格式 (issue 546, issue 659, issue 760)

  • url_is_from_any_domain() 中支持不区分大小写的域名 (issue 693)

  • 移除项目和爬虫模板中的 pep8 警告 (issue 698)

  • request_fingerprint 函数的测试和文档 (issue 597)

  • 更新 GSoC 项目 per-spider settings 的 SEP-19 (issue 705)

  • 合约失败时设置非零退出码 (issue 727)

  • 添加一个设置来控制哪个类实例化为下载器组件 (issue 738)

  • item_dropped 信号中传递响应 (issue 724)

  • 改进 scrapy check 合约命令 (issue 733, issue 752)

  • 文档记录 spider.closed() 快捷方式 (issue 719)

  • 文档记录 request_scheduled 信号 (issue 746)

  • 添加关于报告安全问题的说明 (issue 697)

  • 添加 LevelDB http 缓存存储后端 (issue 626, issue 500)

  • scrapy list 命令的爬虫列表输出进行排序 (issue 742)

  • 多项文档增强和修复 (issue 575, issue 587, issue 590, issue 596, issue 610, issue 617, issue 618, issue 627, issue 613, issue 643, issue 654, issue 675, issue 663, issue 711, issue 714)

Bug 修复

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

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

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

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

  • 修复 sitemap 读取器中的 XXE 漏洞 (issue 676)

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

  • 修复 offsite 中间件处理没有主机名的 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)

  • 合并 #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)

  • 合并来自 stray-leone/patch-1 的 pull request #550 (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 392, issue 397)

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

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

  • Selectors 默认注册 EXSLT 命名空间 (issue 472)

  • 统一 item loader,类似于选择器重命名 (issue 461)

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

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

  • 将关于 settings 和 middleware 的启动信息提升到 INFO 级别 (issue 520)

  • get_func_args 工具函数中支持 partials (issue 506, issue:504)

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

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

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

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

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

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

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

  • 在发现旧代码的地方使用现代 Python 习惯用法 (issue 497)

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

修复

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

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

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

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

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

  • 对内存统计信息的多项修复 (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 是从发布源构建 wheels 所必需的 (commit 5ba1ad5)

  • process_parallel 泄露了其内部 deferred 的失败。关闭 #458 (commit 419a780)

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

改进

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

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

  • ITEM_PIPELINES 现在定义为 dict(而非 list)

  • Sitemap 爬虫可以抓取备用 URL (issue 360)

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

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

  • 新的 item 导出器,使用原生 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)

  • Mock 服务器(用于测试)可以监听 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 (issue 372)

  • 修复 SIGINT 时爬取关闭的 Bug (issue 450)

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

  • 当请求 errback 抛出异常时,不要静默下载错误 (commit 684cfc0)

Bug 修复

  • 修复 Django 1.6 下的测试 (commit b6bed44c)

  • 使用 HTTP 1.1 下载处理程序时,对断开连接情况下的重试中间件进行了许多 Bug 修复

  • 修复 Twisted 版本之间不一致的问题 (issue 406)

  • 修复 Scrapy shell 的 Bug (issue 418, issue 407)

  • 修复 setup.py 中无效的变量名 (issue 429)

  • 修复教程引用 (issue 387)

  • 改进请求-响应文档 (issue 391)

  • 改进最佳实践文档 (issue 399, issue 400, issue 401, issue 402)

  • 改进 django 集成文档 (issue 404)

  • 文档记录 bindaddress 请求 meta (commit 37c24e01d7)

  • 改进 Request 类文档 (issue 226)

其他

  • 放弃 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 pre 11.0.0 下的爬取测试 (commit 1994f38)

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

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

  • 将没有 content-length 或 Transfer-Encoding 的响应视为正常响应 (commit c4bf324)

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

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

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

  • 合并来自 peterarenot/patch-1 的 pull request #375 (commit fa766d7)

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

  • 添加了 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 crawlable URL 的 GET 参数 (commit 3fe2a32)

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

  • 修复 cookie 合并问题:按 hostname 而非 netloc 合并 (issue 352)

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

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

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

  • 修复 scrapy.utils.gz.gunzip 因 python 2.7.4 中的更改而损坏的问题 (commit 4dc76e)

  • 修复 SgmlLinkExtractor 中的 url 编码问题 (issue 24)

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

  • XML 导出器支持嵌套 item (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)

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

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

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

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

  • 允许 spider 的 allowed_domains 值设置为 set/tuple (issue 261)

  • 支持 settings.getdict (issue 269)

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

  • 添加了 Item.copy (issue 290)

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

  • 添加 ftp:// 协议的下载处理程序 (issue 329)

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

  • 将持久化(磁盘)队列移至独立项目 (queuelib),Scrapy 现在依赖于此项目。

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

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

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

  • spider 契约的多项改进

  • 新的默认中间件 `MetaRefreshMiddleware`,处理 meta-refresh HTML 标签重定向,

  • MetaRefreshMiddlewareRedirectMiddleware 具有不同的优先级,以解决 #62 问题。

  • 向 spider 添加了 from_crawler 方法。

  • 添加了使用 mock 服务器的系统测试。

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

  • singletons 和多 spider 支持的更多清理工作(感谢 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 deploy 重定向到新端点时遵循请求方法 (commit 8c4fcee)

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

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

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

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

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

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

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

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

  • 对图片 pipeline 的错误日志进行 linting 并改进 (commit 56b45fc)

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

  • 添加文档主题:Broad Crawls & Common Practices (commit 1fbb715)

  • 修复在未明确指定 spider 时 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)

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

  • 移除了 .hgtags(Scrapy 现在使用 git,不再需要) (commit d52c188)

  • 修复 rst 标题下的横线问题 (commit fa4f7f9)

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

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

Scrapy 变更

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

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

  • 文档化了 AutoThrottle 扩展 并将其添加到默认安装的扩展中。您仍然需要通过 AUTOTHROTTLE_ENABLED 设置启用它

  • 重大统计收集重构:移除了全局/每个 spider 统计信息的分离,移除了与统计信息相关的信号(stats_spider_opened 等)。现在统计信息更简单,在 Stats Collector API 和信号上保留了向后兼容性。

  • 向 spider 中间件添加了 process_start_requests() 方法

  • 放弃了 Signals singleton。现在应该通过 Crawler.signals 属性访问信号。详见信号文档。

  • 放弃了 Stats Collector singleton。现在可以通过 Crawler.stats 属性访问统计信息。详见统计信息收集文档。

  • 文档化了 核心 API

  • lxml 现在是默认的选择器后端,取代了 libxml2

  • FormRequest.from_response() 移植为使用 lxml 而非 ClientForm

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

  • SitemapSpider:添加了对以 .xml 和 .xml.gz 结尾的 sitemap url 的支持,即使它们宣称的内容类型不正确 (commit 10ed28b)

  • StackTraceDump 扩展:同时 dump trackref 活动引用 (commit fe2ce93)

  • JSON 和 JSONLines 导出器现已完全支持嵌套 item

  • 添加了 cookiejar 请求元数据键,以支持每个 spider 多个 cookie 会话

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

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

  • 放弃了对 Twisted 2.5 的支持

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

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

  • 移除了 scrapy.contrib.linkextractors.image 中的(未文档化的)HTMLImageLinkExtractor

  • 移除了每个 spider 的设置(将由实例化多个 crawler 对象取代)

  • USER_AGENT spider 属性将不再起作用,请改用 user_agent 属性。

  • DOWNLOAD_TIMEOUT spider 属性将不再起作用,请改用 download_timeout 属性。

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

  • DjangoItem 提升为主 contrib。

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

  • 下载器处理程序(DOWNLOAD_HANDLERS 设置)现在将 settings 作为 __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)

  • 更新项目模板中的 docstring,以避免与 genspider 命令混淆,后者可能被视为高级功能。refs #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

Scrapy 0.14.1

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

  • 将版本提升到 0.14.1 (commit 6cb9e1c)

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

  • 文档:移除了 Request.replace() 中重复的 callback 参数 (commit 1aeccdd)

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

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

  • 添加了关于为什么在 boto 图片上传时禁用 ssl 的注释 (commit 5223575)

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

  • 修改教程以遵循 dmoz 站点的更改 (commit bcb3198)

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

  • 允许 spider 设置 autothrottle 最大并发数 (commit 175a4b5)

Scrapy 0.14

新功能和设置

  • 支持 AJAX 可爬取 URL。

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

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

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

  • 新的 ChunkedTransferMiddleware 中间件(默认启用),支持 分块传输编码 (r2769)

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

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

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

  • 下载器重大重构,支持按域名/IP 设置并发限制 (r2732)
  • 添加了内置缓存 DNS 解析器 (r2728)

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

  • 将 spider 队列移至 scrapyd:scrapy.spiderqueue -> scrapyd.spiderqueue (r2708)

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

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

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

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

  • 添加了 CloseSpider 异常,可手动关闭 spider (r2691)

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

  • 重构了关闭 spider 的行为,在关闭 spider 之前等待所有下载完成并由 spider 处理 (r2688)

  • 添加了 SitemapSpider(详见 Spiders 页面文档) (r2658)

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

  • 使 gzipped 响应的处理更健壮 (#319, r2643)。现在 Scrapy 将尝试从 gzipped 响应中尽可能多地解压,而不是因 IOError 失败。

  • 简化了 MemoryDebugger 扩展,使用统计信息 dump 内存调试信息 (r2639)

  • 添加了编辑 spider 的新命令:scrapy edit (r2636),以及使用它的 genspider 命令的 -e 标志 (r2653)

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

  • 添加了 spider_error 信号 (r2628)

  • 添加了 COOKIES_ENABLED 设置 (r2625)

  • 统计信息现在被 dump 到 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 和链接提取器的多项改进

代码重排和移除

  • 合并了 item passed 和 item scraped 的概念,因为它们在过去常常令人困惑。这意味着:(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 item 中对默认字段值的支持 (r2616)

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

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

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

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

  • 移除了(未文档化的)spider context 扩展(来自 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 现在通过 item_passed 信号的 item 参数发送 (#273)

  • scrapy version 命令添加了 verbose 选项,对于 Bug 报告很有用 (#298)

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

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

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

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

  • 每个 spider 的设置 (#245)

  • 支持使用退出码来指示 Scrapy 命令中的错误 (#248)

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

  • 使 libxml2 成为可选 (#260)

  • 新的 deploy 命令 (#261)

  • 添加了 CLOSESPIDER_PAGECOUNT 设置 (#253)

  • 添加了 CLOSESPIDER_ERRORCOUNT 设置 (#254)

Scrapyd 变更

  • Scrapyd 现在每个 spider 使用一个进程

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

  • 添加了一个最小的 web UI,默认可在 http://localhost: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) 中的工单,该跟踪器现已不再可用。

新特性和改进

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

  • 简化的 Images pipeline 用法,不再需要子类化自己的 images pipeline (#217)

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

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

  • 新的持久性 spider queue(基于 SQLite)(#198),默认可用,允许以服务器模式启动 Scrapy,然后调度 spider 运行。

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

  • 支持可插拔后端的 Feed exporters (#197)(文档可用)

  • Deferred signals (#193)

  • 为 item pipeline 添加了两个新方法 open_spider(), close_spider(),支持 deferred (#195)

  • 支持按 spider 覆盖默认请求头 (#181)

  • 用一个功能类似但不依赖于 Twisted Plugins 的 Spider Manager 替换了默认的 (#186)

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

  • Scrapy 日志重构 (#188)

  • 新的扩展,用于在不同运行之间保持持久的 spider 上下文 (#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 变更

  • Request 对象的 urlbody 属性现在是只读的 (#230)

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

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

  • Offsite 中间件不再过滤掉来自没有 allowed_domains 属性的 spider 的任何请求 (#225)

  • 移除了 Spider Manager 的 load() 方法。现在 spider 在 __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 移至 scrapy.project.crawler 单例的 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 中忽略某些 schemes (#225)

  • 添加了 SPIDER_QUEUE_CLASS 设置,用于定义要使用的 spider queue (#220)

  • 添加了 KEEP_ALIVE 设置 (#220)

  • 移除了 SERVICE_QUEUE 设置 (#220)

  • 移除了 COMMANDS_SETTINGS_MODULE 设置 (#201)

  • REQUEST_HANDLERS 重命名为 DOWNLOAD_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 console)。(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 现在处理相对 base 标签 URL (r1960 | #148)

  • Item Loaders 和处理器进行了多项改进 (r2022, r2023, r2024, r2025, r2026, r2027, r2028, r2029, r2030)

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

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

API 变更

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

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

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

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

  • 添加了 ExecutionQueue 用于向爬虫馈送待抓取的数据 (r2034)

  • 移除了 ExecutionEngine 单例 (r2039)

  • S3ImagesStore (images pipeline) 移植为使用 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 参数 (r1813, r1816)

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

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

  • Offsite spider 中间件现在在过滤请求时记录消息 (r1841)

向后不兼容的变更

  • 更改了 scrapy.utils.response.get_meta_refresh() 签名 (r1804)

  • 移除了已弃用的 scrapy.item.ScrapedItem 类 - 请改用 scrapy.item.Item (r1838)

  • 移除了已弃用的 scrapy.xpath 模块 - 请改用 scrapy.selector (r1836)

  • 移除了已弃用的 core.signals.domain_open 信号 - 请改用 core.signals.domain_opened (r1822)

  • log.msg() 现在接收一个 spider 参数 (r1822)
    • 旧的 domain 参数已被弃用,并将在 0.9 中移除。对于 spider,您应始终使用 spider 参数并传递 spider 引用。如果您确实想传递一个字符串,请改用 component 参数。

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

  • 更改了 Item pipeline 以使用 spider 而不是 domains
    • process_item() item pipeline 方法的 domain 参数已更改为 spider,新的签名是:process_item(item, spider) (r1827 | #105)

    • 要快速移植您的代码(使其适用于 Scrapy 0.8),只需在您之前使用 domain 的地方使用 spider.domain_name

  • 更改了 Stats API 以使用 spider 而不是 domains (r1849 | #113)
    • StatsCollector 已更改为在其方法(set_value, inc_value 等)中接收 spider 引用(而不是 domains)。

    • 添加了 StatsCollector.iter_spider_stats() 方法

    • 移除了 StatsCollector.list_domains() 方法

    • 此外,Stats 信号已重命名,现在传递 spider 引用(而不是 domains)。以下是变更总结

    • 要快速移植您的代码(使其适用于 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_DOMAINCONCURRENT_REQUESTS_PER_SPIDER (r1830, r1844)

  • 重命名设置:CONCURRENT_DOMAINSCONCURRENT_SPIDERS (r1830)

  • 重构了 HTTP Cache 中间件

  • HTTP Cache 中间件已进行了大量重构,保留了相同的功能,但移除了 domain sectorization (r1843 )

  • 重命名异常:DontCloseDomainDontCloseSpider (r1859 | #120)

  • 重命名扩展:DelayedCloseDomainSpiderCloseDelay (r1861 | #121)

  • 移除了过时的 scrapy.utils.markup.remove_escape_chars 函数 - 请改用 scrapy.utils.markup.replace_escape_chars (r1865)

Scrapy 0.7

Scrapy 的首次发布。