发行说明

Scrapy 2.14.0 (2026-01-05)

亮点

  • 更多基于协程的 API 替代了基于 Deferred 的 API

  • 默认优先级队列现为 DownloaderAwarePriorityQueue

  • 停止支持 Python 3.9 和 PyPy 3.10

  • 改进并记录了自定义下载处理程序(download handler)的 API

修改的依赖要求

  • 停止支持 Python 3.9。( issue 7121 )

  • 停止支持 PyPy 3.10。( issue 7050 )

  • 提高了以下依赖项的最低版本要求:

    • lxml: 4.6.0 → 4.6.4

    • Pillow (可选依赖): 8.0.0 → 8.3.2

    • botocore (可选依赖): 1.4.87 → 1.13.45

  • 恢复了在 Scrapy 2.13.4 中删除的对 brotlicffi 的支持。其最低支持版本现为 1.2.0.0。( issue 7160 )

向后不兼容的变化

  • 如果您在 spider 级别TWISTED_REACTOR 设置为 非 asyncio 值,现在在通过命令行工具运行 Scrapy 时,可能需要将 FORCE_CRAWLER_PROCESS 设置为 True,以避免 reactor 不匹配异常。( issue 6845 )

  • log_count/* 统计信息不再包含以前计算的一些早期消息。虽然在计数器初始化之前发出的最早日志消息从未被计算在内,但现在的计数器初始化发生得比以前的 Scrapy 版本晚。如果您在代码中检索并比较这些统计数据的值,可能需要调整预期值。( issue 7046 )

  • 下面列出的类现在是抽象基类。它们不能直接实例化,其子类需要重写下面列出的抽象方法才能实例化。如果您以前直接实例化这些类,现在需要对它们进行子类化,并为抽象方法提供琐碎(例如为空)的实现。

    ( issue 6930 )

  • Scrapy 不再向 stats collector(统计收集器)的任何方法传递 spider 参数。即使在旧版本的 Scrapy 中,许多调用中也没有传递该参数,因此我们预计现有的自定义统计收集器实现不需要 spider 参数。如果您的实现需要 Spider 实例,可以从传递给构造函数的 Crawler 实例中获取。( issue 7011 )

  • scrapy.middleware.MiddlewareManager 不再包含处理 open_spider()close_spider() 组件方法的代码。由于此代码仅用于管道(pipeline),它已被移至 scrapy.pipelines.ItemPipelineManager 中。此更改应仅影响 MiddlewareManager 的自定义子类。以下代码已被移除:

    • scrapy.middleware.MiddlewareManager.open_spider()

    • scrapy.middleware.MiddlewareManager.close_spider()

    • scrapy.middleware.MiddlewareManager._add_middleware() 中处理 open_spider()close_spider() 组件方法的代码。

    ( issue 7006 )

  • scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware.process_request() 现在返回一个协程,以前它返回一个 Deferred 对象或 Nonerobot_parser() 方法也更改为返回一个协程。此更改仅影响子类化 RobotsTxtMiddleware 或直接调用其方法的代码。( issue 6802 )

  • 内置的下载处理程序已重构,更改了它们的方法签名。此更改应仅影响子类化这些处理程序或直接调用其方法的代码。( issue 6778, issue 7164 )

  • scrapy.pipelines.media.MediaPipeline.process_item() 现在返回一个协程,以前它返回一个 Deferred 对象。此更改仅影响直接调用此方法的代码。( issue 7177 )

移除已弃用的功能

  • 以下组件在 Scrapy 2.12.0 中弃用的 from_settings() 方法已被移除。您应该改用 from_crawler()

    ( issue 7126 )

  • Scrapy 不再调用第三方组件中在 Scrapy 2.12.0 中弃用的 from_settings() 方法。您应该定义 from_crawler() 方法来代替。( issue 7126 )

  • scrapy.pipelines.media.MediaPipeline 及其子类的初始化流程已简化,现在强制要求使用 from_crawler() 方法和 __init__() 方法的 crawler 参数。不使用这些方法的做法已在 Scrapy 2.12.0 中弃用。( issue 7126 )

  • 在 Scrapy 2.12.0 中弃用的 REQUEST_FINGERPRINTER_IMPLEMENTATION 设置已被移除。( issue 7126 )

  • 在 Scrapy 2.12.0 中弃用的 scrapy.utils.misc.create_instance() 函数已被移除。请改用 scrapy.utils.misc.build_from_crawler()。( issue 7126 )

  • 在 Scrapy 2.12.0 中弃用的 scrapy.core.downloader.Downloader._get_slot_key() 函数已被移除。请改用 scrapy.core.downloader.Downloader.get_slot_key()。( issue 7126 )

  • 在 Scrapy 2.12.0 中弃用的 scrapy.twisted_version 属性已被移除。您应该直接使用 twisted.version 属性。( issue 7126 )

  • 以下在 Scrapy 2.12.0 中弃用的实用函数已被移除:

    • scrapy.utils.defer.process_chain_both()

    • scrapy.utils.python.equal_attributes()

    • scrapy.utils.python.flatten()

    • scrapy.utils.python.iflatten()

    • scrapy.utils.request.request_authenticate()

    • scrapy.utils.test.assert_samelines()

    ( issue 7126 )

  • 在 Scrapy 2.12.0 中弃用的 scrapy.utils.serialize.ScrapyJSONDecoder 已被移除。( issue 7126 )

  • 在 Scrapy 2.12.0 中弃用的 scrapy.extensions.feedexport.build_storage() 函数已被移除,您可以直接调用构建器可调用对象。( issue 7126 )

  • 在 Scrapy 2.11.2 中弃用的 scrapy.spidermiddlewares.offsite.OffsiteMiddleware 已被移除。应改用 scrapy.downloadermiddlewares.offsite.OffsiteMiddleware。( issue 6926 )

弃用项

  • 以下返回 Deferred 的方法已被弃用,建议使用其基于协程的替代方案:

    • scrapy.core.downloader.handlers.DownloadHandlers

      • download_request() (使用 download_request_async())

    • scrapy.core.downloader.middleware.DownloaderMiddlewareManager

      • download() (使用 download_async())

    • scrapy.core.engine.ExecutionEngine

      • start() (使用 start_async())

      • stop() (使用 stop_async())

      • close() (使用 close_async())

      • open_spider() (使用 open_spider_async())

      • close_spider() (使用 close_spider_async())

      • download() (使用 download_async())

    • scrapy.core.scraper.Scraper

      • open_spider() (使用 open_spider_async())

      • call_spider() (使用 call_spider_async())

      • close_spider() (使用 close_spider_async())

      • handle_spider_output() (使用 handle_spider_output_async())

      • start_itemproc() (使用 start_itemproc_async())

    • scrapy.core.spidermw.SpiderMiddlewareManager

      • scrape_response() (使用 scrape_response_async())

    • scrapy.crawler.Crawler

    • scrapy.pipelines.ItemPipelineManager

      • process_item() (使用 process_item_async())

      • open_spider() (使用 open_spider_async())

      • close_spider() (使用 close_spider_async())

    • scrapy.signalmanager.SignalManager

    • scrapy.utils.signal.send_catch_log_deferred() (使用 scrapy.utils.signal.send_catch_log_async())

    ( issue 6791, issue 6842, issue 6979, issue 6997, issue 6999, issue 7005, issue 7043, issue 7069, issue 7161, issue 7164 )

  • 以下 spider 属性已被弃用,建议改用设置(settings):

    ( issue 6988, issue 6994, issue 7038, issue 7039, issue 7117, issue 7176 )

  • 以下用户定义函数返回 Deferred 已被弃用,建议将它们定义为协程函数:

    • spider 的回调函数(callbacks)和异常回调(errbacks)(这从未被正式支持,且可能工作不正常)

    • 自定义下载器中间件(downloader middlewares)的 process_request(), process_response()process_exception() 方法

    • 自定义管道(pipelines)的 process_item(), open_spider()close_spider() 方法

    • 信号处理程序(signal handlers)

    • 自定义下载处理程序的 download_request()close() 方法

    ( issue 6718, issue 6778, issue 7069, issue 7147, issue 7148, issue 7149, issue 7150, issue 7151, issue 7161, issue 7164, issue 7179 )

  • 向以下方法传递 spider 参数已被弃用:

    • scrapy.core.spidermw.SpiderMiddlewareManager.process_start()

    • scrapy.core.downloader.Downloader.fetch()

    • scrapy.core.downloader.Downloader._get_slot()

    • scrapy.core.downloader.handlers.DownloadHandlers.download_request()

    • scrapy.statscollectors.StatsCollector 的所有公共方法

    • scrapy.spidermiddlewares.base.BaseSpiderMiddleware.process_spider_output()

    • scrapy.spidermiddlewares.base.BaseSpiderMiddleware.process_spider_output_async()

    • 内置下载器中间件的所有 process_*() 方法

    • 内置 spider 中间件的所有 process_*() 方法

    • scrapy.pipelines.media.MediaPipeline.open_spider()

    • scrapy.pipelines.media.MediaPipeline.process_item()

    ( issue 6750, issue 6927, issue 6984, issue 7006, issue 7011, issue 7033, issue 7037, issue 7045, issue 7178 )

  • 在没有 Crawler 实例的情况下实例化 scrapy.middleware.MiddlewareManager 的子类已被弃用。( issue 6984 )

  • 对于以下需要 spider 参数的用户定义函数和方法,该参数已被弃用。如果您在这些方法内部需要 Spider 实例,应该从 Crawler 实例中获取(您可能需要重构代码以在例如 from_crawler() 方法中保存该实例):

    • 自定义下载器中间件(downloader middlewares)的 process_request(), process_response()process_exception() 方法

    • 自定义 spider 中间件的 process_spider_input(), process_spider_output(), process_spider_output_async()process_spider_exception() 方法

    • 自定义管道的 process_item() 方法

    • 自定义 DOWNLOADER(下载器)fetch() 方法

    ( issue 6927, issue 6984, issue 7006, issue 7037 )

  • 自定义下载处理程序中的以下内容已被弃用:

    • 没有 lazy 属性(如果您想保持当前行为,应将其定义为 True

    • download_request() 方法返回 Deferred(您应该重构它以返回协程;执行此操作时还需要移除 spider 参数)

    • 没有 close() 方法,或者拥有一个同步方法或返回 Deferred 的方法(您应该重构它以返回协程,或者如果还没有,则添加一个空的协程方法)

    ( issue 6778, issue 7164 )

  • ITEM_PROCESSOR 的自定义实现现在应定义 process_item_async(), open_spider_async()close_spider_async() 方法,以替代或补充 process_item(), open_spider()close_spider()。( issue 7005, issue 7043 )

  • CONCURRENT_REQUESTS_PER_IP 设置已被弃用,请改用 CONCURRENT_REQUESTS_PER_DOMAIN。( issue 6917, issue 6921 )

  • scrapy.core.downloader.handlers.http 模块已被弃用。您应该直接导入 scrapy.core.downloader.handlers.http11.HTTP11DownloadHandler,而不是导入 scrapy.core.downloader.handlers.http.HTTPDownloadHandler 别名。( issue 7079 )

  • scrapy.utils.decorators.defers() 装饰器已被弃用,您可以直接使用 twisted.internet.defer.maybeDeferred(),或者在代码中重新实现此装饰器。( issue 7164 )

  • scrapy.spiders.CrawlSpider._parse_response() 已被弃用,请改用 scrapy.spiders.CrawlSpider.parse_with_rules()。( issue 4463, issue 6804 )

  • 为 Deferred 添加延迟的函数已被弃用,可以改用它们底层的 Twisted 函数:如果不需延迟则直接使用,如果需要则以显式方式添加延迟。

    ( issue 6937 )

新功能

改进

错误修复

文档

质量保证

Scrapy 2.13.4 (2025-11-17)

安全错误修复

  • 改进了 HttpCompressionMiddleware 对使用 brdeflate 方法压缩的响应的解压缩炸弹(decompression bombs)保护:如果单个压缩块解压后的预期大小超过响应大小限制(参见 DOWNLOAD_MAXSIZE),则不再进行解压缩。这对于可以提供极高压缩率的 br (Brotli) 方法尤为重要。有关详细信息,请参阅 CVE-2025-6176GHSA-2qfp-q593-8484 安全公告。( issue 7134 )

修改的依赖要求

  • 可选包 brotli 的最低支持版本现为 1.2.0。( issue 7134 )

  • brotlicffibrotlipy 包不再能用于解压 Brotli 压缩响应。请安装 brotli 包代替。( issue 7134 )

其他变化

  • 限制了最高支持的 Twisted 版本为 25.5.0,因为 Scrapy 目前使用了一些在后续 Twisted 版本中已更改的私有 API。( issue 7142 )

  • 停止在测试中设置 COVERAGE_CORE 环境变量,该变量不起作用但会导致 coverage 模块产生警告或错误。( issue 7137 )

  • 移除了文档构建对已弃用的 sphinx-hoverxref 模块的依赖。( issue 6786, issue 6922 )

Scrapy 2.13.3 (2025-07-02)

Scrapy 2.13.2 (2025-06-09)

Scrapy 2.13.1 (2025-05-28)

  • 当优先级值相同时,使回调请求(callback requests)优先于启动请求(start requests)。

    这使得 2.13.0 中对启动请求处理的更改更加直观且向后兼容。对于所有请求具有相同优先级的场景,在 2.13.0 中,所有启动请求都会在第一个回调请求之前发送。在 2.13.1 中,与 2.12 及更低版本一样,仅当挂起的回调请求不足以达到并发限制时,才会发送启动请求。

    ( issue 6828 )

  • 在 README 中添加了 deepwiki 徽章。( issue 6793 )

  • 修复了延迟启动请求迭代代码示例中的一个拼写错误。( issue 6812, issue 6815 )

  • 修复了文档中受支持的可调用对象章节的一个拼写错误。( issue 6822 )

  • 使本页面在 PyPI 项目链接中的列表显示更加显著。( issue 6826 )

Scrapy 2.13.0 (2025-05-08)

亮点

修改的依赖要求

向后不兼容的变化

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

  • 启动请求和 item 的迭代不再在调度器中有请求时停止,而是持续运行,直到所有启动请求都已加入调度。

    如需重现之前的行为,请参阅延迟启动请求迭代。( issue 6729 )

  • spider 中间件open_spider() 方法抛出的未处理异常不再导致爬取停止。( issue 6729 )

  • scrapy.core.engine.ExecutionEngine 中:

    • open_spider() 的第二个参数 start_requests 已被移除。启动请求现在由 spider 参数决定(参见 start())。

    • slot 属性已重命名为 _slot,且不应再被直接使用。

    ( issue 6729 )

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

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

  • URLLENGTH_LIMIT 设置的 URL 长度限制,现在也对启动请求生效。( issue 6777 )

  • 现在,在未安装 reactor 的情况下调用 scrapy.utils.reactor.is_asyncio_reactor_installed() 会引发异常,而不是安装 reactor。这不应影响正常的 Scrapy 使用场景,但可能会影响使用 Scrapy 内部组件(如 Crawler)且未显式安装 reactor 的第三方测试套件。如果您受到此更改的影响,您很可能需要在运行期望已安装 reactor 的 Scrapy 代码之前安装它。(issue 6732, issue 6735)

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

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

弃用移除

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

    • stats_spider_opened(请改用 spider_opened

    • stats_spider_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 命令(如 scrapy crawl)时的错误消息。(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)

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

  • scrapy.pipelines.media.MediaPipeline 及其子类的初始化 API 得到了改进,某些以前可以工作的用法场景可能不再有效。这仅在您定义了 MediaPipeline 的自定义子类,或者通过 from_settings()__init__() 而非 from_crawler() 调用创建这些管道实例时才会受到影响。

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

    现在,为了符合 from_crawler()from_settings() 的通用用法以及后者被弃用的情况,推荐的初始化顺序如下:

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

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

    • 现在可以重写 from_crawler(),如果遵循了其他建议,则无需在其中调用 MediaPipeline.from_crawler()

    • 如果以前是通过 from_settings()__init__() 调用创建管道实例的(这即使在以前也是不支持的,因为会丢失重要的初始化代码),现在应通过 from_crawler() 调用来创建。

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

  • 具有爬虫级 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 参数。(issue 6107, issue 6113)

  • Feed 存储后端类__init__()from_crawler() 方法现在必须支持在 Scrapy 2.4.0 中引入的仅限关键字参数 feed_options。(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)

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

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

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

  • 移除了 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()。受影响的组件包括:

    (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__() 方法。

    • 弃用在调用 __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)

新功能

改进

Bug 修复

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

  • 修复了 contract 提取过程中对无效的 @ 前缀行的处理。(issue 6383, issue 6388)

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

  • 降低了在 2.11.2 版本中增加的被丢弃请求的日志详细程度。(issue 6433, issue 6475)

文档

质量保证 (QA)

  • 根据 PEP 561,添加了 py.typed 文件。(issue 6058, issue 6059)

  • 实现了代码的类型提示全覆盖(除了最复杂的部分,主要是与 twisted.web.http 相关及其他缺乏类型提示的 Twisted 组件)。(issue 5989 等多个 issue)

  • 改进了 Bandit 安全检查。(issue 6260, issue 6264, issue 6265)

  • pre-commit 配置中添加了 pyupgrade。(issue 6392)

  • pre-commit 配置中添加了 flake8-bugbearflake8-comprehensionsflake8-debuggerflake8-docstringsflake8-string-formatflake8-type-checking。(issue 6406, issue 6413)

  • CI 及测试的改进与修复。(issue 5285 等多个 issue)

  • 代码清理。(issue 6196 等多个 issue)

其他

  • 问题追踪器 (Issue tracker) 改进。(issue 6066)

Scrapy 2.11.2 (2024-05-14)

安全缺陷修复

弃用项

Bug 修复

文档

质量保证 (QA)

Scrapy 2.11.1 (2024-02-14)

亮点

  • 安全缺陷修复。

  • 支持 Twisted >= 23.8.0。

  • 文档改进。

安全缺陷修复

需求变更

Bug 修复

文档

质量保证 (QA)

Scrapy 2.11.0 (2023-09-18)

亮点

向后不兼容的更改

移除弃用项

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

    注意

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

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

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

弃用项

新特性

Bug 修复

文档

质量保证 (QA)

Scrapy 2.10.1 (2023-08-30)

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

Scrapy 2.10.0 (2023-08-04)

亮点

  • 添加了对 Python 3.12 的支持,停止了对 Python 3.7 的支持。

  • 新的加载组件(add-ons)框架简化了对支持该框架的第三方组件的配置。

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

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

需求变更

向后不兼容的更改

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

移除弃用项

弃用项

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

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

新特性

Bug 修复

文档

质量保证 (QA)

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

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

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

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

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

  • 简化了对依赖 uvloop 的测试的跳过操作。(issue 5984)

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

  • 实施了清理工作。(issue 5965, issue 5986)

Scrapy 2.9.0 (2023-05-08)

亮点

  • 基于域名的下载设置。

  • 兼容新版的 cryptography 和新版的 parsel

  • 支持新版 parsel 提供的 JMESPath 选择器。

  • Bug 修复。

弃用项

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

新特性

Bug 修复

文档

质量保证 (QA)

Scrapy 2.8.0 (2023-02-02)

这是一个维护版本,包含细微功能、错误修复和清理。

弃用功能移除

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

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

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

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

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

  • 对代理 URL 中 noconnect 查询字符串参数的支持(在 Scrapy 2.0 中弃用)现已被移除。我们预计以前需要该参数的代理在没有它的情况下也能正常工作。( 问题 5731)

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

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

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

即将弃用

新功能

错误修复

文档

质量保证

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 标头,但前提是该标头尚未设置。

    有些第三方代理轮换下载器中间件在每次处理请求时都会设置不同的 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)

亮点

安全漏洞修复

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

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

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

    注意

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

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

    旧的行为可能会被攻击者利用,将来自受控域名的 cookie 注入到您的 cookiejar 中,并发送到攻击者未控制的其他域名。请参阅 mfjm-vh54-3f96 安全公告 了解更多信息。

修改后的需求

不兼容向后的变更

弃用功能移除

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

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

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

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

即将弃用

  • 当向 FEED_URI_PARAMS 设置分配函数时,返回 None 或修改 params 输入参数的行为现已弃用。请返回一个新字典。(问题 4962, 问题 4966)

  • scrapy.utils.reqser 现已弃用。(问题 5130)

  • scrapy.squeues 中,以下队列类已弃用:PickleFifoDiskQueueNonRequest, PickleLifoDiskQueueNonRequest, MarshalFifoDiskQueueNonRequest, 和 MarshalLifoDiskQueueNonRequest。您应该改用:PickleFifoDiskQueue, PickleLifoDiskQueue, MarshalFifoDiskQueue, 和 MarshalLifoDiskQueue。(问题 5117)

  • scrapy.core.engine.ExecutionEngine 的许多方面(源于该类曾能同时处理多个 Spider 对象的时代)现已弃用。(问题 5090)

    • has_capacity() 方法现已弃用。

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

    • open_spiders 属性现已弃用,请改用 spider

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

      • spider_is_idle()

      • crawl()

      • download()

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

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

新功能

错误修复

文档

质量保证

Scrapy 2.5.1 (2021-10-05)

  • 安全漏洞修复

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

    为了防止身份验证凭据无意中暴露给非预期的域名,您现在必须额外设置一个新的 Spider 属性 http_auth_domain,并将其指向必须发送身份验证凭据的具体域名。

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

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

    如果您确实希望您的 Spider 向任何域名发送相同的 HTTP 身份验证凭据,请将 http_auth_domain Spider 属性设置为 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

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

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

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

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

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

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

修改后的需求

不向后兼容的变更

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

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

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

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

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

弃用

新功能

错误修复

文档

质量保证

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)

亮点

向后不兼容的更改

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

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

    (issue 4440)

移除弃用项

  • 不再支持 LOG_UNSERIALIZABLE_REQUESTS 设置,请改用 SCHEDULER_DEBUG (issue 4385)

  • 不再支持 REDIRECT_MAX_METAREFRESH_DELAY 设置,请改用 METAREFRESH_MAXDELAY (issue 4385)

  • ChunkedTransferMiddleware 中间件已移除,包括整个 scrapy.downloadermiddlewares.chunked 模块;分块传输现在开箱即用 (issue 4431)

  • spiders 属性已从 Crawler 中移除,请改用 CrawlerRunner.spider_loader 或使用你的设置实例化 SPIDER_LOADER_CLASS (issue 4398)

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

弃用

新功能

错误修复

  • 对于作为爬虫属性且被分配了不同名称函数的的回调,请求序列化 不再失败 (issue 4500)

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

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

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

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

文档说明

质量保证

Scrapy 2.0.1 (2020-03-18)

Scrapy 2.0.0 (2020-03-03)

亮点

向后不兼容的更改

移除弃用项

弃用

新功能

错误修复

文档说明

质量保证

调度器队列类的更改

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

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

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

安全错误修复

Scrapy 1.8.3 (2022-07-25)

安全漏洞修复

  • HttpProxyMiddleware 处理带有 proxy 元数据的请求,且该 proxy 元数据包含代理凭据时,HttpProxyMiddleware 会设置 Proxy-Authorization 标头,但前提是该标头尚未设置。

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

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

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

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

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

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

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

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

      现在不再可能通过 proxy 元数据设置代理 URL,但通过 Proxy-Authorization 标头设置凭据。请改通过 proxy 元数据设置代理凭据。

Scrapy 1.8.2 (2022-03-01)

安全错误修复

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

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

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

    注意

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

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

    旧的行为可能会被攻击者利用,向您发送到其他域的请求中注入 cookie。请参阅 mfjm-vh54-3f96 安全公告 了解更多信息。

Scrapy 1.8.1 (2021-10-05)

  • 安全漏洞修复

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

    为了防止身份验证凭据无意中暴露给非预期的域名,您现在必须额外设置一个新的 Spider 属性 http_auth_domain,并将其指向必须发送身份验证凭据的具体域名。

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

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

    如果您确实希望您的 Spider 向任何域名发送相同的 HTTP 身份验证凭据,请将 http_auth_domain Spider 属性设置为 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 3897issue 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 3912issue 3918)。

Scrapy 1.7.2 (2019-07-23)

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

Scrapy 1.7.1 (2019-07-18)

重新打包了 Scrapy 1.7.0,因为之前在 PyPI 中缺失了一些更改。

Scrapy 1.7.0 (2019-07-18)

注意

请确保您安装的是 Scrapy 1.7.1。PyPI 中的 Scrapy 1.7.0 软件包是错误的 commit 标记结果,不包含下述所有更改。

亮点

  • 针对多域名爬取的优化

  • 更简洁的向回调传递参数的方式

  • 新增用于 JSON 请求的类

  • 基于规则的爬虫优化

  • Feed 导出的新功能

向后不兼容的更改

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

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

  • 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(参见 日志记录

  • 来自 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

    • HtmlXPathSelector(请改用 Selector

    • XmlXPathSelector(请改用 Selector

    • XPathSelector(请改用 Selector

    • XPathSelectorList(请改用 Selector

  • 来自 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 回调。

  • 以下模块已弃用

    • scrapy.utils.http(请改用 w3lib.http

    • scrapy.utils.markup(请改用 w3lib.html

    • scrapy.utils.multipart(请改用 urllib3

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

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

其他更改

Scrapy 1.6.0 (2019-01-30)

亮点

  • 更好的 Windows 支持;

  • Python 3.7 兼容性;

  • 重大的文档改进,包括将 API 从 .extract_first() + .extract() 切换为 .get() + .getall()

  • 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 选择器的 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) 发行说明。

新的可扩展性功能

  • Feed 导出器(feed exporters)和 Feed 存储(feed storages)现在支持 from_crawler。除此之外,这还允许从自定义 feed 存储和导出器中访问 Scrapy 设置(issue 1605issue 3348)。

  • 重复过滤器(dupefilters)现在支持 from_crawlerissue 2956);这允许从重复过滤器中访问例如设置或 spider。

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

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

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

  • 现在下载器处理器(Downloader Handlers)的延迟加载是可选的;这有助于在自定义下载器处理器中更好地处理初始化错误(issue 3394)。

新的 FilePipeline 和 MediaPipeline 功能

scrapy.contracts 改进

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

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

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

  • 修复了合同中的 errback 处理,例如当合同针对返回非 200 响应的 URL 执行时的情况(issue 3371)。

易用性改进

  • 为 RobotsTxtMiddleware 增加了更多统计数据(issue 3100

  • 现在使用 INFO 日志级别来显示 telnet 的主机/端口(issue 3115

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

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

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

  • 链接提取改进:将 “ftp” 添加到协议列表中(issue 3152);将 “flv” 添加到常见视频扩展名中(issue 3165

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

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

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

错误修复

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

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

  • 现在在复制 Request 时会保留 flags(issue 3342);

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

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

文档改进

移除弃用项

删除了针对 1.0 以前 Scrapy 模块名称的兼容性垫片(shims)(issue 3318

  • scrapy.command

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

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

  • scrapy.dupefilter

  • scrapy.linkextractor

  • scrapy.project

  • scrapy.spider

  • scrapy.spidermanager

  • scrapy.squeue

  • scrapy.stats

  • scrapy.statscol

  • scrapy.utils.decorator

有关详细信息,请参阅 模块重定位,或根据 Scrapy 1.5.x 弃用警告中的建议来更新您的代码。

其他移除的弃用项

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

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

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

其他改进与清理

Scrapy 1.5.2 (2019-01-22)

  • 安全漏洞修复:Telnet 控制台扩展容易被恶意网站通过向 https://:6023 发送 POST 内容来利用。虽然我们还没发现直接从 Scrapy 利用它的方法,但很容易诱导浏览器执行此类操作,这增加了本地开发环境的风险。

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

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

  • 修复了由于 boto 导入错误导致 GCE 环境下 CI 构建失败的问题。

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 覆盖的设置日志记录;这在技术上是向后不兼容的,因为 logger 从 [scrapy.utils.log] 更改为 [scrapy.crawler]。如果您正在解析 Scrapy 日志,请更新您的日志解析器(issue 1343)。

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

  • 522 和 524 状态码已添加到 RETRY_HTTP_CODESissue 2851

新功能

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

  • 支持 ptpython REPL(issue 2654

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

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

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

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

  • RETRY_HTTP_CODES 中添加 522 和 524(issue 2851

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

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

  • 代理服务器的连接现在可以复用(issue 2743

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

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

  • CrawlerProcess 增加了一个禁用安装根日志处理器的选项(issue 2921

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

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

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

错误修复

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

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

  • 修复了 PyPy 和 PyPy3 的测试失败,并正式支持它们(issue 2793issue 2935issue 2990issue 3050issue 2213issue 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 2762issue 3038

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

  • 修复了死链;对外部链接使用 https://issue 2978issue 2982issue 2958

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

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

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

  • 阐明了 CSVFeedSpider.headers 文档(issue 2826

  • 记录了 DontCloseSpider 异常并阐明了 spider_idleissue 2791

  • 更新了 README 中的 “Releases” 章节(issue 2764

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

  • 微调了 startproject 参数的描述(issue 2866

  • 阐明了 Response.body 文档中的数据类型(issue 2922

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

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

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

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

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

Scrapy 1.4.0 (2017-05-18)

Scrapy 1.4 虽然没有带来太多令人惊叹的新功能,但仍包含不少实用的改进。

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

新增了一个用于创建请求的 response.follow 方法;这现在是 Scrapy spider 中创建请求的推荐方式。此方法使编写正确的 spider 更加容易;与直接创建 scrapy.Request 对象相比,response.follow 具有多项优势:

  • 它处理相对 URL;

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

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

例如,现在可以不用这样写:

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

而可以这样写:

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

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

另请注意,链接提取器现在默认不再对 URL 进行规范化(canonicalize)。 这一直让用户感到困惑,而且事实上浏览器也不会这么做,因此我们删除了对提取链接的这种额外转换。

对于那些希望对 Scrapy 在跟随链接时发送的 Referer: 标头进行更多控制的用户,您可以设置自己的 Referrer 策略。在 Scrapy 1.4 之前,默认的 RefererMiddleware 只会简单盲目地将其设置为生成 HTTP 请求的响应 URL(这可能会泄露您的种子 URL 信息)。现在,Scrapy 的默认行为与常规浏览器非常相似。而且此策略可以使用 W3C 标准值进行完全自定义(如果您愿意,也可以使用自定义值)。详见 REFERRER_POLICY

为了使 Scrapy spider 更易于调试,Scrapy 1.4 默认记录更多统计数据:内存使用统计、详细的重试统计、详细的 HTTP 错误代码统计。类似的更改还有,HTTP 缓存路径现在也可以在日志中看到。

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

玩得开心!(或继续阅读本版本中的其他更改。)

弃用和向后不兼容的更改

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

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

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

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

新功能

错误修复

清理与重构

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

  • 在 CrawlSpider 中将构建请求从 _requests_to_follow 中分离出来(issue 2562

  • 删除了 “Python 3 progress” 徽章(issue 2567

  • .gitignore 中增加了一些行(issue 2557

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

  • 添加了 codecov.yml 文件(issue 2750

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

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

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

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

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

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

文档

Scrapy 1.3.3 (2017-03-10)

错误修复

  • 使 SpiderLoader 在缺少依赖项或 SPIDER_MODULES 错误时默认再次抛出 ImportError。自 1.3.0 以来,这些异常被作为警告静默处理。现在引入了一个新设置,可以根据需要在警告或异常之间切换;详见 SPIDER_LOADER_WARN_ONLY

Scrapy 1.3.2 (2017-02-13)

错误修复

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

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

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

Scrapy 1.3.1 (2017-02-08)

新功能

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

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

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

  • 在 PyPy 上运行测试(注意:某些测试仍然失败,因此尚未正式支持 PyPy)。

错误修复

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

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

  • 修复了 Files/Images pipeline 中关于 *_EXPIRES settings 的测试(issue 2460)。

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

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

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

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

文档

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

  • 阐明了传递 spider 参数会将它们转换为 spider 属性(issue 2483)。

  • 记录了 FormRequest.from_response() 上的 formid 参数(issue 2497)。

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

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

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

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

  • 错别字修复(issue 2512issue 2534issue 2531)。

清理

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

  • 加快了 LinkExtractor 中 allow/deny 模式的检查速度(issue 2538)。

  • 删除了支持旧版本 Twisted 的死代码(issue 2544)。

Scrapy 1.3.0 (2016-12-21)

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

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

新功能

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

  • Scrapy shell 内部的 scrapy fetch urlscrapy shell urlfetch(url) 现在默认跟随 HTTP 重定向(issue 2290);详见 fetchshell

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

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

依赖关系与清理

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

  • 因此,我们删除了 scrapy.xlib.tx.* 模块,这些模块曾为由于 “旧” 版本 Twisted 而受困的用户复制了一些 Twisted 代码

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

Scrapy 1.2.3 (2017-03-03)

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

Scrapy 1.2.2 (2016-12-06)

错误修复

  • 修复了当 pipeline 在 open_spider() 上失败时出现的难以理解的追溯信息(issue 2011

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

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

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

    • 处理 Python 2 中的非 ASCII URL 和 User-Agent(issue 2373

文档

其他更改

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

  • 当尝试在非文本响应(non-Text Responses)上使用 .css().xpath() 时,提供更有用的错误消息(issue 2264

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

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

  • 从源分发包(source distribution)中删除了所有 *.pyc 文件(issue 2386

Scrapy 1.2.1 (2016-10-21)

错误修复

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

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

文档

  • 修复了 JsonWriterPipeline 示例(issue 2302)。

  • 各项说明:关于 spider 名称的 issue 2330,关于中间件方法处理顺序的 issue 2329,以及关于以列表形式获取多值 HTTP 标头的 issue 2327

其他更改

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

Scrapy 1.2.0 (2016-10-03)

新功能

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

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

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

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

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

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

错误修复

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

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

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

  • 修复了 scrapy parse 日志中显示错误回调名称的问题(issue 2169)。

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

  • 修复了在 CrawlSpider 中结合 scrapy parse 使用所选回调的问题(issue 2225)。

  • 修复了当爬虫未产出项目(item)时生成无效 JSON 和 XML 文件的问题(issue 872)。

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

重构

测试与需求

Scrapy 新的需求基准是 Debian 8 "Jessie"。此前为 Ubuntu 12.04 Precise。这意味着在实践中,我们进行持续集成测试时,以下(主要)软件包的版本至少为:Twisted 14.0、pyOpenSSL 0.14、lxml 3.4。

Scrapy 在这些软件包的旧版本上可能仍然可以正常工作(例如,代码库中仍保留了针对旧版 Twisted 的切换逻辑),但不再保证其可靠性(因为不再进行测试)。

文档

Scrapy 1.1.4 (2017-03-03)

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

Scrapy 1.1.3 (2016-09-22)

Bug 修复

  • ImagesPipelineFilesPipeline 子类的类属性恢复到 1.1.1 版本之前的运作方式(issue 2243,修复 issue 2198)。

文档

Scrapy 1.1.2 (2016-08-18)

Bug 修复

  • 引入了缺失的 IMAGES_STORE_S3_ACL 设置,用于在向 S3 上传图片时覆盖 ImagesPipeline 中的默认 ACL 策略(注意,自 Scrapy 1.1.0 起,默认 ACL 策略已变为 "private" 而非 "public-read")。

  • IMAGES_EXPIRES 默认值恢复为 90(该回归问题是在 1.1.1 中引入的)。

Scrapy 1.1.1 (2016-07-13)

Bug 修复

  • 在发往 HTTPS 代理的 CONNECT 请求中添加 "Host" 请求头(issue 2069)。

  • 在选择响应类时使用响应正文 bodyissue 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 TunnelErrorissue 1974)。

文档

  • FEED_TEMPDIR 设置移动至字典序对应位置(commit 9b3c72c)。

  • 在总览中使用更符合习惯的 .extract_first()issue 1994)。

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

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

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

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

  • 新增关于在爬虫回调中使用 BeautifulSoup 的 FAQ 条目(issue 2048)。

  • 添加关于 Scrapy 在 Windows + Python 3 环境下无法工作的说明(issue 2060)。

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

测试

  • 在 Travis CI 上升级 py.test 需求,并将 pytest-cov 固定为 2.2.1(issue 2095)。

Scrapy 1.1.0 (2016-05-11)

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

  • Scrapy 1.1 提供了对 Python 3 的 Beta 支持(需要 Twisted >= 15.5)。详情及局限性请参阅 Python 3 Beta 支持

  • 热门新功能

  • 以下 bug 修复可能需要您的关注

    • 默认不再重试错误请求(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 之前的运行中保留的某些缓存条目失效。警告:不向后兼容!

继续阅读以了解有关其他改进和 bug 修复的更多细节。

Python 3 Beta 支持

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

几乎所有的内置扩展/中间件都应该可以工作。但是,我们已知 Python 3 中存在一些局限性:

  • Scrapy 无法在 Windows 上的 Python 3 环境下工作

  • 不支持发送电子邮件

  • 不支持 FTP 下载处理程序

  • 不支持 Telnet 控制台

额外的新功能和增强

废弃与移除

  • 添加了 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 替代。

位置变更

Bug 修复

Scrapy 1.0.7 (2017-03-03)

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

Scrapy 1.0.6 (2016-05-04)

  • 修复:RetryMiddleware 现在可以兼容非标准 HTTP 状态码(issue 1857)。

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

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

  • 文档:统一选择器示例(issue 1869)。

Scrapy 1.0.5 (2016-02-04)

Scrapy 1.0.4 (2015-12-30)

Scrapy 1.0.3 (2015-08-11)

  • 在 Scrapy 的 install_requires 中添加了 service_identity(commit cbc2501)。

  • 针对 travis#296 的权变方案(commit 66af9cd)。

Scrapy 1.0.2 (2015-08-06)

Scrapy 1.0.1 (2015-07-01)

  • 在传递给 FTPClient 之前取消请求路径的转义,因为它已经会对路径进行转义(commit cc00ad2)。

  • 在 MANIFEST.in 中将 tests/ 包含在源码包(source distribution)中(commit eca227e)。

  • 文档:修复 SelectJmes 文档(commit b8567bc)。

  • 文档:将 Ubuntu 和 Archlinux 移出 Windows 子章节(commit 392233f)。

  • 文档:移除 Ubuntu 软件包的版本后缀(commit 5303c66)。

  • 文档:更新 1.0 版本的发布日期(commit c89fa29)。

Scrapy 1.0.0 (2015-06-19)

在此主要版本中,您将发现许多新功能和 bug 修复。请务必查看我们更新后的总览以快速了解部分变化,以及我们润色过的教程

支持爬虫返回字典

现在不再必须声明并返回 Scrapy Item 来从爬虫中收集抓取的数据,您可以直接返回显式字典。

经典版本

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

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

新版本

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

每只爬虫独立的设置 (GSoC 2014)

去年的 Google 编程之夏项目完成了一项重要的设置填充机制重构,引入了显式优先级以覆盖任何给定设置。作为该目标的延伸,我们为仅针对单只爬虫生效的设置引入了一个新的优先级级别,允许它们重新定义项目设置。

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

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

阅读更多关于设置填充的内容:设置

Python 日志 (Logging)

Scrapy 1.0 已从 Twisted logging 迁移到支持 Python 内置 logging 作为默认日志系统。我们为大部分旧的自定义日志函数接口保持了向后兼容,但您会收到切换到完整 Python logging API 的警告。

旧版本

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

新版本

import logging
logging.info('MESSAGE')

爬虫内的日志记录方式保持不变,但在 log() 方法之上,您还可以访问为该爬虫创建的自定义 logger 来发布日志事件:

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

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

Crawler API 重构 (GSoC 2014)

去年 Google 编程之夏的另一个里程碑是对内部 API 的重构,力求更简单、更易用。在以下位置查看新的核心接口:核心 API

您会遇到这些变化的一个常见场景是在脚本中运行 Scrapy。以下是一个如何使用新 API 手动运行爬虫的快速示例:

from scrapy.crawler import CrawlerProcess

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

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

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

模块位置变更

为了改进 Scrapy 的整体结构,进行了大规模的模块调整。主要变化包括将多个子包分离成新项目,并将 scrapy.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

  • 针对 0.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 读取为整数(issue 954

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

  • 修复 ".local" 主机名的 bug(issue 878

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

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

Python 3 支持进展

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

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

  • 针对 urllib 进行了更多 Python 3 兼容性更改(issue 1121

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

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

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

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

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

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

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

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

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

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

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

  • PY3:使在 Python 3 中运行部分测试成为可能(issue 776

测试

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

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

  • 在 Travis 中添加文档构建步骤(issue 1234

  • 测试:不要从废弃模块中收集测试(issue 1165

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

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

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

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

  • 现代化部分 assert 断言(issue 835

  • selector.__repr__ 测试(issue 779

代码重构

  • CSVFeedSpider 清理:使用 iterate_spider_output(issue 1079

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

  • Pydispatch pep8 规范化(issue 992

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

  • 为了统一,在 SpiderState 扩展中使用 job_dir 辅助方法(issue 805

  • 将 "sflo" 本地变量重命名为更易懂的 "log_observer"(issue 775

Scrapy 0.24.6 (2015-04-20)

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

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

  • 修复文档中的微小拼写错误(commit d694019

  • 修复微小拼写错误(commit f92fa83

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

Scrapy 0.24.5 (2015-02-25)

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)

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

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

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

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

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

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

  • 修复 offsite 中间件在没有主机名的 URL 上的情况 (issue 745)

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

Scrapy 0.22.2 (2014-02-14 发布)

Scrapy 0.22.1 (2014-02-08 发布)

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 更新了 shell 文档中的 crawler 引用,并修正了实际的 shell 输出。 (commit 875b9ab)

  • PEP8 少量编辑。 (commit f89efaf)

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

  • 移除未使用的 re 导入及 PEP8 少量编辑。 (commit 387f414)

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

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

  • 将 Ubuntu 安装说明显示为代码块 (commit fb5c9c5)

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

  • 合并来自 stray-leone/patch-1 的 pull request #550 (commit 6f70b6a)

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

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

  • 修复 news.rst 中的拼写错误并移除 (not released yet) 标题 (commit b7f58f4)

Scrapy 0.22.0 (2014-01-17 发布)

增强功能

修正

  • 更新 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 发布)

  • 从已发布的源码构建 wheels 需要 include_package_data (commit 5ba1ad5)

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

Scrapy 0.20.0 (2013-11-08 发布)

增强功能

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

  • Request/Response 的 url/body 属性现在是不可变的(修改它们在很早以前就被弃用了)

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

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

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

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

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

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

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

  • 从 ImagesPipeline 提取出功能的新 FilesPipeline (issue 370, issue 409)

  • 推荐使用 Pillow 而非 PIL 来处理图像 (issue 317)

  • 增加了针对 Ubuntu Quantal 和 Raring 的 Debian 包 (commit 86230c0)

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

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

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

  • 在持续集成测试中加入 pypy 2.1 (commit ecfa7431)

  • 进行了 Pylint、pep8 检查,并从源码中移除了旧式异常处理 (issue 430, issue 432)

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

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

  • 修复 SIGINT 时的抓取关闭问题 (issue 450)

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

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

错误修复

其他

  • 停止对 Python 2.6 的支持 (issue 448)

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

  • 舍弃 libxml2 和多选择器后端支持,从现在起需要 lxml

  • 最低 Twisted 版本提高到 10.0.0,停止对 Twisted 8.0 的支持。

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

致谢

感谢所有为本版本做出贡献的人!

贡献者名单(按提交数量排序)

69 Daniel Graña <dangra@...>
37 Pablo Hoffman <pablo@...>
13 Mikhail Korobov <kmike84@...>
 9 Alex Cepoi <alex.cepoi@...>
 9 alexanderlukanin13 <alexander.lukanin.13@...>
 8 Rolando Espinoza La fuente <darkrho@...>
 8 Lukasz Biedrycki <lukasz.biedrycki@...>
 6 Nicolas Ramirez <nramirez.uy@...>
 3 Paul Tremberth <paul.tremberth@...>
 2 Martin Olveyra <molveyra@...>
 2 Stefan <misc@...>
 2 Rolando Espinoza <darkrho@...>
 2 Loren Davie <loren@...>
 2 irgmedeiros <irgmedeiros@...>
 1 Stefan Koch <taikano@...>
 1 Stefan <cct@...>
 1 scraperdragon <dragon@...>
 1 Kumara Tharmalingam <ktharmal@...>
 1 Francesco Piccinno <stack.box@...>
 1 Marcos Campal <duendex@...>
 1 Dragon Dave <dragon@...>
 1 Capi Etheriel <barraponto@...>
 1 cacovsky <amarquesferraz@...>
 1 Berend Iwema <berend@...>

Scrapy 0.18.4 (2013-10-10 发布)

  • IPython 拒绝更新命名空间。修复 #396 (commit 3d32c4f)

  • 修复 shell 命令中替换请求时的 AlreadyCalledError。关闭 #407 (commit b1d8919)

  • 修复 start_requests() 的惰性以及过早挂起的问题 (commit 89faf52)

Scrapy 0.18.3 (2013-10-03 发布)

Scrapy 0.18.2 (2013-09-03 发布)

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

Scrapy 0.18.1 (2013-08-27 发布)

  • 移除由拣选 (cherry pick) 的更改引入的额外导入 (commit d20304e)

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

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

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

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

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

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

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

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

  • 修正使其指向正确的文件夹 (commit 3283809)

  • 增加对 Ubuntu Quantal 和 Raring 版本的支持 (commit 1411923)

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

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

  • 0.18 发行说明的少量更新 (commit c45e5f1)

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

Scrapy 0.18.0 (2013-08-09 发布)

  • 使用 Tox 运行测试套件的多项改进,包括在 pypi 上测试的方法

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

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

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

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

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

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

  • 修复因 Python 2.7.4 变化导致的 scrapy.utils.gz.gunzip 损坏问题 (commit 4dc76e)

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

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

  • 在 XML 导出器中支持嵌套 Item (issue 66)

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

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

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

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

  • 允许将爬虫的 allowed_domains 设置为 set 或元组 (issue 261)

  • 支持 settings.getdict (issue 269)

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

  • 增加了 Item.copy (issue 290)

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

  • 增加 ftp:// 协议下载器处理器 (issue 329)

  • 增加了下载器基准测试 Web 服务器和爬虫工具 基准测试

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

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

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

  • 增加了 XPathSelector.remove_namespaces,为了方便(使用不带命名空间的 XPath),允许从 XML 文档中移除所有命名空间。在 选择器 中有说明。

  • 对爬虫 contracts 的多项改进

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

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

  • 为爬虫增加了 from_crawler 方法

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

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

  • 对单例和多爬虫支持的进一步清理(感谢 Nicolas Ramirez)

  • 支持自定义下载插槽

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

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

感谢所有为本版本做出贡献的人。以下是按提交数排序的贡献者名单

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

Scrapy 0.16.5 (2013-05-30 发布)

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

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

  • 文档:移除指向 diveintopython.org 的链接,该网站已无法访问。关闭 #246 (commit bd58bfa)

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

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

Scrapy 0.16.4 (2013-01-23 发布)

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

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

  • 修复错误消息格式。log.err() 不支持高级格式化,当错误发生时,消息会显示为:“ERROR: Error processing %(item)s” (commit c16150c)

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

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

  • 增加文档主题:广度抓取和常用实践 (commit 1fbb715)

  • 修复在未明确指定爬虫时 Scrapy parse 命令的错误。关闭 #209 (commit c72e682)

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

Scrapy 0.16.3 (2012-12-07 发布)

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)

  • 在 news 中设置了 0.16.0 的发布日期 (commit e292246)

Scrapy 0.16.0 (2012-10-18 发布)

Scrapy 变化

  • 增加了 爬虫 Contracts,一种以正式/可复现的方式测试爬虫的机制

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

  • 记录了 AutoThrottle 扩展 并将其加入默认安装的扩展中。你仍需要通过 AUTOTHROTTLE_ENABLED 启用它

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

  • 为爬虫中间件增加了 process_start_requests() 方法

  • 舍弃了 Signals 单例。现在应通过 Crawler.signals 属性访问信号。详见信号文档。

  • 舍弃了统计收集器单例。现在可以通过 Crawler.stats 属性访问统计数据。详见统计收集文档。

  • 记录了 核心 API

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

  • 移植了 FormRequest.from_response() 以使用 lxml 代替 ClientForm

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

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

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

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

  • 增加了 cookiejar 请求 meta 键,以支持每个爬虫多个 cookie 会话

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

  • 停止支持 Python 2.5。参见 https://www.zyte.com/blog/scrapy-0-15-dropping-support-for-python-2-5/

  • 停止支持 Twisted 2.5

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

  • 将默认 User Agent 更改为:Scrapy/版本号 (+https://scrapy.net.cn)

  • scrapy.contrib.linkextractors.image 中移除了(未公开的)HTMLImageLinkExtractor

  • 移除了单个爬虫的设置(将被实例化多个 crawler 对象所取代)

  • USER_AGENT 爬虫属性将不再起作用,请改用 user_agent 属性

  • DOWNLOAD_TIMEOUT 爬虫属性将不再起作用,请改用 download_timeout 属性

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

  • DjangoItem 提升至主要 contrib

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

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

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

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

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

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

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

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

  • 移除了 scrapy.log.started 属性

Scrapy 0.14.4

Scrapy 0.14.3

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

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

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

  • 在 docs/topics/firebug.rst 中增加了关于 google directory 关闭的说明 (commit 668e352)

  • 当插槽 (slot) 为空时不要丢弃,而是保存在另一个字典中以便在需要时回收。 (commit 8e9f607)

  • 在基于 libxml2 的选择器中处理 unicode xpath 时不再失败 (commit b830e95)

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

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

  • 移除了 Scrapy 中一些与 sqlite 支持相关的陈旧残余代码 (commit 0665175)

Scrapy 0.14.2

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

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

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

  • 修复了 MemoryUsage 扩展中的错误:get_engine_status() 恰好需要 1 个参数(实际给出 0 个) (commit 11133e9)

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

  • ajax 抓取此前未对 unicode 网址进行扩展 (commit 0de3fb4)

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

  • 加速 libxml2 XPathSelector (commit 2fbd662)

  • 根据最近的变化更新了版本管理文档 (commit 0a070f5)

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

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

Scrapy 0.14.1

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

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

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

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

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

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

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

  • 当与 S3 建立过多并行连接时,SSL 握手会挂起 (commit 63d583d)

  • 修改 tutorial 以跟随 dmoz 网站的变化 (commit bcb3198)

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

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

Scrapy 0.14

新功能和设置

  • 支持 AJAX 可爬取 URL

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

  • scrapy crawl 添加了 -o 选项,用于将爬取到的条目转储到文件(或使用 - 输出到标准输出)的快捷方式

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

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

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

  • 在 Feed 导出支持的格式中增加了 marshal (r2744)

  • 在 request 的 errback 中,违规请求现在通过 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 扩展,用于定期记录基本统计信息(如爬取的页面和抓取的条目) (r2657)

  • 使对 gzip 响应的处理更加健壮 (#319, r2643)。现在 Scrapy 将尝试从 gzip 响应中解压尽可能多的内容,而不是抛出 IOError 失败。

  • 简化了 !MemoryDebugger 扩展,使用 stats 来转储内存调试信息 (r2639)

  • 增加了编辑 spider 的新命令:scrapy edit (r2636),以及在 genspider 命令中增加使用该功能的 -e 标志 (r2653)

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

  • 增加了 spider_error 信号 (r2628)

  • 增加了 COOKIES_ENABLED 设置 (r2625)

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

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

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

  • 在 Scrapyd 中增加了 listjobs.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 上有一个新的示例项目名为 dirbothttps://github.com/scrapy/dirbot

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

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

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

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

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

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

  • 移除了 CONCURRENT_SPIDERS 设置(请改用 scrapyd maxproc) (r2789)

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

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

Scrapy 0.12

诸如 #NNN 之类的数字参考了旧问题跟踪器 (Trac) 中的工单,该跟踪器现已不再可用。

新功能和改进

  • 通过的条目现在在 item_passeditem 参数中发送 (#273)

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

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

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

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

  • 为 XPath 选择器增加了新的 lxml 后端 (#147)

  • 每个 spider 的独立设置 (#245)

  • 支持退出代码以在 Scrapy 命令中发出错误信号 (#248)

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

  • 使 libxml2 成为可选 (#260)

  • 新的 deploy 命令 (#261)

  • 增加了 CLOSESPIDER_PAGECOUNT 设置 (#253)

  • 增加了 CLOSESPIDER_ERRORCOUNT 设置 (#254)

Scrapyd 变化

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

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

  • 增加了一个最小化的 Web UI,默认可在 https://:6800 访问

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

设置的变化

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

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

弃用/过时的功能

  • 弃用 runserver 命令,转而使用启动 Scrapyd 服务器的 server 命令。另请参阅:Scrapyd 变化

  • 弃用 queue 命令,转而使用 Scrapyd schedule.json API。另请参阅:Scrapyd 变化

  • 移除了 !LxmlItemLoader(从未晋升为主要 contrib 的实验性 contrib)

Scrapy 0.10

诸如 #NNN 之类的数字参考了旧问题跟踪器 (Trac) 中的工单,该跟踪器现已不再可用。

新功能和改进

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

  • 简化了 Images pipeline 的使用,现在不需要子类化你自己的 images pipeline 了 (#217)

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

  • 重构了执行队列为通用基代码和名为“spider 队列”的可插拔后端 (#220)

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

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

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

  • 延迟信号 (Deferred signals) (#193)

  • 为 item pipeline 增加了两个支持延迟的新方法 open_spider(), close_spider() (#195)

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

  • 用功能相似但不依赖于 Twisted Plugins 的管理器替换了默认的 Spider Manager (#186)

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

  • Scrapy 日志重构 (#188)

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

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

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

命令行工具变化

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

  • 为命令行工具增加了 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.spidermanagerscrapy.spidermanager

  • Spider Manager 单例从 scrapy.spider.spiders 移动到 scrapy.project.crawler 单例的 spiders 属性下。

  • 移动了 Stats Collector 类:(#204)
    • scrapy.stats.collector.StatsCollectorscrapy.statscol.StatsCollector

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

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

  • 将 Item pipeline 的 process_item() 方法参数从 (spider, item) 更改为 (item, spider)
    • 保留向后兼容性(带有弃用警告)

  • scrapy.core.signals 模块移动到 scrapy.signals
    • 保留向后兼容性(带有弃用警告)

  • scrapy.core.exceptions 模块移动到 scrapy.exceptions
    • 保留向后兼容性(带有弃用警告)

  • BaseSpider 增加了 handles_request() 类方法

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

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

  • 删除了 scrapy.log.log_level 属性

  • 为 Spider Manager 和 Item Pipeline Manager 增加了 from_settings() 类方法

设置的变化

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

  • 增加了 SPIDER_QUEUE_CLASS 设置,定义要使用的 spider 队列 (#220)

  • 增加了 KEEP_ALIVE 设置 (#220)

  • 移除了 SERVICE_QUEUE 设置 (#220)

  • 移除了 COMMANDS_SETTINGS_MODULE 设置 (#201)

  • REQUEST_HANDLERS 重命名为 DOWNLOAD_HANDLERS 并将下载处理器设为类(而非函数)

Scrapy 0.9

诸如 #NNN 之类的数字参考了旧问题跟踪器 (Trac) 中的工单,该跟踪器现已不再可用。

新功能和改进

  • 为 scrapy.mail 增加了 SMTP-AUTH 支持

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

  • 增加了新的 scrapy-ctl view 命令 - 以 Scrapy 的视角在浏览器中查看 URL (r2039)

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

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

  • 增加了 wrapper 引导库(目前仅在源代码中提供文档)。 (r2011)

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

  • 增加了 LOG_ENCODING 设置 (r1956,已有文档)

  • 增加了 RANDOMIZE_DOWNLOAD_DELAY 设置(默认启用) (r1923,已有文档)

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

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

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

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

  • 支持不带回调函数的请求 (r2050 | #166)

API 变化

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

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

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

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

  • 增加了用于供给 spider 抓取的 ExecutionQueue (r2034)

  • 移除了 ExecutionEngine 单例 (r2039)

  • 移植了 S3ImagesStore (images pipeline) 以使用 boto 和线程 (r2033)

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

默认设置的变化

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

Scrapy 0.8

诸如 #NNN 之类的数字参考了旧问题跟踪器 (Trac) 中的工单,该跟踪器现已不再可用。

新功能

  • 增加了 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 而非 domain
    • item pipeline 方法 process_item()domain 参数更改为 spider,新签名为:process_item(spider, item) (r1827 | #105)

    • 为了快速移植你的代码(以适应 Scrapy 0.8),只需在以前使用 domain 的地方使用 spider.domain_name 即可。

  • 更改了 Stats API,以使用 spider 而非 domain (r1849 | #113)
    • StatsCollector 更改为其方法(set_value, inc_value 等)接收 spider 引用(而非 domain)。

    • 增加了 StatsCollector.iter_spider_stats() 方法

    • 移除了 StatsCollector.list_domains() 方法

    • 此外,统计信号已被重命名,现在传递 spider 引用(而非 domain)。以下是更改摘要

    • 为了快速移植你的代码(以适应 Scrapy 0.8),只需在以前使用 domain 的地方使用 spider.domain_name 即可。spider_stats 包含与 domain_stats 完全相同的数据。

  • CloseDomain 扩展移动到了 scrapy.contrib.closespider.CloseSpider (r1833)
    • 其设置也被重命名
      • CLOSEDOMAIN_TIMEOUT 改为 CLOSESPIDER_TIMEOUT

      • CLOSEDOMAIN_ITEMCOUNT 改为 CLOSESPIDER_ITEMCOUNT

  • 移除了已弃用的 SCRAPYSETTINGS_MODULE 环境变量 - 请改用 SCRAPY_SETTINGS_MODULE (r1840)

  • 重命名设置:REQUESTS_PER_DOMAIN 改为 CONCURRENT_REQUESTS_PER_SPIDER (r1830, r1844)

  • 重命名设置:CONCURRENT_DOMAINS 改为 CONCURRENT_SPIDERS (r1830)

  • 重构了 HTTP 缓存中间件

  • HTTP 缓存中间件经过了重大的重构,保留了相同的功能,但移除了按域划分的部分。 (r1843 )

  • 重命名异常:DontCloseDomain 改为 DontCloseSpider (r1859 | #120)

  • 重命名扩展:DelayedCloseDomain 改为 SpiderCloseDelay (r1861 | #121)

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

Scrapy 0.7

Scrapy 的第一个版本。