发布说明
Scrapy 2.13.0 (2025-05-08)
亮点
asyncio reactor 现在默认启用
将
start_requests()
(同步) 替换为start()
(异步),并改变了其迭代方式。添加了
allow_offsite
请求 meta 键不支持异步爬虫输出的爬虫中间件 已废弃
为 通用爬虫中间件 添加了基类
修改后的要求
放弃了对 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 中废弃的
UrlLengthMiddleware
的from_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_closing
和stats_spider_closed
(请改用spider_closed
)item_passed
(请改用item_scraped
)request_received
(请改用request_scheduled
)
( issue 6654, issue 6655 )
废弃
Spider
的start_requests()
方法已废弃,请改用start()
,或者同时使用两者以保持对较低 Scrapy 版本的支持。( issue 456, issue 3477, issue 4467, issue 5627, issue 6729 )爬虫中间件 的
process_start_requests()
方法已废弃,请改用process_start()
,或者同时使用两者以保持对较低 Scrapy 版本的支持。( issue 456, issue 3477, issue 4467, issue 5627, issue 6729 )优先级队列类(参见
SCHEDULER_PRIORITY_QUEUE
)的__init__
方法现在应支持一个仅限关键字的start_queue_cls
参数。( issue 6752 )不支持异步爬虫输出的爬虫中间件 已废弃。在使用此类中间件与异步回调以及其他产生异步可迭代对象的爬虫中间件时所需的异步可迭代对象降级功能也已废弃。请更新所有此类中间件以支持异步爬虫输出。( issue 6664 )
从
w3lib.url
导入并在scrapy.utils.url
中重新导出的函数现已废弃,您应该直接从w3lib.url
导入它们。它们是scrapy.utils.url.add_or_replace_parameter()
scrapy.utils.url.add_or_replace_parameters()
scrapy.utils.url.any_to_uri()
scrapy.utils.url.canonicalize_url()
scrapy.utils.url.file_uri_to_path()
scrapy.utils.url.is_url()
scrapy.utils.url.parse_data_uri()
scrapy.utils.url.parse_url()
scrapy.utils.url.path_to_file_uri()
scrapy.utils.url.safe_download_url()
scrapy.utils.url.safe_url_string()
scrapy.utils.url.url_query_cleaner()
scrapy.utils.url.url_query_parameter()
( 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 )
新特性
您现在可以从
start()
爬虫方法和process_start()
爬虫中间件方法中 yield 爬虫的起始请求和 Item,两者都是 异步生成器。这使得使用异步代码生成这些起始请求和 Item 成为可能,例如使用异步客户端从队列服务或数据库读取它们,而无需变通方法。( issue 456, issue 3477, issue 4467, issue 5627, issue 6729 )
起始请求现在会尽快被 调度。
因此,一旦达到
CONCURRENT_REQUESTS
,它们的priority
(优先级)现在就会被考虑在内。( issue 456, issue 3477, issue 4467, issue 5627, issue 6729 )Crawler.signals
添加了一个新的wait_for()
方法。( issue 6729 )添加了一个新的
scheduler_empty
信号。( issue 6729 )添加了新的设置:
SCHEDULER_START_DISK_QUEUE
和SCHEDULER_START_MEMORY_QUEUE
。( issue 6729 )添加了
StartSpiderMiddleware
,它将is_start_request
在 起始请求 上设置为True
。( issue 6729 )暴露了
Crawler.engine
的一个新方法:needs_backout()
。( issue 6729 )添加了
allow_offsite
请求 meta 键,可以用它代替更通用的dont_filter
请求属性来跳过OffsiteMiddleware
对请求的处理(但不跳过检查dont_filter
的其他代码)。( issue 3690, issue 6151, issue 6366 )添加了一个可选的 Spider 中间件基类,
BaseSpiderMiddleware
,这有助于编写 通用 Spider 中间件 而无需样板代码和重复代码。内置的 Spider 中间件现在继承自该类。(issue 6693, issue 6777)Scrapy 插件 现在可以定义一个名为
update_pre_crawler_settings()
的类方法来更新 pre-crawler 设置。(issue 6544, issue 6568)添加了 助手函数 用于修改 组件优先级字典 设置。(issue 6614)
使用未知/不支持编码的响应现在会产生警告。如果 Scrapy 知道安装额外的包(例如 brotli)将允许解码响应,警告中会提及这一点。(issue 4697, issue 6618)
添加了
spider_exceptions/count
统计项,用于跟踪异常总数(也由按类型的spider_exceptions/*
统计项跟踪)。(issue 6739, issue 6740)添加了
DEFAULT_DROPITEM_LOG_LEVEL
设置和scrapy.exceptions.DropItem.log_level
属性,允许自定义丢弃 Item 时记录的消息的日志级别。(issue 6603, issue 6608)为
scrapy.Request.from_curl()
添加了对-b, --cookie
curl 参数的支持。(issue 6684)添加了
LOG_VERSIONS
设置,允许自定义 Spider 启动时记录版本号的软件列表。(issue 6582)添加了
WARN_ON_GENERATOR_RETURN_VALUE
设置,允许禁用用于警告基于生成器的回调中不正确return
语句的运行时回调代码分析。如果此分析破坏了您的回调代码,您可能需要禁用此设置。(issue 6731, issue 6738)
改进
移除或推迟了部分
itemadapter.is_item()
调用以提高性能。(issue 6719)改进了在项目目录外部运行需要项目(例如
scrapy crawl
)的scrapy
命令时的错误消息。(issue 2349, issue 3426)为新项目的
settings.py
模板添加了一个空的ADDONS
设置。(issue 6587)
错误修复
从
Spider.start
或从SpiderMiddleware.process_start
生成 Item 不再会将下一次起始请求和 Item 的迭代延迟最多 5 秒。(issue 6729)修复了
items_per_minute
和responses_per_minute
统计项的计算问题。(issue 6599)修复了初始化
scrapy.extensions.feedexport.GCSFeedStorage
时的一个错误。(issue 6617, issue 6628)修复了运行
scrapy bench
时的一个错误。(issue 6632, issue 6633)修复了关于 Reactor 和事件循环的重复日志消息问题。(issue 6636, issue 6657)
修复了运行时解析
SitemapSpider._parse_sitemap()
类型注解的问题,这是 scrapy-poet 等工具所必需的。(issue 6665, issue 6671)现在在未安装 Reactor 的情况下调用
scrapy.utils.reactor.is_asyncio_reactor_installed()
会引发异常,而不是安装 Reactor。(issue 6732, issue 6735)恢复了对
x-gzip
内容编码的支持。(issue 6618)
文档
文档化了默认项目模板中设置的设置值。(issue 6762, issue 6775)
改进了关于 Spider 中间件中异步可迭代支持的 文档。(issue 6688)
改进了关于在协程代码中使用基于
Deferred
的 API 的 文档,并包含了此类 API 的列表。(issue 6677, issue 6734, issue 6776)改进了 贡献文档。(issue 6561, issue 6575)
从 无头浏览器 建议中移除了对
Splash
的推荐。我们不再推荐使用Splash
,而是推荐使用其他无头浏览器解决方案。(issue 6642, issue 6701)为 HTML 文档添加了深色模式。(issue 6653)
其他文档改进和修复。(issue 4151, issue 6526, issue 6620, issue 6621, issue 6622, issue 6623, issue 6624, issue 6721, issue 6723, issue 6780)
打包
从
setup.py
切换到pyproject.toml
。(issue 6514, issue 6547)将构建后端从 setuptools 切换到 hatchling。(issue 6771)
质量保证
将大多数 linter 替换为 ruff。(issue 6565, issue 6576, issue 6577, issue 6581, issue 6584, issue 6595, issue 6601, issue 6631)
提高了测试覆盖率收集的准确性和性能。(issue 6255, issue 6610)
修复了阻止从顶级源目录以外的目录运行测试的错误。(issue 6567)
减少了测试中
mockserver
调用的数量,以提高整体测试运行时间。(issue 6637, issue 6648)修复了多次运行相同测试代码的测试。(issue 6646, issue 6647, issue 6650)
在可能的情况下,重构测试以更多地使用
pytest
功能而不是unittest
功能。(issue 6678, issue 6680, issue 6695, issue 6699, issue 6700, issue 6702, issue 6709, issue 6710, issue 6711, issue 6712, issue 6725)类型提示改进和修复。(issue 6578, issue 6579, issue 6593, issue 6605, issue 6694)
CI 和测试改进和修复。(issue 5360, issue 6271, issue 6547, issue 6560, issue 6602, issue 6607, issue 6609, issue 6613, issue 6619, issue 6626, issue 6679, issue 6703, issue 6704, issue 6716, issue 6720, issue 6722, issue 6724, issue 6741, issue 6743, issue 6766, issue 6770, issue 6772, issue 6773)
代码清理。(issue 6600, issue 6606, issue 6635, issue 6764)
Scrapy 2.12.0 (2024-11-18)
亮点
放弃了对 Python 3.8 的支持,增加了对 Python 3.13 的支持
scrapy.Spider.start_requests()
现在可以生成 Item添加了
JsonResponse
修改的要求
放弃了对 Python 3.8 的支持。(issue 6466, issue 6472)
增加了对 Python 3.13 的支持。(issue 6166)
这些依赖项的最低版本已提高
Twisted: 18.9.0 → 21.7.0
cryptography: 36.0.0 → 37.0.0
pyOpenSSL: 21.0.0 → 22.0.0
lxml: 4.4.1 → 4.6.0
从依赖项列表中移除了
setuptools
。(issue 6487)
向后不兼容的更改
用户定义的 HTTPS 请求的 Cookie 将设置
secure
标志为True
,除非明确设置为False
。当这些 Cookie 在 HTTP 请求中被重用时(例如重定向到 HTTP URL 后),这一点很重要。(issue 6357)基于 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)
ImagesPipeline.convert_image
的response_body
参数现在仅为位置参数,因为它从可选更改为必需。(issue 6500)scrapy.utils.conf.build_component_list()
的convert
参数现在仅为位置参数,因为前面的参数(custom
)已被移除。(issue 6500)scrapy.utils.conf.feed_process_params_from_cli()
的overwrite_output
参数现在仅为位置参数,因为前面的参数(output_format
)已被移除。(issue 6500)
已移除的弃用功能
移除了
scrapy.utils.request.request_fingerprint()
函数,该函数在 Scrapy 2.7.0 中已被弃用。(issue 6212, issue 6213)移除了对设置
REQUEST_FINGERPRINTER_IMPLEMENTATION
的值"2.6"
的支持,该值在 Scrapy 2.7.0 中已被弃用。(issue 6212, issue 6213)RFPDupeFilter
子类现在必须在其__init__
方法中支持fingerprinter
参数,该参数在 Scrapy 2.7.0 中引入。(issue 6102, issue 6113)移除了
scrapy.downloadermiddlewares.decompression
模块,该模块在 Scrapy 2.7.0 中已被弃用。(issue 6100, issue 6113)移除了
scrapy.utils.response.response_httprepr()
函数,该函数在 Scrapy 2.6.0 中已被弃用。(issue 6111, issue 6116)具有 Spider 级别 HTTP 认证(即具有
http_user
或http_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.common
和scrapy.loader.processors
模块,它们在 Scrapy 2.3.0 中已被弃用。(issue 6106, issue 6113)移除了
scrapy.utils.misc.extract_regex()
函数,该函数在 Scrapy 2.3.0 中已被弃用。(issue 6106, issue 6113)移除了
scrapy.http.JSONRequest
类,该类在 Scrapy 1.8.0 中被JsonRequest
替换。(issue 6110, issue 6113)scrapy.utils.log.logformatter_adapter
不再支持缺失的args
、level
或msg
参数,也不再支持format
参数,所有这些场景都在 Scrapy 1.0.0 中被弃用。(issue 6109, issue 6116)分配给
SPIDER_LOADER_CLASS
设置的自定义类如果不实现ISpiderLoader
接口,现在将在运行时引发zope.interface.verify.DoesNotImplement
异常。不符合要求的类自 Scrapy 1.0.0 起一直触发弃用警告。(issue 6101, issue 6113)移除了
--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)移除了
RetryMiddleware
的EXCEPTIONS_TO_RETRY
属性,该属性在 Scrapy 2.10.0 中已被弃用。(issue 6500)移除了在未安装 boto3 包时对 S3 feed 导出 的支持,该支持在 Scrapy 2.10.0 中已被弃用。(issue 6500)
移除了
scrapy.extensions.feedexport._FeedSlot
类,该类在 Scrapy 2.10.0 中已被弃用。(issue 6500)移除了
scrapy.pipelines.images.NoimagesDrop
异常,该异常在 Scrapy 2.8.0 中已被弃用。(issue 6500)ImagesPipeline.convert_image
的response_body
参数现在是必需的,未传递它在 Scrapy 2.8.0 中已被弃用。(issue 6500)移除了
scrapy.utils.conf.build_component_list()
的custom
参数,该参数在 Scrapy 2.10.0 中已被弃用。(issue 6500)移除了
scrapy.utils.reactor.get_asyncio_event_loop_policy()
函数,该函数在 Scrapy 2.9.0 中已被弃用。请改用asyncio.get_event_loop()
和相关的标准库函数。(issue 6500)
弃用功能
具有
from_settings()
方法的 Scrapy 组件 现在已被弃用。from_crawler()
现在应改用from_crawler()
。受影响的组件:scrapy.middleware.MiddlewareManager
scrapy.core.downloader.contextfactory.ScrapyClientContextFactory
在第三方 Scrapy 组件 中拥有
from_settings()
方法但没有from_crawler()
方法现在已被弃用。如果您不想重构代码,可以定义一个简单的from_crawler()
方法,该方法调用cls.from_settings(crawler.settings)
来解决此问题。请注意,如果您有from_crawler()
方法,Scrapy 将不会调用from_settings()
方法,因此后者可以移除。(issue 6540)scrapy.pipelines.media.MediaPipeline
及其子类的初始化 API 得到了改进,一些旧的用法场景现在已被弃用(另请参阅“向后不兼容的更改”部分)。具体来说:定义不接受
crawler
参数的__init__()
方法已被弃用。在未传递
crawler
参数的情况下调用__init__()
方法已被弃用。如果传递了该参数,传递settings
参数也已被弃用,无论如何它都将被忽略。调用
from_settings()
已被弃用,请改用from_crawler()
。(issue 6540)覆盖
from_settings()
已弃用,请转而覆盖from_crawler()
。
REQUEST_FINGERPRINTER_IMPLEMENTATION
设置现已弃用。 (issue 6212, issue 6213)scrapy.utils.misc.create_instance()
函数现已弃用,请转而使用scrapy.utils.misc.build_from_crawler()
。 (issue 5523, issue 5884, issue 6162, issue 6169, issue 6540)scrapy.core.downloader.Downloader._get_slot_key()
已弃用,请转而使用scrapy.core.downloader.Downloader.get_slot_key()
。 (issue 6340, issue 6352)scrapy.utils.defer.process_chain_both()
现已弃用。 (issue 6397)scrapy.twisted_version
现已弃用,您应该直接使用twisted.version
(但请注意它是一个incremental.Version
对象,而不是一个元组)。 (issue 6509, issue 6512)scrapy.utils.python.flatten()
和scrapy.utils.python.iflatten()
现已弃用。 (issue 6517, issue 6519)scrapy.utils.python.equal_attributes()
现已弃用。 (issue 6517, issue 6519)scrapy.utils.request.request_authenticate()
现已弃用,您应该直接设置Authorization
请求头。 (issue 6517, issue 6519)scrapy.utils.serialize.ScrapyJSONDecoder
现已弃用,自 Scrapy 1.0.0 版本以来,它就没有任何代码。 (issue 6517, issue 6519)scrapy.utils.test.assert_samelines()
现已弃用。 (issue 6517, issue 6519)scrapy.extensions.feedexport.build_storage()
现已弃用。您可以直接调用构建器可调用对象。 (issue 6540)
新特性
scrapy.Spider.start_requests()
现在可以 yield(返回)项目。 (issue 5289, issue 6417)注意
一些 Spider 中间件可能需要更新以支持 Scrapy 2.12,然后才能与从
start_requests()
yield(返回)项目的功能结合使用。新增了一个新的
Response
子类JsonResponse
,用于具有 JSON MIME 类型的响应。 (issue 6069, issue 6171, issue 6174)LogStats
扩展现在在 Spider 关闭时将items_per_minute
和responses_per_minute
添加到 统计数据 中。 (issue 4110, issue 4111)新增了
CLOSESPIDER_PAGECOUNT_NO_ITEM
,如果 Spider 在设定的时间内未抓取到任何项目,则允许关闭 Spider。 (issue 6434)用户自定义的 Cookie 现在可以包含
secure
字段。 (issue 6357)为
Crawler
添加了组件获取方法:get_addon()
、get_downloader_middleware()
、get_extension()
、get_item_pipeline()
、get_spider_middleware()
。 (issue 6181)AutoThrottle 扩展 根据响应延迟进行的槽延迟更新,现在可以通过
autothrottle_dont_adjust_delay
meta 键对特定请求禁用。 (issue 6246, issue 6527)如果
SPIDER_LOADER_WARN_ONLY
设置为True
,则SpiderLoader
不会引发SyntaxError
异常,而是发出警告。 (issue 6483, issue 6484)添加了对多重压缩响应的支持(即在
Content-Encoding
头中包含多种编码的响应)。 (issue 5143, issue 5964, issue 6063)在
REFERRER_POLICY
中添加了对多个标准值的支持。 (issue 6381)添加了对 brotlicffi 的支持(之前名为 brotlipy)。仍然推荐使用 brotli,但只有 brotlicffi 在 PyPy 上可用。 (issue 6263, issue 6269)
新增了
MetadataContract
,用于设置请求的 meta。 (issue 6468, issue 6469)
改进
扩展了
LinkExtractor
默认忽略的文件扩展名列表。 (issue 6074, issue 6125)scrapy.utils.httpobj.urlparse_cached()
现在在更多地方使用,而不是使用urllib.parse.urlparse()
。 (issue 6228, issue 6229)
错误修复
MediaPipeline
现在是一个抽象类,其期望在子类中重写的方法现在是抽象方法。 (issue 6365, issue 6368)修复了合同提取中处理无效的
@
前缀行的问题。 (issue 6383, issue 6388)导入
scrapy.extensions.telnet
不再安装默认的 reactor。降低了在 2.11.2 版本中增加的被丢弃请求的日志详细程度。 (issue 6433, issue 6475)
文档
新增了
SECURITY.md
文件,其中记录了安全策略。 (issue 5364, issue 6051)从脚本运行 Scrapy 的示例代码不再在顶层导入
twisted.internet.reactor
,这导致在使用未修改代码时与非默认 reactor 出现问题。 (issue 6361, issue 6374)记录了
SpiderState
扩展。 (issue 6278, issue 6522)其他文档改进和修复。 (issue 5920, issue 6094, issue 6177, issue 6200, issue 6207, issue 6216, issue 6223, issue 6317, issue 6328, issue 6389, issue 6394, issue 6402, issue 6411, issue 6427, issue 6429, issue 6440, issue 6448, issue 6449, issue 6462, issue 6497, issue 6506, issue 6507, issue 6524)
质量保证
根据 PEP 561,新增了
py.typed
文件。 (issue 6058, issue 6059)代码已完全覆盖类型提示(最复杂的部分除外,主要与
twisted.web.http
以及其他没有类型提示的 Twisted 部分相关)。 (issue 5989, issue 6097, issue 6127, issue 6129, issue 6130, issue 6133, issue 6143, issue 6191, issue 6268, issue 6274, issue 6275, issue 6276, issue 6279, issue 6325, issue 6326, issue 6333, issue 6335, issue 6336, issue 6337, issue 6341, issue 6353, issue 6356, issue 6370, issue 6371, issue 6384, issue 6385, issue 6387, issue 6391, issue 6395, issue 6414, issue 6422, issue 6460, issue 6466, issue 6472, issue 6494, issue 6498, issue 6516)改进了 Bandit 检查。 (issue 6260, issue 6264, issue 6265)
将 pyupgrade 添加到
pre-commit
配置中。 (issue 6392)将
flake8-bugbear
、flake8-comprehensions
、flake8-debugger
、flake8-docstrings
、flake8-string-format
和flake8-type-checking
添加到pre-commit
配置中。 (issue 6406, issue 6413)CI 和测试改进及修复。 (issue 5285, issue 5454, issue 5997, issue 6078, issue 6084, issue 6087, issue 6132, issue 6153, issue 6154, issue 6201, issue 6231, issue 6232, issue 6235, issue 6236, issue 6242, issue 6245, issue 6253, issue 6258, issue 6259, issue 6270, issue 6272, issue 6286, issue 6290, issue 6296 issue 6367, issue 6372, issue 6403, issue 6416, issue 6435, issue 6489, issue 6501, issue 6504, issue 6511, issue 6543, issue 6545)
代码清理。 (issue 6196, issue 6197, issue 6198, issue 6199, issue 6254, issue 6257, issue 6285, issue 6305, issue 6343, issue 6349, issue 6386, issue 6415, issue 6463, issue 6470, issue 6499, issue 6505, issue 6510, issue 6531, issue 6542)
其他
问题跟踪器改进。 (issue 6066)
Scrapy 2.11.2 (2024年05月14日)
安全错误修复
不再跟踪重定向到非 HTTP 协议的链接。请参阅 23j4-mw76-5v7h 安全公告 获取更多信息。 (issue 457)
现在,当重定向到不同的协议(
http://
或https://
)或端口时,即使域名相同,也会丢弃Authorization
请求头。请参阅 4qqq-9vqf-3h3f 安全公告 获取更多信息。当系统代理设置对
http://
和https://
不同时,重定向到不同的 URL 协议现在也会触发重定向请求对应的代理设置更改。请参阅 jm3v-qxmh-hxwv 安全公告 获取更多信息。 (issue 767)Spider.allowed_domains
现在对所有请求都强制执行,而不仅仅是 Spider 回调生成的请求。 (issue 1042, issue 2241, issue 6358)xmliter_lxml()
不再解析 XML 实体。 (issue 6265)现在使用 defusedxml 使
scrapy.http.request.rpc.XmlRpcRequest
更安全。 (issue 6250, issue 6251)
错误修复
恢复了对 brotlipy 的支持,该支持在 Scrapy 2.11.1 中已弃用,转而支持 brotli。 (issue 6261)
注意
brotlipy 在 Scrapy 和上游都已弃用。如果可以,请转而使用 brotli。
默认将
METAREFRESH_IGNORE_TAGS
设置为["noscript"]
。这可以防止MetaRefreshMiddleware
跟踪启用 JavaScript 的网络浏览器不会跟踪的重定向。 (issue 6342, issue 6347)在 Feed 导出 期间,不要从 内置后处理插件 中关闭底层文件。 (issue 5932, issue 6178, issue 6239)
LinkExtractor
现在能正确应用unique
和canonicalize
参数。 (issue 3273, issue 6221)如果
JOBDIR
是空字符串,则不要初始化调度器磁盘队列。 (issue 6121, issue 6124)修复了
Spider.logger
未记录自定义额外信息的问题。 (issue 6323, issue 6324)非 UTF-8 编码的
robots.txt
文件不再阻止解析文档中与 UTF-8 兼容的部分(例如 ASCII)。 (issue 6292, issue 6298)如果
default
是None
,scrapy.http.cookies.WrappedRequest.get_header()
不再引发异常。 (issue 6308, issue 6310)Selector
现在使用scrapy.utils.response.get_base_url()
来确定给定Response
的基本 URL。 (issue 6265)媒体管道 的
media_to_download()
方法现在在剥离异常之前会记录异常。 (issue 5067, issue 5068)当向
parse
命令传递回调函数时,使用正确的签名构建回调可调用对象。 (issue 6182)
文档
添加了一个关于 创建空白请求 的 FAQ 条目。 (issue 6203, issue 6208)
记录了
scrapy.Selector.type
可以是"json"
。 (issue 6328, issue 6334)
质量保证
使构建可重现。 (issue 5019, issue 6322)
打包和测试修复。 (issue 6286, issue 6290, issue 6312, issue 6316, issue 6344)
Scrapy 2.11.1 (2024年02月14日)
亮点
安全错误修复。
支持 Twisted >= 23.8.0。
文档改进。
安全错误修复
解决了 ReDoS 漏洞
scrapy.utils.iterators.xmliter
现已弃用,推荐使用xmliter_lxml()
,XMLFeedSpider
现在使用它。为了最大程度减少此更改对现有代码的影响,
xmliter_lxml()
现在支持在节点名称中使用前缀指示节点命名空间,以及在使用 libxml2 2.7+ 时处理具有高度嵌套树的大文件。修复了
open_in_browser()
函数实现中的正则表达式问题。
请参阅 cc65-xxvf-f7r9 安全公告 获取更多信息。
DOWNLOAD_MAXSIZE
和DOWNLOAD_WARNSIZE
现在也适用于解压缩后的响应体。请参阅 7j7m-v7m3-jqm7 安全公告 获取更多信息。此外,与 7j7m-v7m3-jqm7 安全通告 相关,已弃用的
scrapy.downloadermiddlewares.decompression
模块已被移除。重定向到不同域时,
Authorization
头部信息现在会被丢弃。更多信息请参阅 cw9j-q3vf-hrrv 安全通告。
修改后的依赖要求
错误修复
文档
扩展了
Request.meta
的文档。(问题 5565)修复了
dont_merge_cookies
的文档。(问题 5936,问题 6077)在 feed exports 文档中添加了指向 Zyte 导出指南的链接。(问题 6183)
在 2.11.0 发行说明中补充了关于
PythonItemExporter
中向后不兼容更改的说明。(问题 6060,问题 6081)在 2.8.0 发行说明中补充了关于移除已弃用的
scrapy.utils.boto.is_botocore()
函数的说明。(问题 6056,问题 6061)
质量保证
Scrapy 2.11.0 (2023-09-18)
亮点
Spider 现在可以在它们的
from_crawler()
方法中修改 settings,例如基于 spider arguments。定期记录统计信息。
向后不兼容的更改
scrapy.crawler.Crawler
实例的大部分初始化现在都在crawl()
中完成,因此在该方法调用之前,实例的状态与旧版 Scrapy 不同。我们不建议在调用crawl()
之前使用Crawler
实例。(问题 6038)scrapy.Spider.from_crawler()
现在在先前在scrapy.crawler.Crawler.__init__()
中初始化的各种组件初始化之前,以及设置最终确定和冻结之前调用。此更改是必需的,以便允许在scrapy.Spider.from_crawler()
中更改设置。如果您想尽早访问 Spider 代码中最终的设置值和已初始化的Crawler
属性,可以在scrapy.Spider.start_requests()
或engine_started
信号的处理程序中进行。(问题 6038)TextResponse.json
方法现在要求响应采用有效的 JSON 编码(UTF-8、UTF-16 或 UTF-32)。如果您需要处理采用无效编码的 JSON 文档,请改用json.loads(response.text)
。(问题 6016)PythonItemExporter
以前默认使用二进制输出,但现在不再如此。(问题 6006,问题 6007)
移除的已弃用功能
移除了
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.crawler.Crawler
实例上多次运行crawl()
现已弃用。(问题 1587,问题 6040)
新功能
Spider 现在可以在它们的
from_crawler()
方法中修改设置,例如基于 spider arguments。(问题 1305,问题 1580,问题 2392,问题 3663,问题 6038)添加了
PeriodicLog
扩展,启用后可以定期记录统计信息和/或其差异。(问题 5926)通过移除不必要的正文解码,优化了
TextResponse.json
中的内存使用。(问题 5968,问题 6016)link extractors 现在会忽略指向
.webp
文件的链接。(问题 6021)
错误修复
修复了启用了日志记录的附加组件。(问题 6036)
修复了当
charset
参数传递给send()
时,MailSender
生成无效消息体的问题。(问题 5096,问题 5118)修复了从
RetryMiddleware
的子类访问self.EXCEPTIONS_TO_RETRY
时抛出的异常。(问题 6049,问题 6050)scrapy.settings.BaseSettings.getdictorlist()
用于解析FEED_EXPORT_FIELDS
,现在可以处理元组值。(问题 6011,问题 6013)不再推荐使用的
datetime.utcnow()
调用已被替换为带有时区的datetime.now()
调用。(问题 6014)
文档
质量保证
Scrapy 2.10.1 (2023-08-30)
Scrapy 2.10.0 (2023-08-04)
亮点
添加了 Python 3.12 支持,移除了 Python 3.7 支持。
新的附加组件框架简化了对支持该框架的第三方组件的配置。
现在可以配置需要重试的异常。
对 Feed 导出进行了多项修复和改进。
修改后的依赖要求
向后不兼容的更改
FEED_STORE_EMPTY
设置的值现在是True
而不是False
。在早期的 Scrapy 版本中,即使此设置是False
(这是一个现在已修复的错误),也会创建空文件,因此新默认值应保持旧行为。(问题 872,问题 5847)
移除的已弃用功能
当将函数分配给
FEED_URI_PARAMS
设置时,返回None
或修改params
输入参数(在 Scrapy 2.6 中已弃用)不再受支持。(问题 5994,问题 5996)在 Scrapy 2.6 中已弃用的
scrapy.utils.reqser
模块已被移除。(问题 5994,问题 5996)在 Scrapy 2.6 中已弃用的
scrapy.squeues
类PickleFifoDiskQueueNonRequest
、PickleLifoDiskQueueNonRequest
、MarshalFifoDiskQueueNonRequest
和MarshalLifoDiskQueueNonRequest
已被移除。(问题 5994,问题 5996)在 Scrapy 2.6 中已弃用的
scrapy.core.engine.ExecutionEngine
的属性open_spiders
和方法has_capacity
、schedule
已被移除。(问题 5994,问题 5998)向
scrapy.core.engine.ExecutionEngine
的spider_is_idle()
、crawl()
和download()
方法传递spider
参数(在 Scrapy 2.6 中已弃用)不再受支持。(问题 5994,问题 5998)
已弃用功能
scrapy.utils.datatypes.CaselessDict
已弃用,请改用scrapy.utils.datatypes.CaseInsensitiveDict
。(问题 5146)向
scrapy.utils.conf.build_component_list()
传递custom
参数已弃用,过去它用于合并FOO
和FOO_BASE
设置值,但现在 Scrapy 使用scrapy.settings.BaseSettings.getwithbase()
来完成相同的操作。使用此参数且无法切换到getwithbase()
的代码可以切换到显式合并值。(问题 5726,问题 5923)
新功能
添加了对 Scrapy 附加组件 的支持。(问题 5950)
添加了
RETRY_EXCEPTIONS
设置,用于配置RetryMiddleware
将重试哪些异常。(问题 2701,问题 5929)添加了在指定时间内未产生任何 Item 时关闭 Spider 的可能性,由
CLOSESPIDER_TIMEOUT_NO_ITEM
配置。(问题 5979)在 Feed 导出中添加了对
AWS_REGION_NAME
设置的支持。(问题 5980)添加了在
FEEDS
设置中使用引用绝对 Windows 路径的pathlib.Path
对象的功能。(问题 5939)
错误修复
修复了即使设置了
FEED_STORE_EMPTY=False
也会创建空 Feed 的问题。(问题 872,问题 5847)通过切换到分段上传修复了向 S3 上传大文件的问题(需要 boto3)。(问题 960,问题 5735,问题 5833)
修复了类对象添加的组件抛出带有消息的
NotConfigured
时发生的错误。(问题 5950,问题 5992)添加了缺失的
scrapy.settings.BaseSettings.pop()
方法。(问题 5959,问题 5960,问题 5963)添加了
CaseInsensitiveDict
作为CaselessDict
的替代品,修复了一些 API 不一致问题。(问题 5146)
文档
质量保证
Scrapy 2.9.0 (2023-05-08)
亮点
按域下载设置。
与新版 cryptography 和新版 parsel 的兼容性。
新版 parsel 中的 JMESPath 选择器。
错误修复。
已弃用功能
scrapy.extensions.feedexport._FeedSlot
重命名为scrapy.extensions.feedexport.FeedSlot
,旧名称已弃用。(问题 5876)
新功能
现在可以通过新的
DOWNLOAD_SLOTS
设置,基于每个域来设置与DOWNLOAD_DELAY
、CONCURRENT_REQUESTS_PER_DOMAIN
和RANDOMIZE_DOWNLOAD_DELAY
对应的设置。(问题 5328)添加了
TextResponse.jmespath()
,这是自 parsel 1.8.1 起提供的 JMESPath 选择器的快捷方式。(问题 5894,问题 5915)添加了
feed_slot_closed
和feed_exporter_closed
信号。(问题 5876)添加了
scrapy.utils.request.request_to_curl()
,一个从Request
对象生成 curl 命令的函数。(问题 5892)FILES_STORE
和IMAGES_STORE
的值现在可以是pathlib.Path
实例。(问题 5801)
错误修复
添加了缺失的
scrapy.settings.BaseSettings.setdefault()
方法。(问题 5811,问题 5821)修复了使用 cryptography 40.0.0+ 并启用
DOWNLOADER_CLIENT_TLS_VERBOSE_LOGGING
时发生的错误。(问题 5857,问题 5858)FilesPipeline
返回的 Google Cloud Storage 文件校验和不再进行 Base64 编码。(问题 5874,问题 5891)scrapy.utils.request.request_from_curl()
现在支持 curl--data-raw
参数的$-
前缀字符串值,浏览器在数据包含特定符号时会生成此类值。(问题 5899,问题 5901)LinkExtractor
现在跳过某些格式错误的 URL,而不是抛出异常。(问题 5881)scrapy.utils.python.get_func_args()
现在支持更多类型的可调用对象。(问题 5872, 问题 5885)修复了破坏用户处理
scrapy.mail.MailSender.send()
发送失败的错误。(问题 1611, 问题 5880)
文档
质量保证
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)
已弃用
新功能
将 black 编码风格应用于使用
genspider
和startproject
命令生成的文件。(问题 5809, 问题 5814)使用
startproject
命令生成的settings.py
文件现在将FEED_EXPORT_ENCODING
设置为"utf-8"
。使用此值后,JSON 导出将不会强制对非 ASCII 字符使用转义序列。(问题 5797, 问题 5800)MemoryUsage
扩展现在会在检查期间记录峰值内存使用情况,并使用二进制单位 MiB 以避免混淆。(问题 5717, 问题 5722, 问题 5727)Request
的callback
参数现在可以设置为scrapy.http.request.NO_CALLBACK()
,以区别于None
;因为后者表示将使用默认的 Spider 回调函数 (parse()
)。(问题 5798)
错误修复
修复了基于 STARTTLS 的电子邮件发送在 Twisted 21.2.0 及更高版本中无法工作的问题。(问题 5386, 问题 5406)
修复了 item exporters 的
finish_exporting()
方法对于空文件不会被调用的问题。(问题 5537, 问题 5758)修复了 HTTP/2 响应在接收到多个同名头部时,只获取最后一个头部值的问题。(问题 5777)
修复了在某些情况下 使用 asyncio 时,
shell
命令引发异常的问题。(问题 5740, 问题 5742, 问题 5748, 问题 5759, 问题 5760, 问题 5771)使用
CrawlSpider
时,添加到Rule
的process_request
回调函数中请求的关键字参数 (cb_kwargs
) 将不再被忽略。(问题 5699)图片管道 (images pipeline) 不再重新编码 JPEG 文件。(问题 3055, 问题 3689, 问题 4753)
修复了 图片管道 (images pipeline) 处理透明 WebP 图片的问题。(问题 3072, 问题 5766, 问题 5767)
scrapy.shell.inspect_response()
不再抑制SIGINT
(Ctrl+C)。(问题 2918)设置
unique=False
的LinkExtractor
不再过滤掉具有相同 URL *和* 文本的链接。(问题 3798, 问题 3799, 问题 4695, 问题 5458)RobotsTxtMiddleware
现在忽略不支持robots.txt
的 URL 协议(data://
,file://
)。(问题 5807)修复了
scrapy -h
输出中意外显示**commands**
行的问题。(问题 5709, 问题 5711, 问题 5712)
文档
记录了如何从 Visual Studio Code 调试 spider。(问题 5721)
记录了
DOWNLOAD_DELAY
如何影响每个域的并发性。(问题 5083, 问题 5540)提高了一致性。(问题 5761)
质量保证
应用了 black 编码风格,对导入语句进行了排序,并引入了 pre-commit。(问题 4654, 问题 4658, 问题 5734, 问题 5737, 问题 5806, 问题 5810)
解决了 Pylint 报告的许多问题。(问题 5677)
提高了代码可读性。(问题 5736)
改进了包的元数据。(问题 5768)
移除了不必要的
OrderedDict
用法。(问题 5795)移除了不必要的
__str__
定义。(问题 5150)修复了测试和 CI 问题。(问题 5749, 问题 5750, 问题 5756, 问题 5762, 问题 5765, 问题 5780, 问题 5781, 问题 5782, 问题 5783, 问题 5785, 问题 5786)
Scrapy 2.7.1 (2022-11-02)
新功能
错误修复
文档
质量保证
Scrapy 2.7.0 (2022-10-17)
亮点
添加了 Python 3.11 支持,移除了 Python 3.6 支持
改进了对 异步回调 的支持
新项目默认启用 Asyncio 支持
项目字段的输出名称现在可以是任意字符串
现在可以集中配置 请求指纹 (request fingerprinting)
修改的要求
现在需要 Python 3.7 或更高版本;已移除对 Python 3.6 的支持。已添加对即将发布的 Python 3.11 的支持。
一些依赖项的最低所需版本也发生了变化
lxml: 3.5.0 → 4.3.0
zope.interface: 5.0.0 → 5.1.0
(问题 5512, 问题 5514, 问题 5524, 问题 5563, 问题 5664, 问题 5670, 问题 5678)
已弃用
ImagesPipeline.thumb_path
现在必须接受一个item
参数 (问题 5504, 问题 5508)。scrapy.downloadermiddlewares.decompression
模块现已弃用 (问题 5546, 问题 5547)。
新功能
process_spider_output()
方法的 spider 中间件 现在可以定义为 异步生成器 (问题 4978)。定义为 协程 (coroutines) 的
Request
回调函数的输出现在是异步处理的 (问题 4978)。使用
startproject
命令创建的新项目默认启用 asyncio 支持(issue 5590,issue 5679)。FEED_EXPORT_FIELDS
设置现在可以定义为字典,以自定义 item 字段的输出名称,从而取消了要求输出名称必须是有效的 Python 标识符(例如不能包含空格)的限制(issue 1008,issue 3266,issue 3696)。您现在可以通过新的
REQUEST_FINGERPRINTER_CLASS
设置自定义 请求指纹,而无需在每个依赖于请求指纹的 Scrapy 组件上更改它(issue 900,issue 3420,issue 4113,issue 4762,issue 4524)。jsonl
现在作为 JSON Lines 文件的文件扩展名得到支持和推荐(issue 4848)。ImagesPipeline.thumb_path
现在接收源 item(issue 5504,issue 5508)。
错误修复
将 Google Cloud Storage 与 媒体 pipeline 结合使用时,
FILES_EXPIRES
现在在FILES_STORE
不指向 Google Cloud Storage 存储桶的根目录时也能工作(issue 5317,issue 5318)。parse
命令现在支持 异步回调(issue 5424,issue 5577)。使用
parse
命令处理没有可用 spider 的 URL 时,不再引发异常(issue 3264,issue 3265,issue 5375,issue 5376,issue 5497)。TextResponse
现在在确定响应体的文本编码时,会优先考虑 字节顺序标记,遵循 HTML living standard(issue 5601,issue 5611)。MIME 嗅探在 FTP 和 HTTP/1.0 请求以及缓存请求中会考虑响应体(issue 4873)。
MIME 嗅探现在即使在缺少
html
标签的情况下也能检测到有效的 HTML 5 文档(issue 4873)。如果
ASYNCIO_EVENT_LOOP
的值与实际安装的 asyncio 事件循环不匹配,现在会引发异常(issue 5529)。修复了
Headers.getlist
只返回最后一个头部的问题(issue 5515,issue 5526)。修复了
LinkExtractor
默认情况下不忽略tar.gz
文件扩展名的问题(issue 1837,issue 2067,issue 4066)
文档
澄清了
Spider.parse
的返回类型(issue 5602,issue 5608)。为了使
HttpCompressionMiddleware
执行 brotli 压缩,现在推荐安装 brotli,而不是安装 brotlipy,因为前者提供了更新版本的 brotli。信号文档 现在提到了 协程支持 并在代码示例中使用了它(issue 4852,issue 5358)。
避免被封禁 现在推荐 Common Crawl 而不是 Google 缓存(issue 3582,issue 5432)。
新的 组件 主题涵盖了对 Scrapy 组件强制执行要求,例如 downloader middleware、扩展、item pipeline、spider middleware 等;还增加了 强制要求使用 asyncio(issue 4978)。
设置 现在指出设置值必须是 可 pickle 的(issue 5607,issue 5629)。
移除了过时的文档(issue 5446,issue 5373,issue 5369,issue 5370,issue 5554)。
修复了拼写错误(issue 5442,issue 5455,issue 5457,issue 5461,issue 5538,issue 5553,issue 5558,issue 5624,issue 5631)。
修复了其他问题(issue 5283,issue 5284,issue 5559,issue 5567,issue 5648,issue 5659,issue 5665)。
质量保证
添加了运行 twine check 的持续集成作业(issue 5655,issue 5656)。
解决了测试问题和警告(issue 5560,issue 5561,issue 5612,issue 5617,issue 5639,issue 5645,issue 5662,issue 5671,issue 5675)。
清理了代码(issue 4991,issue 4995,issue 5451,issue 5487,issue 5542,issue 5667,issue 5668,issue 5672)。
应用了小幅的代码改进(issue 5661)。
Scrapy 2.6.3 (2022-09-27)
添加了对 pyOpenSSL 22.1.0 的支持,移除了对 SSLv3 的支持(issue 5634,issue 5635,issue 5636)。
升级了以下依赖项的最低版本
cryptography: 2.0 → 3.3
pyOpenSSL: 16.2.0 → 21.0.0
service_identity: 16.0.0 → 18.1.0
Twisted: 17.9.0 → 18.9.0
zope.interface: 4.1.3 → 5.0.0
修复了测试和文档问题(issue 5612,issue 5617,issue 5631)。
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 版本中引入的以下回归问题
CrawlerProcess
再次支持爬取多个 spider(issue 5435,issue 5436)在 Scrapy 之前安装 Twisted reactor(例如在模块级别导入
twisted.internet.reactor
)不再阻止 Scrapy 启动,只要在TWISTED_REACTOR
中没有指定不同的 reactor(issue 5525,issue 5528)修复了在某些条件下 spider 完成后会记录异常的问题(issue 5437,issue 5440)
命令行参数
--output
/-o
再次支持以连字符开头的值 (issue 5444, issue 5445)命令
scrapy parse -h
不再抛出错误 (issue 5481, issue 5482)
Scrapy 2.6.1 (2022-03-01)
修复了 2.6.0 版本中引入的一个回归问题,该问题会在跟随重定向时取消设置请求方法。
Scrapy 2.6.0 (2022-03-01)
亮点
支持 Python 3.10
asyncio 支持不再被视为实验性功能,并且在 Windows 上开箱即用,无论您的 Python 版本如何
Feed 导出现在支持
pathlib.Path
输出路径以及每个 feed 的 item 过滤 和 后处理
安全错误修复
当定义了 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 安全公告。
修改的要求
h2 依赖项现在是可选的,仅在启用 HTTP/2 支持时需要。(issue 5113)
向后不兼容的更改
FormRequest
的formdata
参数,如果指定用于非 POST 请求,现在会覆盖 URL 查询字符串,而不是附加到它。(issue 2919,issue 3579)当一个函数被赋值给
FEED_URI_PARAMS
设置时,现在该函数的返回值,而不是params
输入参数,将决定 feed URI 参数,除非该返回值为None
。(issue 4962,issue 4966)在
scrapy.core.engine.ExecutionEngine
中,方法crawl()
、download()
、schedule()
和spider_is_idle()
现在如果在调用open_spider()
之前被调用,则会引发RuntimeError
。(issue 5090)这些方法过去假定
ExecutionEngine.slot
已通过先前的open_spider()
调用定义,因此它们过去会引发AttributeError
。如果配置的 scheduler 的 API 不符合预期,现在会在启动时引发
TypeError
。之前,其他异常会在运行时引发。(issue 3559)序列化
Request
对象的_encoding
字段现在命名为encoding
,与所有其他字段保持一致(issue 5130)
已移除的废弃功能
scrapy.http.TextResponse.body_as_unicode
,在 Scrapy 2.2 中已废弃,现已移除。(issue 5393)scrapy.item.BaseItem
,在 Scrapy 2.2 中已废弃,现已移除。(issue 5398)scrapy.item.DictItem
,在 Scrapy 1.8 中已废弃,现已移除。(issue 5398)scrapy.Spider.make_requests_from_url
,在 Scrapy 1.4 中已废弃,现已移除。(issue 4178,issue 4356)
已废弃的功能
当一个函数被赋值给
FEED_URI_PARAMS
设置时,返回None
或修改params
输入参数现在已废弃。请改为返回一个新的字典。(issue 4962,issue 4966)scrapy.utils.reqser
已废弃。(issue 5130)请使用新的
Request.to_dict()
方法,而不是request_to_dict()
。请使用新的
scrapy.utils.request.request_from_dict()
函数,而不是request_from_dict()
。
在
scrapy.squeues
中,以下队列类已废弃:PickleFifoDiskQueueNonRequest
,PickleLifoDiskQueueNonRequest
,MarshalFifoDiskQueueNonRequest
和MarshalLifoDiskQueueNonRequest
。你应该改用:PickleFifoDiskQueue
,PickleLifoDiskQueue
,MarshalFifoDiskQueue
和MarshalLifoDiskQueue
。(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)
新特性
您现在可以使用 项目过滤 来控制哪些项目导出到每个输出 feed。(issue 4575, issue 5178, issue 5161, issue 5203)
您现在可以对 feed 应用 后处理,并且提供了 内置后处理插件 用于输出文件压缩。(issue 2174, issue 5168, issue 5190)
FEEDS
设置现在支持pathlib.Path
对象作为键。(issue 5383, issue 5384)在 Windows 和 Python 3.8 或更高版本上启用 asyncio 时,将自动把 asyncio 事件循环切换到允许 Scrapy 工作的一个。请参阅 Windows 特定说明。(issue 4976, issue 5315)
genspider
命令现在支持起始 URL 而不是域名。(issue 4439)scrapy.utils.defer
新增了两个函数deferred_to_future()
和maybe_deferred_to_future()
,以帮助在使用 asyncio reactor 时 await Deferreds。(issue 5288)Amazon S3 feed 导出存储 支持 临时安全凭证 (
AWS_SESSION_TOKEN
) 和 端点定制 (AWS_ENDPOINT_URL
)。(issue 4998, issue 5210)新增
LOG_FILE_APPEND
设置,允许截断日志文件。(issue 5279)Request.cookies 中
bool
,float
或int
类型的值会转换为str
。(issue 5252, issue 5253)您现在可以从
spider_idle
信号的处理程序中抛出CloseSpider
,以自定义爬虫停止的原因。(issue 5191)使用
HttpProxyMiddleware
时,非 HTTPS HTTP/1.1 请求的代理 URL 不再需要包含 URL scheme。(issue 4505, issue 4649)所有内置队列现在都公开了一个
peek
方法,该方法返回下一个队列对象(类似于pop
),但不会从队列中移除返回的对象。(issue 5112)如果底层队列不支持 peeking(例如,因为您未安装
queuelib
1.6.1 或更高版本),则peek
方法会抛出NotImplementedError
。Request
和Response
现在有一个attributes
属性,这使得子类化更容易。对于Request
,它还允许子类与scrapy.utils.request.request_from_dict()
一起工作。(issue 1877, issue 5130, issue 5218)调度器 的
open()
和close()
方法现在是可选的。(issue 3559)HTTP/1.1
TunnelError
异常现在只截断长度超过 1000 个字符的响应体,而不是长度超过 32 个字符的,这使得调试此类错误更容易。(issue 4881, issue 5007)ItemLoader
现在支持非文本响应。(issue 5145, issue 5269)
错误修复
如果在
custom_settings
中定义,TWISTED_REACTOR
和ASYNCIO_EVENT_LOOP
设置将不再被忽略。(issue 4485, issue 5352)移除了可能阻止 使用 asyncio reactor 的模块级 Twisted reactor 导入。(issue 5357)
startproject
命令再次支持现有文件夹。(issue 4665, issue 4676)FEED_URI_PARAMS
设置现在按文档所述工作。(issue 4962, issue 4966)Request.cb_kwargs
再次允许使用callback
关键字。(issue 5237, issue 5251, issue 5264)改进了
scrapy.utils.response.open_in_browser()
以支持更复杂的 HTML。(issue 5319, issue 5320)修复了将
CSVFeedSpider.quotechar
解释为 CSV 文件编码的问题。(issue 5391, issue 5394)在依赖列表中添加了缺失的 setuptools。(issue 5122)
LinkExtractor
现在也能按预期处理带有逗号分隔的rel
属性值(包括nofollow
)的链接。(issue 5225)修复了在 feed 导出 参数解析期间可能抛出的
TypeError
。(issue 5359)
文档
asyncio 支持 不再被视为实验性功能。(issue 5332)
使用最新的最佳实践重写了 使用无头浏览器 一节。(issue 4484, issue 4613)
文档化了 媒体管道中的本地文件命名。(issue 5069, issue 5152)
常见问题 现在涵盖了爬虫文件名冲突问题。(issue 2680, issue 3669)
提供了更好的背景信息和禁用
URLLENGTH_LIMIT
设置的说明。(issue 5135, issue 5250)文档说明了 Reppy 解析器不支持 Python 3.9+。(issue 5226, issue 5231)
文档化了 调度器组件。(issue 3537, issue 3559)
文档化了 媒体管道 用于 判断文件是否过期 的方法。(issue 5120, issue 5254)
在同一进程中运行多个爬虫 现在介绍了
scrapy.utils.project.get_project_settings()
的用法。(issue 5070)在同一进程中运行多个爬虫 现在涵盖了当你为运行时不能不同的某些设置定义不同的每个爬虫值时会发生什么。(issue 4485, issue 5352)
扩展了
StatsMailer
扩展的文档。(issue 5199, issue 5217)将
JOBDIR
添加到 设置 中。(issue 5173, issue 5224)文档化了
Spider.attribute
。(issue 5174, issue 5244)文档化了
TextResponse.urljoin
。(issue 1582)在
headers_received
信号的文档签名中添加了body_length
参数。(issue 5270)在 教程 中澄清了
SelectorList.get
的用法。(issue 5256)文档现在提供了具有多个导入路径的类的最短导入路径。(issue 2733, issue 5099)
quotes.toscrape.com 引用现在使用 HTTPS 而不是 HTTP。(issue 5395, issue 5396)
在 获取帮助 中添加了指向我们的 Discord 服务器 的链接。(issue 5421, issue 5422)
项目名称的官方发音现在是 /ˈskreɪpaɪ/。(issue 5280, issue 5281)
在 README 中添加了 Scrapy 标志。(issue 5255, issue 5258)
修复了问题并实现了小改进。(issue 3155, issue 4335, issue 5074, issue 5098, issue 5134, issue 5180, issue 5194, issue 5239, issue 5266, issue 5271, issue 5273, issue 5274, issue 5276, issue 5347, issue 5356, issue 5414, issue 5415, issue 5416, issue 5419, issue 5420)
质量保证
添加了对 Python 3.10 的支持。(issue 5212, issue 5221, issue 5265)
显著减少了
scrapy.utils.response.response_httprepr()
的内存使用,该函数由默认启用的DownloaderStats
下载器中间件使用。(issue 4964, issue 4972)移除了对废弃的
optparse
模块的使用。(issue 5366, issue 5374)扩展了类型提示。(issue 5077, issue 5090, issue 5100, issue 5108, issue 5171, issue 5215, issue 5334)
改进了测试,修复了 CI 问题,移除了未使用的代码。(issue 5094, issue 5157, issue 5162, issue 5198, issue 5207, issue 5208, issue 5229, issue 5298, issue 5299, issue 5310, issue 5316, issue 5333, issue 5388, issue 5389, issue 5400, issue 5401, issue 5404, issue 5405, issue 5407, issue 5410, issue 5412, issue 5425, issue 5427)
为贡献者实现了改进。(issue 5080, issue 5082, issue 5177, issue 5200)
实施了清理工作。 (issue 5095, issue 5106, issue 5209, issue 5228, issue 5235, issue 5245, issue 5246, issue 5292, issue 5314, issue 5322)
Scrapy 2.5.1 (2021-10-05)
安全错误修复
如果您使用
HttpAuthMiddleware
(即蜘蛛属性http_user
和http_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)
亮点
正式支持 Python 3.9
实验性 HTTP/2 支持
新增
get_retry_request()
函数,用于从蜘蛛回调中重试请求新增
headers_received
信号,允许提前停止下载新增
Response.protocol
属性
移除已弃用的功能
移除了所有在 1.7.0 中弃用 且尚未在 2.4.0 中移除的代码。(issue 4901)
移除了对环境变量
SCRAPY_PICKLED_SETTINGS_TO_OVERRIDE
的支持,该变量在 1.8.0 中弃用。(issue 4912)
弃用
模块
scrapy.utils.py36
已被弃用,取而代之的是scrapy.utils.asyncgen
。(issue 4900)
新功能
实验性 HTTP/2 支持,通过一个新的下载处理器实现,可在
DOWNLOAD_HANDLERS
设置中将其分配给https
协议。(issue 1854, issue 4769, issue 5058, issue 5059, issue 5066)新的函数
scrapy.downloadermiddlewares.retry.get_retry_request()
可用于蜘蛛回调或中间件中,处理超出RetryMiddleware
支持场景的请求重试。(issue 3590, issue 3685, issue 4902)新的
headers_received
信号允许早期访问响应头并允许停止下载。(issue 1772, issue 4897)新的
Response.protocol
属性允许访问标识下载响应所用协议的字符串。(issue 4878)统计信息现在包含以下条目,指示存储 feed 的成功和失败次数
feedexport/success_count/<storage type> feedexport/failed_count/<storage type>
其中
<storage type>
是 feed 存储后端类名,例如FileFeedStorage
或FTPFeedStorage
。蜘蛛中间件
UrlLengthMiddleware
现在使用INFO
日志级别记录被忽略的 URL,而不是DEBUG
,并且现在在 统计信息中包含以下条目,以跟踪被忽略的 URL 数量urllength/request_ignored_count
下载器中间件
HttpCompressionMiddleware
现在记录解压缩的响应数量和产生的总字节数httpcompression/response_bytes httpcompression/response_count
Bug 修复
修复了在 PyPy 上安装时,除了 PyPyDispatcher 外还会安装 PyDispatcher 的问题,这可能会导致 Scrapy 无法正常工作,具体取决于导入的是哪个包。(issue 4710, issue 4814)
在检查回调以确认它是否是同时返回值的生成器时,如果回调的 docstring 缩进低于其后续代码,则不再引发异常。(issue 4477, issue 4935)
使用默认的 HTTP/1.1 下载处理器时(参见
DOWNLOAD_HANDLERS
),响应中不再省略 Content-Length 头。(issue 5009, issue 5034, issue 5045, issue 5057, issue 5062)将请求元数据键
handle_httpstatus_all
设置为False
现在与完全不设置它的效果相同,而不是与设置为True
的效果相同。(issue 3851, issue 4694)
文档
添加了使用 pip 在 Windows 中安装 Scrapy 的说明。(issue 4715, issue 4736)
日志记录文档现在包含了过滤日志的其他方法。(issue 4216, issue 4257, issue 4965)
在 FAQ 中涵盖了如何处理允许域的长列表。(issue 2263, issue 3667)
在 基准测试 中涵盖了 scrapy-bench。(issue 4996, issue 5016)
澄清了每个爬虫会创建一个扩展实例。(issue 5014)
修复了示例中的一些错误。(issue 4829, issue 4830, issue 4907, issue 4909, issue 5008)
修复了一些外部链接、拼写错误等。(issue 4892, issue 4899, issue 4936, issue 4942, issue 5005, issue 5063)
Request.meta 键列表现在按字母顺序排序。(issue 5061, issue 5065)
更新了对 Scrapinghub 的引用,它现在被称为 Zyte。(issue 4973, issue 5072)
在 README 中添加了对贡献者的提及。(issue 4956)
减小了列表的上外边距。(issue 4974)
质量保证
正式支持 Python 3.9 (issue 4757, issue 4759)
扩展了类型提示 (issue 4895)
修复了对 Twisted API 的弃用用法。(issue 4940, issue 4950, issue 5073)
使我们的测试使用新的 pip 解析器运行。(issue 4710, issue 4814)
添加了测试以确保协程支持得到测试。(issue 4987)
从 Travis CI 迁移到 GitHub Actions。(issue 4924)
修复了 CI 问题。(issue 4986, issue 5020, issue 5022, issue 5027, issue 5052, issue 5053)
实施了代码重构、风格修复和清理工作。(issue 4911, issue 4982, issue 5001, issue 5002, issue 5076)
Scrapy 2.4.1 (2020-11-17)
修复了 feed 导出覆盖支持问题 (issue 4845, issue 4857, issue 4859)
修复了 AsyncIO 事件循环处理问题,该问题可能导致代码挂起 (issue 4855, issue 4872)
修复了可处理 IPv6 的 DNS 解析器
CachingHostnameResolver
,适用于调用reactor.resolve
的下载处理器 (issue 4802, issue 4803)修复了
genspider
命令的输出显示占位符而不是生成蜘蛛模块的导入路径的问题 (issue 4874)将 Windows CI 从 Azure Pipelines 迁移到 GitHub Actions (issue 4869, issue 4876)
Scrapy 2.4.0 (2020-10-11)
亮点
已停止支持 Python 3.5。
媒体管道的
file_path
方法现在可以访问源 item。这允许您根据 item 数据设置下载文件路径。
您现在可以选择 feed 导出是覆盖还是追加到输出文件。
如果安装了 zstandard,现在支持 Zstd 压缩的响应。
在需要类导入路径的设置中,现在可以传递一个类对象代替。
修改的要求
现在需要 Python 3.6 或更高版本;已停止支持 Python 3.5
因此
(issue 4718, issue 4732, issue 4733, issue 4742, issue 4743, issue 4764)
向后不兼容的变更
CookiesMiddleware
再次丢弃在Request.headers
中定义的 cookie。我们决定撤销在 Scrapy 2.2.0 中引入的这个 bug 修复,因为有报告称当前的实现可能会破坏现有代码。
如果需要为请求设置 cookie,请使用
Request.cookies
参数。Scrapy 的未来版本将包含一个新的、更好的实现来替代被撤销的 bug 修复。
移除已弃用的功能
scrapy.extensions.feedexport.S3FeedStorage
在未向其__init__
方法传递access_key
和secret_key
值时,不再从运行的项目设置中读取这些值;您必须将这些参数传递给其__init__
方法或使用S3FeedStorage.from_crawler
(issue 4356, issue 4411, issue 4688)Rule.process_request
不再接受只接收单个request
参数而不是同时接收request
和response
的可调用对象 (issue 4818)
弃用
在自定义媒体管道中,任何现在支持
item
关键字参数但其签名不接受该参数的方法都被弃用 (issue 4628, issue 4686)在自定义feed 存储后端类中,
__init__
方法签名不接受feed_options
关键字参数的将被弃用 (issue 547, issue 716, issue 4512)类
scrapy.utils.python.WeakKeyCache
已被弃用 (issue 4684, issue 4701)函数
scrapy.utils.boto.is_botocore()
已被弃用,请改用scrapy.utils.boto.is_botocore_available()
(issue 4734, issue 4776)
新功能
媒体管道的以下方法现在接受一个包含源 item 的
item
关键字参数在
scrapy.pipelines.files.FilesPipeline
中file_downloaded()
media_downloaded()
media_to_download()
在
scrapy.pipelines.images.ImagesPipeline
中file_downloaded()
get_images()
image_downloaded()
media_downloaded()
media_to_download()
FEEDS
设置中的新键item_export_kwargs
允许定义要传递给 item 导出器类的关键字参数 (issue 4606, issue 4768)Feed 导出增加了覆盖支持
您可以使用
FEEDS
设置中的overwrite
键来配置是覆盖输出文件(True
)还是追加内容(False
)feed 存储后端类的
__init__
和from_crawler
方法现在接收一个新的关键字参数feed_options
,它是一个包含 feed 选项的字典
如果安装了 zstandard,现在支持 Zstd 压缩的响应 (issue 4831)
在需要类导入路径的 settings 中,现在可以直接传递类对象 (issue 3870, issue 3873)。
这也包括部分值由导入路径组成的 settings,例如
DOWNLOADER_MIDDLEWARES
或DOWNLOAD_HANDLERS
。下载器中间件 现在可以覆盖
response.request
。如果一个 下载器中间件 从
process_response()
或process_exception()
返回一个Response
对象,并且该对象的response.request
被赋值为一个自定义的Request
对象则响应由该自定义
Request
对象的 callback 处理,而不是由原始Request
对象的 callback 处理该自定义
Request
对象现在作为request
参数发送到response_received
信号,而不是原始Request
对象
使用 FTP feed 存储后端 时
现在可以将新的
overwrite
feed 选项 设置为False
,以追加到现有文件而不是覆盖它如果不需要,现在可以省略 FTP 密码
CsvItemExporter
的__init__
方法现在支持errors
参数,用于指示如何处理编码错误 (issue 4755)使用 asyncio 时,现在可以 设置自定义 asyncio loop (issue 4306, issue 4414)
序列化的 requests (参见 任务: 暂停和恢复爬取) 现在支持将 spider 方法作为 callback,这些方法委托给其他可调用对象 (issue 4756)
当响应大于
DOWNLOAD_MAXSIZE
时,记录的消息现在是警告,而不是错误 (issue 3874, issue 3886, issue 4752)
Bug 修复
genspider
命令现在不再覆盖现有文件,除非使用--force
选项 (issue 4561, issue 4616, issue 4623)空值的 cookies 现在不再被视为无效 cookies (issue 4772)
runspider
命令现在支持文件扩展名为.pyw
的文件 (issue 4643, issue 4646)HttpProxyMiddleware
中间件现在会直接忽略不受支持的代理值 (issue 3331, issue 4778)检查带有
return
语句的生成器 callback 时,不再对嵌套函数中的return
语句发出警告 (issue 4720, issue 4721)系统文件模式创建掩码不再影响使用
startproject
命令生成文件的权限 (issue 4722)scrapy.utils.iterators.xmliter()
现在支持命名空间节点名 (issue 861, issue 4746)Request
对象现在可以包含about:
URL,这在使用无头浏览器时可行 (issue 4835)
文档
FEED_URI_PARAMS
setting 现在有文档了 (issue 4671, issue 4724)改进了关于 链接提取器 的文档,增加了 spider callback 的使用示例以及
Link
类的参考文档 (issue 4751, issue 4775)阐明了使用
CloseSpider
扩展时CONCURRENT_REQUESTS
的影响 (issue 4836)移除了对 Python 2
unicode
类型的引用 (issue 4547, issue 4703)我们现在有 官方废弃策略 (issue 4705)
我们的 文档策略 现在涵盖了 Sphinx 的
versionadded
和versionchanged
指令的使用,并且我们移除了引用 Scrapy 1.4.0 及更早版本的用法 (issue 3971, issue 4310)其他文档清理工作 (issue 4090, issue 4782, issue 4800, issue 4801, issue 4809, issue 4816, issue 4825)
质量保证
扩展了类型提示 (issue 4243, issue 4691)
为
check
命令添加了测试 (issue 4663)修复了 Debian 上的测试失败 (issue 4726, issue 4727, issue 4735)
改进了 Windows 测试覆盖率 (issue 4723)
尽可能切换到 格式化字符串字面量 (issue 4307, issue 4324, issue 4672)
现代化了
super()
的用法 (issue 4707)其他代码和测试清理工作 (issue 1790, issue 3288, issue 4165, issue 4564, issue 4651, issue 4714, issue 4738, issue 4745, issue 4747, issue 4761, issue 4765, issue 4804, issue 4817, issue 4820, issue 4822, issue 4839)
Scrapy 2.3.0 (2020-08-04)
亮点
Feed Exports 现在支持 Google Cloud Storage 作为存储后端
新的
FEED_EXPORT_BATCH_ITEM_COUNT
setting 允许按指定的条目数进行批量交付。它也可用作某些存储后端 (S3, FTP, 以及现在的 GCS) 文件延迟交付 的 workaround,这导致 Scrapy 在爬取完成后才开始交付 item。
Item loaders 的基本实现已移至单独的库 itemloaders 中,允许在 Scrapy 外部使用,并具有单独的发布计划
已移除的废弃功能
从
scrapy.linkextractors
中移除了以下类及其父模块htmlparser.HtmlParserLinkExtractor
regex.RegexLinkExtractor
sgml.BaseSgmlLinkExtractor
sgml.SgmlLinkExtractor
请改用
LinkExtractor
(issue 4356, issue 4679)
废弃项
函数
scrapy.utils.python.retry_on_eintr
现已废弃 (issue 4683)
新特性
Feed Exports 支持 Google Cloud Storage (issue 685, issue 3608)
新的
FEED_EXPORT_BATCH_ITEM_COUNT
setting,用于批量交付 (issue 4250, issue 4434)parse
命令现在允许指定输出文件 (issue 4317, issue 4377)Request.from_curl()
和curl_to_request_kwargs()
现在也支持--data-raw
(issue 4612)现在可以在内置的 spider 子类(例如
CrawlSpider
)中使用parse
callback (issue 712, issue 732, issue 781, issue 4254 )
Bug 修复
修复了 CSV 导出 dataclass item 和 attr.s item 的问题 (issue 4667, issue 4668)
Request.from_curl()
和curl_to_request_kwargs()
现在在指定请求体且未指定请求方法时,将请求方法设置为POST
(issue 4612)在 Windows 10.0.14393 及更高版本中启用 ANSI 转义序列的处理,这对于彩色输出是必需的 (issue 4393, issue 4403)
文档
更新了
DOWNLOADER_CLIENT_TLS_CIPHERS
setting 文档中 OpenSSL 密码列表格式 的链接 (issue 4653)简化了 使用 dataclass item 中的代码示例 (issue 4652)
质量保证
Item loaders 的基本实现已移至 itemloaders (issue 4005, issue 4516)
修复了某些调度器测试中被隐藏的错误 (issue 4644, issue 4645)
更新了用于 SSL 测试的 localhost 证书 (issue 4650)
移除了 Python 2 特定的 cookie 处理代码 (issue 4682)
停止使用 Python 2 的 unicode 字面量语法 (issue 4704)
停止使用反斜杠进行行继续 (issue 4673)
从 MyPy 异常列表中移除了不需要的条目 (issue 4690)
自动测试现在作为我们持续集成系统的一部分,在 Windows 上通过 (issue 4458)
自动测试现在作为我们持续集成系统的一部分,在支持的 Python 版本的最新 PyPy 版本上通过 (issue 4504)
Scrapy 2.2.1 (2020-07-17)
startproject
命令不再对目标文件夹中的文件权限进行意外更改,例如移除执行权限 (issue 4662, issue 4666)
Scrapy 2.2.0 (2020-06-24)
亮点
现在需要 Python 3.5.2+
dataclass 对象 和 attrs 对象 现在是有效的 item 类型
新增
TextResponse.json
方法新增
bytes_received
信号,允许取消响应下载
向后不兼容的更改
已移除对 Python 3.5.0 和 3.5.1 的支持;Scrapy 现在拒绝在低于 3.5.2 的 Python 版本下运行,该版本引入了
typing.Type
(issue 4615)
废弃项
TextResponse.body_as_unicode()
现已废弃,请改用TextResponse.text
(issue 4546, issue 4555, issue 4579)scrapy.item.BaseItem
现已废弃,请改用scrapy.item.Item
(issue 4534)
新特性
dataclass 对象 和 attrs 对象 现在是有效的 item 类型,并且新的 itemadapter 库使得编写 支持任何 item 类型 的代码变得容易 (issue 2749, issue 2807, issue 3761, issue 3881, issue 4642)
新增
TextResponse.json
方法,允许反序列化 JSON 响应 (issue 2444, issue 4460, issue 4574)新增
bytes_received
信号,允许监控响应下载进度并 停止下载 (issue 4205, issue 4559)在 媒体管道 结果列表中的字典现在包含一个新的键
status
,它指示文件是否已下载,或者如果未下载,则指示原因;更多信息请参见FilesPipeline.get_media_requests
(issue 2893, issue 4486)当使用 Google Cloud Storage 作为 媒体管道 时,如果配置的凭据未授予所需权限,现在会记录警告 (issue 4346, issue 4508)
链接提取器 现在是可序列化的,只要你不使用 lambda 表达式 作为参数;例如,在 持久化计划请求 时,你现在可以在
Request.cb_kwargs
或Request.meta
中传递链接提取器 (issue 4554)Scrapy 使用的 pickle 协议 从协议 2 升级到协议 4,提高了序列化能力和性能 (issue 4135, issue 4541)
scrapy.utils.misc.create_instance()
现在会抛出TypeError
异常,如果生成的实例是None
(issue 4528, issue 4532)
Bug 修复
CookiesMiddleware
不再丢弃在Request.headers
中定义的 cookie (issue 1992, issue 2400)CookiesMiddleware
不再重新编码定义为bytes
在Request
的__init__
方法的cookies
参数中的 cookie (issue 2400, issue 3575)当
FEEDS
定义多个 URI,FEED_STORE_EMPTY
为False
且抓取没有产生任何 item 时,Scrapy 不再在第一个 URI 后停止 Feed 导出 (issue 4621, issue 4626)使用 协程语法 定义的
Spider
回调函数不再需要返回可迭代对象,而是可以返回一个Request
对象,一个 item,或None
(issue 4609)startproject
命令现在确保生成的项目文件夹和文件具有正确的权限 (issue 4604)修复了有时会从
scrapy.utils.datatypes.LocalWeakReferencedCache
抛出的KeyError
异常问题 (issue 4597, issue 4599)当
FEEDS
定义多个 URI 时,关于 item 被存储的日志消息现在包含来自相应 Feed 的信息,而不是总是只包含关于其中一个 Feed 的信息 (issue 4619, issue 4629)
文档
添加了关于 从 errbacks 访问 cb_kwargs 的新章节 (issue 4598, issue 4634)
在 解析 JavaScript 代码 中介绍了 chompjs (issue 4556, issue 4562)
从 协程 中移除了关于 API 处于实验阶段的警告 (issue 4511, issue 4513)
移除了对不受支持的 Twisted 版本的引用 (issue 4533)
更新了 截图管道示例 的描述,该示例现在使用 协程语法 而不是返回一个
Deferred
(issue 4514, issue 4593)从
scrapy.utils.log.configure_logging()
代码示例中移除了一个误导性的导入行 (issue 4510, issue 4587)内部文档引用的悬停显示行为现在也涵盖了指向 命令,
Request.meta
键,设置 和 信号 的链接 (issue 4495, issue 4563)现在又可以下载文档进行离线阅读了 (issue 4578, issue 4585)
移除了在某些函数和方法签名中,
*args
和**kwargs
之前的前导反斜杠 (issue 4592, issue 4596)
质量保证
根据我们的 代码风格指南 进一步调整了代码库 (issue 4237, issue 4525, issue 4538, issue 4539, issue 4540, issue 4542, issue 4543, issue 4544, issue 4545, issue 4557, issue 4558, issue 4566, issue 4568, issue 4572)
移除了 Python 2 支持的残余代码 (issue 4550, issue 4553, issue 4568)
改进了
crawl
和runspider
命令之间的代码共享 (issue 4548, issue 4552)将
chain(*iterable)
替换为chain.from_iterable(iterable)
(issue 4635)您现在可以在任何 Python 版本上使用 Tox 运行
asyncio
测试 (issue 4521)更新了测试要求,以反映与 pytest 5.4 和 5.4.1 的不兼容性 (issue 4588)
改进了
SpiderLoader
测试覆盖率,针对涉及重复蜘蛛名称的场景 (issue 4549, issue 4560)配置了 Travis CI,使其也使用 Python 3.5.2 运行测试 (issue 4518, issue 4615)
在 Travis CI 中添加了 Pylint 作业 (issue 3727)
在 Travis CI 中添加了 Mypy 作业 (issue 4637)
在测试中使用了集合字面量 (issue 4573)
清理了 Travis CI 配置 (issue 4517, issue 4519, issue 4522, issue 4537)
Scrapy 2.1.0 (2020-04-24)
亮点
新的
FEEDS
设置,用于导出到多个 Feed新的
Response.ip_address
属性
向后不兼容的变更
由 assert 语句触发的
AssertionError
异常已由新的异常类型替换,以支持在优化模式下运行 Python (参见-O
),而不会以任何意外方式改变 Scrapy 的行为。如果您捕获了来自 Scrapy 的
AssertionError
异常,请更新您的代码以捕获相应的新的异常类型。
已移除的废弃项
LOG_UNSERIALIZABLE_REQUESTS
设置不再支持,请使用SCHEDULER_DEBUG
代替 (issue 4385)REDIRECT_MAX_METAREFRESH_DELAY
设置不再支持,请使用METAREFRESH_MAXDELAY
代替 (issue 4385)ChunkedTransferMiddleware
中间件已被移除,包括整个scrapy.downloadermiddlewares.chunked
模块;分块传输开箱即用 (issue 4431)的
spiders
属性已从Crawler
中移除,请改用CrawlerRunner.spider_loader
或使用您的设置实例化SPIDER_LOADER_CLASS
(issue 4398)MultiValueDict
、MultiValueDictKeyError
和SiteNode
类已从scrapy.utils.datatypes
中移除 (issue 4400)
废弃项
FEED_FORMAT
和FEED_URI
设置已被废弃,取而代之的是新的FEEDS
设置 (issue 1336, issue 3858, issue 4507)
新特性
一个新的设置
FEEDS
,允许配置多个具有不同设置的输出 Feed (issue 1336, issue 3858, issue 4507)crawl
和runspider
命令现在支持多个-o
参数 (issue 1336, issue 3858, issue 4507)crawl
和runspider
命令现在支持通过向输出文件名附加:<format>
来指定输出格式 (issue 1336, issue 3858, issue 4507)新的
Response.ip_address
属性提供了对产生响应的 IP 地址的访问 (issue 3903, issue 3940)当
allowed_domains
中的值包含端口时,现在会发出警告 (issue 50, issue 3198, issue 4413)Zsh 补全现在会从补全列表中排除已使用的选项别名 (issue 4438)
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)
文档
改进了关于允许信号处理程序返回
Deferred
的信号的文档 (issue 4295, issue 4390)我们的 PyPI 条目现在包含了指向我们的文档、源代码仓库和问题跟踪器的链接 (issue 4456)
在文档中介绍了 curl2scrapy 服务 (issue 4206, issue 4455)
移除了对
Guppy
库的引用,该库仅在 Python 2 中可用 (issue 4285, issue 4343)扩展了对
InterSphinx
的使用,以链接到 Python 3 文档 (issue 4444, issue 4445)添加了对
Sphinx
3.0 及更高版本的支持 (issue 4475, issue 4480, issue 4496, issue 4503)
质量保证
移除了关于使用旧的、已移除设置的警告 (issue 4404)
移除了关于在 Twisted 19.7.0 或更高版本中从
twisted.test.proto_helpers
导入StringTransport
的警告 (issue 4409)移除了过时的 Debian 软件包构建文件 (issue 4384)
移除了将
object
用作基类的用法 (issue 4430)移除了为我们不再支持的 Twisted 旧版本添加支持的代码 (issue 4472)
修复了代码风格问题 (issue 4468, issue 4469, issue 4471, issue 4481)
移除了
twisted.internet.defer.returnValue()
调用 (issue 4443, issue 4446, issue 4489)
Scrapy 2.0.1 (2020-03-18)
Response.follow_all
现在支持将空的 URL 可迭代对象作为输入 (issue 4408, issue 4420)移除了顶层的
reactor
导入,以防止在使用TWISTED_REACTOR
设置不同的 Twisted reactor 时,因安装了错误的 Twisted reactor 而引发错误 (issue 4401, issue 4406)修复了测试 (issue 4422)
Scrapy 2.0.0 (2020-03-03)
亮点
已移除 Python 2 支持
新的
Response.follow_all
方法新的
Response.certificate
属性通过
DNS_RESOLVER
支持 IPv6
向后不兼容的变更
已移除 Python 2 支持,紧随 Python 2 于 2020 年 1 月 1 日结束生命周期 (issue 4091, issue 4114, issue 4115, issue 4121, issue 4138, issue 4231, issue 4242, issue 4304, issue 4309, issue 4373)
重试放弃 (参见
RETRY_TIMES
) 现在记录为错误,而不是调试信息 (issue 3171, issue 3566)LinkExtractor
默认忽略的文件扩展名现在也包括7z
、7zip
、apk
、bz2
、cdr
、dmg
、ico
、iso
、tar
、tar.gz
、webm
和xz
(issue 1837, issue 2067, issue 4066)METAREFRESH_IGNORE_TAGS
设置现在默认为一个空列表,遵循了网页浏览器行为 (issue 3844, issue 4311)HttpCompressionMiddleware
现在在其设置的Accept-Encoding
头的字段值中包含逗号后的空格,遵循了网页浏览器行为 (issue 4293)自定义下载处理器 (参见
DOWNLOAD_HANDLERS
) 或以下下载处理器的子类的__init__
方法不再接收settings
参数scrapy.core.downloader.handlers.datauri.DataURIDownloadHandler
scrapy.core.downloader.handlers.file.FileDownloadHandler
请使用
from_settings
或from_crawler
类方法向您的自定义下载处理器暴露此类参数。我们重构了
scrapy.core.scheduler.Scheduler
类以及相关的队列类 (参见SCHEDULER_PRIORITY_QUEUE
、SCHEDULER_DISK_QUEUE
和SCHEDULER_MEMORY_QUEUE
),以便更容易实现自定义调度器队列类。详情请参见下方的 调度器队列类变更。被覆盖的设置现在以不同的格式记录。这与启动时记录的类似信息更一致 (issue 4199)
已移除的废弃项
Scrapy shell 不再提供 sel 代理对象,请使用
response.selector
代替 (issue 4347)已移除 LevelDB 支持 (issue 4112)
以下函数已从
scrapy.utils.python
中移除:isbinarytext
、is_writable
、setattr_default
、stringify_dict
(issue 4362)
废弃项
使用以
SCRAPY_
为前缀的环境变量来覆盖设置的行为已废弃 (issue 4300, issue 4374, issue 4375)scrapy.linkextractors.FilteringLinkExtractor
已废弃,请使用scrapy.linkextractors.LinkExtractor
代替 (issue 4045)代理 URL 的
noconnect
查询字符串参数已废弃,应从代理 URL 中移除 (issue 4198)的
next
方法scrapy.utils.python.MutableChain
已弃用,请改用全局next()
函数或MutableChain.__next__
(issue 4153)
新特性
添加了对 Python 的 协程语法 的 部分支持 以及对
asyncio
和基于asyncio
的库的 实验性支持(issue 4010, issue 4259, issue 4269, issue 4270, issue 4271, issue 4316, issue 4318)新的
Response.follow_all
方法提供与Response.follow
相同的功能,但支持以可迭代的 URL 作为输入并返回可迭代的请求(issue 2582, issue 4057, issue 4286)媒体管道 现在支持 FTP 存储(issue 3928, issue 3961)
新的
Response.certificate
属性将服务器的 SSL 证书公开为 HTTPS 响应的twisted.internet.ssl.Certificate
对象(issue 2726, issue 4054)新的
DNS_RESOLVER
设置允许启用 IPv6 支持(issue 1031, issue 4227)新的
SCRAPER_SLOT_MAX_ACTIVE_SIZE
设置允许配置现有软限制,该限制在处理的总响应数据过高时暂停请求下载(issue 1410, issue 3551)新的
TWISTED_REACTOR
设置允许自定义 Scrapy 使用的reactor
,从而可以 启用 asyncio 支持 或处理 常见的 macOS 问题(issue 2905, issue 4294)调度器磁盘队列和内存队列现在可以使用类方法
from_crawler
或from_settings
(issue 3884)新的
Response.cb_kwargs
属性作为Response.request.cb_kwargs
的快捷方式(issue 4331)Response.follow
现在支持flags
参数,以便与Request
保持一致(issue 4277, issue 4279)Item loader 处理器 现在可以是普通函数,不再需要是方法(issue 3899)
Rule
现在接受errback
参数(issue 4000)指定
errback
参数时,Request
不再需要callback
参数(issue 3586, issue 4008)LogFormatter
现在支持一些额外的方法download_error
用于下载错误item_error
用于 item pipelines 处理 item 时抛出的异常spider_error
用于 spider 回调 中抛出的异常
的
FEED_URI
设置现在支持pathlib.Path
值(issue 3731, issue 4074)当请求离开下载器时,会发送新的
request_left_downloader
信号(issue 4303)Scrapy 会在检测到使用了
yield
但也返回了值的请求回调或 errback 时记录警告,因为返回的值将会丢失(issue 3484, issue 3869)Spider
对象在没有start_urls
属性或未重写scrapy.spiders.Spider.start_requests()
但有start_url
属性时,现在会引发AttributeError
异常(issue 4133, issue 4170)BaseItemExporter
子类现在可以在其__init__
方法中使用super().__init__(**kwargs)
而不是self._configure(kwargs)
,如果需要,可以将dont_fail=True
传递给父类的__init__
方法,并在调用父类的__init__
方法后通过self._kwargs
访问kwargs
(issue 4193, issue 4370)scrapy.utils.request.request_fingerprint
的新参数keep_fragments
允许为 URL 中带有不同片段的请求生成不同的指纹(issue 4104)下载处理程序(参见
DOWNLOAD_HANDLERS
)现在可以使用其他 Scrapy 组件已经支持的from_settings
和from_crawler
类方法(issue 4126)scrapy.utils.python.MutableChain.__iter__
现在返回self
,允许其用作序列(issue 4153)
错误修复
crawl
命令现在在爬取开始前发生异常时也会以退出码 1 退出(issue 4175, issue 4207)LinkExtractor.extract_links
不再将非 UTF-8 响应中的查询字符串或 URL 重新编码为 UTF-8(issue 998, issue 1403, issue 1949, issue 4321)第一个 spider 中间件(参见
SPIDER_MIDDLEWARES
)现在也处理从生成器回调中引发的异常(issue 4260, issue 4272)现在支持重定向到以三个斜杠(
///
)开头的 URL(issue 4032, issue 4042)Request
不再仅仅因为字符串中包含冒号而接受其作为url
参数(issue 2552, issue 4094)MailSender
中现在使用正确的编码来处理附件名称(issue 4229, issue 4239)RFPDupeFilter
,即默认的DUPEFILTER_CLASS
,在 Windows 上不再在每行写入额外的\r
字符,这避免了在该平台上requests.seen
文件大小不必要地增加(issue 4283)Z shell 自动补全现在查找
.html
文件而不是.http
文件,并涵盖了-h
命令行开关(issue 4122, issue 4291)向未定义
limit
的scrapy.utils.datatypes.LocalCache
对象添加 item 不再引发TypeError
异常(issue 4123)修复了
scrapy.utils.misc.create_instance()
在settings
和crawler
都设置为None
时引发的ValueError
异常消息中的一个拼写错误(issue 4128)
文档
API 文档现在链接到相应的源代码的在线、语法高亮视图(issue 4148)
指向不存在的文档页面的链接现在允许访问侧边栏(issue 4152, issue 4169)
我们文档中的交叉引用现在在悬停时显示工具提示(issue 4173, issue 4183)
改进了关于
LinkExtractor.extract_links
的文档并简化了 链接提取器(issue 4045)澄清了
ItemLoader.item
的工作方式(issue 3574, issue 4099)澄清了在使用
CrawlerProcess
时不应使用logging.basicConfig()
(issue 2149, issue 2352, issue 3146, issue 3960)澄清了使用 持久化 时
Request
对象的要求(issue 4124, issue 4139)澄清了如何安装 自定义图像管道(issue 4034, issue 4252)
修复了 媒体管道 示例中
file_path
方法的签名(issue 4290)涵盖了 Scrapy 1.7.0 中影响自定义
scrapy.core.scheduler.Scheduler
子类的向后不兼容更改(issue 4274)改进了
README.rst
和CODE_OF_CONDUCT.md
文件(issue 4059)文档示例现在作为我们测试套件的一部分进行检查,并且我们修复了一些检测到的问题(issue 4142, issue 4146, issue 4171, issue 4184, issue 4190)
修复了逻辑问题、损坏的链接和拼写错误(issue 4247, issue 4258, issue 4282, issue 4288, issue 4305, issue 4308, issue 4323, issue 4338, issue 4359, issue 4361)
提高了引用对象
__init__
方法时的一致性(issue 4086, issue 4088)修复了 Scrapy 概览 中代码与输出之间的一致性问题(issue 4213)
扩展了
intersphinx
的使用(issue 4147, issue 4172, issue 4185, issue 4194, issue 4197)我们现在使用最新版本的 Python 构建文档(issue 4140, issue 4249)
清理了文档(issue 4143, issue 4275)
质量保证
重新启用了代理
CONNECT
测试(issue 2545, issue 4114)将 Bandit 安全检查添加到我们的测试套件中(issue 4162, issue 4181)
将 Flake8 风格检查添加到我们的测试套件中,并应用了许多相应的更改(issue 3944, issue 3945, issue 4137, issue 4157, issue 4167, issue 4174, issue 4186, issue 4195, issue 4238, issue 4246, issue 4355, issue 4360, issue 4365)
提高了测试覆盖率(issue 4097, issue 4218, issue 4236)
开始报告最慢的测试,并提高了一些测试的性能(issue 4163, issue 4164)
修复了损坏的测试并重构了一些测试(issue 4014, issue 4095, issue 4244, issue 4268, issue 4372)
修改了 tox 配置,允许使用任何 Python 版本运行测试,默认运行 Bandit 和 Flake8 测试,并通过编程方式强制执行最低 tox 版本(issue 4179)
清理了代码(issue 3937, issue 4208, issue 4209, issue 4210, issue 4212, issue 4369, issue 4376, issue 4378)
调度器队列类的更改
以下更改可能会影响所有类型的任何自定义队列类
的
push
方法不再接收包含request.priority * -1
的第二个位置参数。如果您需要该值,请改为从第一个位置参数request
中获取,或在scrapy.core.scheduler.ScrapyPriorityQueue
子类中使用新的priority()
方法。
以下更改可能会影响自定义优先级队列类
在
__init__
方法或from_crawler
或from_settings
类方法中包含工厂函数的参数
qfactory
现在作为名为downstream_queue_cls
的关键字参数传递。添加了一个新的关键字参数:
key
。对于内存队列,它始终是一个空字符串,对于磁盘队列,它表示JOB_DIR
的值。包含前一次抓取数据的磁盘队列参数
startprios
或slot_startprios
现在作为名为startprios
的关键字参数传递。serialize
参数不再传递。磁盘队列类在写入磁盘之前必须自行处理请求序列化,使用scrapy.utils.reqser
模块中的request_to_dict()
和request_from_dict()
函数。
以下更改可能会影响自定义磁盘和内存队列类
__init__
方法的签名现在是__init__(self, crawler, key)
。
以下更改专门影响 scrapy.core.scheduler
模块中的 ScrapyPriorityQueue
和 DownloaderAwarePriorityQueue
类,并可能影响其子类
在
__init__
方法中,上述大部分更改都适用。__init__
仍然可能接收所有参数作为位置参数,但是替换了
qfactory
的downstream_queue_cls
必须以不同的方式实例化。qfactory
是使用一个优先级值(整数)实例化的。downstream_queue_cls
的实例应该使用新的ScrapyPriorityQueue.qfactory
或DownloaderAwarePriorityQueue.pqfactory
方法创建。新的
key
参数将startprios
参数向右移动了 1 位。
已添加以下类属性
crawler
downstream_queue_cls
(详情见上文)key
(详情见上文)
serialize
属性已删除(详情见上文)
以下更改专门影响 ScrapyPriorityQueue
类,并可能影响其子类
添加了一个新的
priority()
方法,该方法给定一个请求,返回request.priority * -1
。它用于
push()
方法,以弥补其priority
参数的移除。spider
属性已删除。请改用crawler.spider
。
以下更改专门影响 DownloaderAwarePriorityQueue
类,并可能影响其子类
新的
pqueues
属性提供了下载器槽名称到相应的downstream_queue_cls
实例的映射。
Scrapy 1.8.4 (2024-02-14)
安全 Bug 修复
由于其 ReDoS 漏洞,
scrapy.utils.iterators.xmliter
已弃用,转而使用xmliter_lxml()
,XMLFeedSpider
现在使用后者。为了最大程度地减少此更改对现有代码的影响,
xmliter_lxml()
现在支持在节点名称中以前缀形式指示节点命名空间,并且在使用 libxml2 2.7+ 时支持处理具有高度嵌套树的大文件。请参阅 cc65-xxvf-f7r9 安全公告 获取更多信息。
DOWNLOAD_MAXSIZE
和DOWNLOAD_WARNSIZE
现在也适用于解压缩后的响应体。请参阅 7j7m-v7m3-jqm7 安全公告 获取更多信息。此外,与 7j7m-v7m3-jqm7 安全公告 相关,不建议使用
scrapy.downloadermiddlewares.decompression
模块,并且会触发警告。重定向到不同域时,
Authorization
头部信息现在会被丢弃。更多信息请参阅 cw9j-q3vf-hrrv 安全通告。
Scrapy 1.8.3 (2022-07-25)
安全错误修复
当
HttpProxyMiddleware
处理带有proxy
元数据的请求,并且该proxy
元数据包含代理凭据时,HttpProxyMiddleware
会设置Proxy-Authorization
头部,但仅在尚未设置该头部时执行此操作。存在第三方代理旋转 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_user
和http_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)
亮点
放弃了对 Python 3.4 的支持并更新了最低要求;正式支持 Python 3.8
新的
Request.from_curl()
类方法新的
ROBOTSTXT_PARSER
和ROBOTSTXT_USER_AGENT
设置新的
DOWNLOADER_CLIENT_TLS_CIPHERS
和DOWNLOADER_CLIENT_TLS_VERBOSE_LOGGING
设置
向后不兼容的更改
不再支持 Python 3.4,Scrapy 的部分最低要求也已更改
cssselect 0.9.1
cryptography 2.0
lxml 3.5.0
pyOpenSSL 16.2.0
queuelib 1.4.2
service_identity 16.0.0
six 1.10.0
Twisted 17.9.0 (16.0.0 with Python 2)
zope.interface 4.1.3
JSONRequest
现在改名为JsonRequest
,以与其他类似类保持一致(issue 3929, issue 3982)如果您使用自定义上下文工厂(
DOWNLOADER_CLIENTCONTEXTFACTORY
),其__init__
方法必须接受两个新参数:tls_verbose_logging
和tls_ciphers
(issue 2111, issue 3392, issue 3442, issue 3450)ItemLoader
现在将其输入 item 的值转换为列表>>> item = MyItem() >>> item["field"] = "value1" >>> loader = ItemLoader(item=item) >>> item["field"] ['value1']
这是为了允许向现有字段添加值(例如
loader.add_value('field', 'value2')
)。(issue 3804, issue 3819, issue 3897, issue 3976, issue 3998, issue 4036)
另请参阅下面的 移除的弃用功能。
新功能
新的
Request.from_curl
类方法允许 从 cURL 命令创建请求 (issue 2985, issue 3862)新的
ROBOTSTXT_PARSER
设置允许选择使用哪个 robots.txt 解析器。它内置支持 RobotFileParser、Protego(默认)、Reppy 和 Robotexclusionrulesparser,并允许您 实现对其他解析器的支持 (issue 754, issue 2669, issue 3796, issue 3935, issue 3969, issue 4006)新的
ROBOTSTXT_USER_AGENT
设置允许定义用于 robots.txt 解析的独立 User Agent 字符串 (issue 3931, issue 3966)Rule
不再需要LinkExtractor
参数 (issue 781, issue 4016)使用新的
DOWNLOADER_CLIENT_TLS_CIPHERS
设置来自定义默认 HTTP/1.1 下载器使用的 TLS/SSL 加密套件 (issue 3392, issue 3442)将新的
DOWNLOADER_CLIENT_TLS_VERBOSE_LOGGING
设置为True
以便在建立 HTTPS 连接后启用关于 TLS 连接参数的调试级别消息 (issue 2111, issue 3450)接收关键字参数的回调(参见
Request.cb_kwargs
)现在可以使用新的@cb_kwargs
spider 合约 进行测试 (issue 3985, issue 3988)当
@scrapes
spider 合约 失败时,现在会报告所有缺失的字段 (issue 766, issue 3939)自定义日志格式 现在可以通过配置的
LOG_FORMATTER
中对应的方法返回None
来丢弃消息 (issue 3984, issue 3987)现已为 Zsh 提供了改进很多的补全定义 (issue 4069)
Bug 修复
ItemLoader.load_item()
不再导致后续调用ItemLoader.get_output_value()
或ItemLoader.load_item()
返回空数据 (issue 3804, issue 3819, issue 3897, issue 3976, issue 3998, issue 4036)修复了
DummyStatsCollector
引发TypeError
异常的问题 (issue 4007, issue 4052)FilesPipeline.file_path
和ImagesPipeline.file_path
不再选择未在 IANA 注册的文件扩展名 (issue 1287, issue 3953, issue 3954)使用 botocore 将文件持久化到 S3 时,现在所有 botocore 支持的头都被正确映射 (issue 3904, issue 3905)
FEED_URI
中包含百分号转义字符的 FTP 密码现在被正确解码 (issue 3941)修复了
scrapy.utils.ssl.get_temp_key_info()
中的内存处理和错误处理问题 (issue 3920)
文档
文档现在涵盖了如何定义和配置 自定义日志格式 (issue 3616, issue 3660)
添加了
MarshalItemExporter
和PythonItemExporter
的 API 文档 (issue 3973)添加了
BaseItem
和ItemMeta
的 API 文档 (issue 3999)细微的文档修复 (issue 2998, issue 3398, issue 3597, issue 3894, issue 3934, issue 3978, issue 3993, issue 4022, issue 4028, issue 4033, issue 4046, issue 4050, issue 4055, issue 4056, issue 4061, issue 4072, issue 4071, issue 4079, issue 4081, issue 4089, issue 4093)
移除的弃用功能
scrapy.xlib
已删除 (issue 4015)
弃用
HttpCacheMiddleware
的 LevelDB 存储后端 (scrapy.extensions.httpcache.LeveldbCacheStorage
) 已弃用 (issue 4085, issue 4092)不建议使用未文档化的
SCRAPY_PICKLED_SETTINGS_TO_OVERRIDE
环境变量 (issue 3910)scrapy.item.DictItem
已弃用,请改用Item
(issue 3999)
其他更改
持续集成测试涵盖的可选 Scrapy 依赖的最低版本已更新
这些可选依赖的较低版本可能可用,但无法保证 (issue 3892)
用于 Bug 报告和功能请求的 GitHub 模板 (issue 3126, issue 3471, issue 3749, issue 3754)
持续集成修复 (issue 3923)
代码清理 (issue 3391, issue 3907, issue 3946, issue 3950, issue 4023, issue 4031)
Scrapy 1.7.4 (2019-10-21)
回退了 issue 3804 的修复(issue 3819),该修复有一些不良副作用(issue 3897, issue 3976)。
因此,当使用一个 item 初始化 item loader 时,ItemLoader.load_item()
会再次导致后续调用 ItemLoader.get_output_value()
或 ItemLoader.load_item()
返回空数据。
Scrapy 1.7.3 (2019-08-01)
对 Python 3.4 强制要求 lxml 4.3.5 或更低版本 (issue 3912, issue 3918)。
Scrapy 1.7.2 (2019-07-23)
修复了 Python 2 支持 (issue 3889, issue 3893, issue 3896)。
Scrapy 1.7.1 (2019-07-18)
对 Scrapy 1.7.0 进行了重新打包,之前的 PyPI 版本缺少一些更改。
Scrapy 1.7.0 (2019-07-18)
注意
请确保安装 Scrapy 1.7.1。PyPI 中的 Scrapy 1.7.0 包是错误的提交标签导致的,不包含下述所有更改。
亮点
针对多域抓取的改进
一种更清晰地将参数传递给回调的方式
用于 JSON 请求的新类
基于规则的 spider 的改进
Feed 导出新功能
向后不兼容的更改
429
现在默认包含在RETRY_HTTP_CODES
设置中此更改具有 向后不兼容性。如果您不想重试
429
,则必须相应地覆盖RETRY_HTTP_CODES
。Crawler
、CrawlerRunner.crawl
和CrawlerRunner.create_crawler
不再接受Spider
子类实例,现在只接受Spider
子类。Spider
子类实例原本就不该工作,而且它们的工作方式也与预期不符:不是使用传入的Spider
子类实例,而是调用其from_crawler
方法来生成新实例。设置
SCHEDULER_PRIORITY_QUEUE
的非默认值可能不再起作用。调度器优先级队列类现在需要处理Request
对象,而不是任意 Python 数据结构。Scheduler
类的__init__
方法添加了一个额外的crawler
参数。不接受任意参数的自定义调度器子类的__init__
方法可能因此更改而中断。更多信息,请参阅
SCHEDULER
。
另请参阅下方的 移除的弃用功能。
新功能
一个新的调度器优先级队列
scrapy.pqueues.DownloaderAwarePriorityQueue
可以启用,以显着改善针对多个 Web 域的爬取任务调度,代价是不支持CONCURRENT_REQUESTS_PER_IP
(issue 3520)一个新的
Request.cb_kwargs
属性提供了一种更简洁的方式来传递关键字参数给回调方法 (issue 1138, issue 3563)一个新的
JSONRequest
类提供了一种更方便的方式来构建 JSON 请求 (issue 3504, issue 3505)传递给
Rule
__init__
方法的process_request
回调现在将发起请求的Response
对象作为其第二个参数接收 (issue 3682)LinkExtractor
__init__
方法添加了一个新的restrict_text
参数,允许按链接文本过滤链接 (issue 3622, issue 3635)一个新的
FEED_STORAGE_S3_ACL
设置允许为导出到 Amazon S3 的 Feed 定义自定义 ACL (issue 3607)一个新的
FEED_STORAGE_FTP_ACTIVE
设置允许对导出到 FTP 服务器的 Feed 使用 FTP 的主动连接模式 (issue 3829)一个新的
METAREFRESH_IGNORE_TAGS
设置允许覆盖在响应中搜索触发重定向的 HTML meta 标签时忽略的 HTML 标签 (issue 1422, issue 3768)一个新的
redirect_reasons
请求 meta 键暴露了每个跟踪的重定向背后的原因(状态码,meta refresh) (issue 3581, issue 3687)在执行
check
命令期间,SCRAPY_CHECK
变量现在被设置为字符串true
,这允许从代码中检测合同检查运行 (issue 3704, issue 3739)一个新的
Item.deepcopy()
方法使得深度复制 Item 更容易 (issue 1493, issue 3671)CoreStats
现在也记录elapsed_time_seconds
(issue 3638)来自
ItemLoader
输入和输出处理器的异常现在更详细 (issue 3836, issue 3840)Crawler
、CrawlerRunner.crawl
和CrawlerRunner.create_crawler
现在在接收到Spider
子类实例而不是子类本身时会优雅地失败 (issue 2283, issue 3610, issue 3872)
Bug 修复
process_spider_exception()
现在也为生成器调用 (issue 220, issue 2061)系统异常(如 KeyboardInterrupt)不再被捕获 (issue 3726)
ItemLoader.load_item()
不再导致后续对ItemLoader.get_output_value()
或ItemLoader.load_item()
的调用返回空数据 (issue 3804, issue 3819)图片管道 (
ImagesPipeline
) 不再忽略以下 Amazon S3 设置:AWS_ENDPOINT_URL
、AWS_REGION_NAME
、AWS_USE_SSL
、AWS_VERIFY
(issue 3625)修复了
scrapy.pipelines.media.MediaPipeline
中的内存泄漏问题,该问题影响例如非 200 响应和自定义中间件中的异常 (issue 3813)带有私有回调的请求现在可以从磁盘中正确反序列化 (issue 3790)
FormRequest.from_response()
现在像主流浏览器一样处理无效方法 (issue 3777, issue 3794)
文档
新增主题 选择动态加载的内容,涵盖了读取动态加载数据的推荐方法 (issue 3703)
宽泛爬取 现在包含了关于内存使用量的信息 (issue 1264, issue 3866)
Rule
的文档现在涵盖了在使用CrawlSpider
时如何访问链接文本 (issue 3711, issue 3712)新增章节 编写自己的存储后端,涵盖了为
HttpCacheMiddleware
编写自定义缓存存储后端的内容 (issue 3683, issue 3692)新增 常见问题 (FAQ) 条目 如何在 Item Pipeline 中将一个 Item 分割成多个 Item?,解释了当你想在 Item Pipeline 中将一个 Item 分割成多个 Item 时应该怎么做 (issue 2240, issue 3672)
更新了关于爬取顺序的常见问题条目,解释了为什么前几个请求很少遵循期望的顺序 (issue 1739, issue 3621)
现在文档中包含了
LOGSTATS_INTERVAL
设置 (issue 3730)、FilesPipeline.file_path
和ImagesPipeline.file_path
方法 (issue 2253, issue 3609),以及Crawler.stop()
方法 (issue 3842)文档中一些令人困惑或产生误导的部分现在更清晰了 (issue 1347, issue 1789, issue 2289, issue 3069, issue 3615, issue 3626, issue 3668, issue 3670, issue 3673, issue 3728, issue 3762, issue 3861, issue 3882)
细微的文档修复 (issue 3648, issue 3649, issue 3662, issue 3674, issue 3676, issue 3694, issue 3724, issue 3764, issue 3767, issue 3791, issue 3797, issue 3806, issue 3812)
移除的弃用功能
以下弃用的 API 已被移除 (issue 3578)
scrapy.conf
(使用Crawler.settings
)从
scrapy.core.downloader.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.selector
和scrapy.selector.lxmlsel
移除HtmlXPathSelector
(使用Selector
)XmlXPathSelector
(使用Selector
)XPathSelector
(使用Selector
)XPathSelectorList
(使用SelectorList
)
从
scrapy.selector.csstranslator
移除ScrapyGenericTranslator
(使用 parsel.csstranslator.GenericTranslator)ScrapyHTMLTranslator
(使用 parsel.csstranslator.HTMLTranslator)ScrapyXPathExpr
(使用 parsel.csstranslator.XPathExpr)
从
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)
SPIDER_MANAGER_CLASS
(使用SPIDER_LOADER_CLASS
)
弃用功能
设置
SCHEDULER_PRIORITY_QUEUE
的值queuelib.PriorityQueue
已被弃用。请改用scrapy.pqueues.ScrapyPriorityQueue
。传递给
Rule
且不接受两个参数的process_request
回调已被弃用。以下模块已被弃用
scrapy.utils.http
(使用 w3lib.http)scrapy.utils.markup
(使用 w3lib.html)scrapy.utils.multipart
(使用 urllib3)
对于 Python 3 代码库,
scrapy.utils.datatypes.MergeDict
类已被弃用。请改用ChainMap
。 (issue 3878)scrapy.utils.gz.is_gzipped
函数已被弃用。请改用scrapy.utils.gz.gzip_magic_number
。
其他变更
现在可以从同一个 tox 环境中并行运行所有测试;文档现在涵盖了这种和其他运行测试的方法 (issue 3707)
现在可以生成 API 文档覆盖率报告 (issue 3806, issue 3810, issue 3860)
文档政策 现在要求 docstrings (issue 3701) 遵循 PEP 257 (issue 3748)
内部修复和清理 (issue 3629, issue 3643, issue 3684, issue 3698, issue 3734, issue 3735, issue 3736, issue 3737, issue 3809, issue 3821, issue 3825, issue 3827, issue 3833, issue 3857, issue 3877)
Scrapy 1.6.0 (2019-01-30)
亮点
更好的 Windows 支持;
Python 3.7 兼容性;
大幅改进的文档,包括将
.extract_first()
+.extract()
API 切换到.get()
+.getall()
API;Feed 导出、FilePipeline 和 MediaPipeline 改进;
更好的可扩展性:
item_error
和request_reached_downloader
信号;Feed 导出器、Feed 存储和去重过滤器支持from_crawler
。scrapy.contracts
修复和新功能;Telnet 控制台安全改进,首次作为向后兼容版本发布在 Scrapy 1.5.2 (2019-01-22) 中;
清理了弃用代码;
代码库中的各种 bug 修复、小新功能和可用性改进。
Selector API 变更
虽然这些不是 Scrapy 本身的变更,而是 Scrapy 用于 xpath/css Selector 的 parsel 库中的变更,但值得在此提及。Scrapy 现在依赖于 parsel >= 1.5,并且 Scrapy 文档已更新以遵循最近的 parsel
API 约定。
最明显的改变是,现在推荐使用 .get()
和 .getall()
Selector 方法,而不是 .extract_first()
和 .extract()
。我们认为这些新方法能写出更简洁、更易读的代码。有关更多详细信息,请参阅 extract() 和 extract_first()。
注意
目前没有计划弃用 .extract()
和 .extract_first()
方法。
另一个有用的新特性是引入了 Selector.attrib
和 SelectorList.attrib
属性,它们使得获取 HTML 元素的属性更加容易。详情请参阅 选择元素属性。
CSS 选择器在 parsel >= 1.5 版本中会被缓存,这使得当多次使用相同的 CSS 路径时速度更快。这在 Scrapy 爬虫中非常常见:回调函数通常会在不同的页面上被多次调用。
如果您正在使用自定义的 Selector
或 SelectorList
子类,parsel 中的一项向后不兼容的变更可能会影响您的代码。详细说明以及完整的改进列表,请参阅 parsel 更新日志。
Telnet 控制台
向后不兼容:Scrapy 的 telnet 控制台现在需要用户名和密码。更多详情请参阅 Telnet 控制台。此更改修复了一个安全问题;详情请参阅 Scrapy 1.5.2 (2019-01-22) 发布说明。
新的扩展特性
feed 导出器和 feed 存储器添加了
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 特性
为 S3FilesStore 暴露更多选项:
AWS_ENDPOINT_URL
、AWS_USE_SSL
、AWS_VERIFY
、AWS_REGION_NAME
。例如,这允许使用替代的或自托管的 AWS 兼容提供商(issue 2609, issue 3548)。支持 Google Cloud Storage 的 ACL:
FILES_STORE_GCS_ACL
和IMAGES_STORE_GCS_ACL
(issue 3199)。
scrapy.contracts
改进
合约代码中的异常处理得到改进(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.follow
中url
参数的验证(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)
文档改进
文档已重写,建议使用 .get/.getall API 而非 .extract/.extract_first。此外,选择器 文档已更新并重新组织,以匹配最新的 parsel 文档;它们现在包含更多主题,例如 选择元素属性 或 CSS 选择器扩展(issue 3390)。
使用浏览器开发者工具进行抓取 是一个新教程,取代了旧的 Firefox 和 Firebug 教程(issue 3400)。
SCRAPY_PROJECT 环境变量已加入文档(issue 3518);
安装说明中增加了故障排除部分(issue 3517);
改进了教程中指向初学者资源的链接(issue 3367, issue 3468);
修复了文档中
RETRY_HTTP_CODES
的默认值(issue 3335);从文档中移除了未使用的
DEPTH_STATS
选项(issue 3245);其他清理工作(issue 3347, issue 3350, issue 3445, issue 3544, issue 3605)。
移除弃用项
移除 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.overrides
和Settings.defaults
属性(issue 3327, issue 3359)。
其他改进和清理
所有 Scrapy 测试现在在 Windows 上通过;Scrapy 测试套件在 CI 的 Windows 环境中执行(issue 3315)。
支持 Python 3.7(issue 3326, issue 3150, issue 3547)。
测试和 CI 修复(issue 3526, issue 3538, issue 3308, issue 3311, issue 3309, issue 3305, issue 3210, issue 3299)
scrapy.http.cookies.CookieJar.clear
接受可选参数 "domain"、"path" 和 "name"(issue 3231)。sdist 中包含附加文件(issue 3495);
代码风格修复(issue 3405, issue 3304);
移除不必要的 .strip() 调用(issue 3519);
MiddlewareManager 方法使用 collections.deque 存储而非列表(issue 3476)
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)
这是一个维护版本,包含重要的错误修复,但不包含新特性
修复了影响 Python 3 和 PyPy 的 O(N^2) gzip 解压缩问题(issue 3281);
改进了跳过 TLS 验证错误的处理(issue 3166);
修复了 Python 3.5+ 中的 Ctrl-C 处理问题(issue 3096);
测试修复(issue 3092, issue 3263);
文档改进(issue 3058, issue 3059, issue 3089, issue 3123, issue 3127, issue 3189, issue 3224, issue 3280, issue 3279, issue 3201, issue 3260, issue 3284, issue 3298, issue 3294)。
Scrapy 1.5.0 (2017-12-29)
此版本带来了一些小的新特性和改进,遍布整个代码库。一些亮点包括:
FilesPipeline 和 ImagesPipeline 支持 Google Cloud Storage。
使用代理服务器进行爬取变得更高效,因为现在可以重用代理连接。
警告、异常和日志消息得到改进,使调试更容易。
scrapy parse
命令现在允许通过--meta
参数设置自定义的 request meta。改进了对 Python 3.6、PyPy 和 PyPy3 的兼容性;现在通过在 CI 上运行测试,官方支持 PyPy 和 PyPy3。
更好地默认处理 HTTP 308、522 和 524 状态码。
文档照例得到改进。
向后不兼容的更改
Scrapy 1.5 不再支持 Python 3.3。
默认的 Scrapy User-Agent 现在使用指向 scrapy.org 的 https 链接(issue 2983)。这在技术上是向后不兼容的;如果您依赖于旧值,请覆盖
USER_AGENT
。修复了被
custom_settings
覆盖的设置的日志记录;这在技术上是向后不兼容的,因为记录器从[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_CODES
(issue 2851)启动时记录版本信息(issue 2857)
scrapy.mail.MailSender
现在在 Python 3 中工作(需要 Twisted 17.9.0)重用代理服务器的连接(issue 2743)
添加下载器中间件模板(issue 2755)
未定义 parse 回调时,为 NotImplementedError 提供明确消息(issue 2831)
CrawlerProcess 获得了禁用安装根日志处理程序的选项(issue 2921)
LinkExtractor 现在默认忽略
m4v
扩展名对于超过
DOWNLOAD_WARNSIZE
和DOWNLOAD_MAXSIZE
限制的响应,提供更好的日志消息(issue 2927)当将 URL 放到
Spider.allowed_domains
而非域名时显示警告(issue 2250)。
错误修复
修复被
custom_settings
覆盖的设置的日志记录;这在技术上是向后不兼容的,因为记录器从[scrapy.utils.log]
更改为[scrapy.crawler]
,因此如有需要请更新您的日志解析器(issue 1343)默认的 Scrapy User-Agent 现在使用指向 scrapy.org 的 https 链接(issue 2983)。这在技术上是向后不兼容的;如果您依赖于旧值,请覆盖
USER_AGENT
。修复 PyPy 和 PyPy3 测试失败,官方支持它们(issue 2793, issue 2935, issue 2990, issue 3050, issue 2213, issue 3048)
修复
DNSCACHE_ENABLED=False
时的 DNS 解析器(issue 2811)为 Debian Jessie tox 测试环境添加
cryptography
(issue 2848)添加验证以检查 Request 回调是否可调用(issue 2766)
将
extras/qpsclient.py
移植到 Python 3(issue 2849)在 Python 3 后台使用 getfullargspec 以停止 DeprecationWarning(issue 2862)
更新弃用的测试别名(issue 2876)
修复
SitemapSpider
对 alternate links 的支持(issue 2853)
文档
为
AUTOTHROTTLE_TARGET_CONCURRENCY
设置添加了缺失的要点(issue 2756)更新贡献文档,记录新的支持渠道(issue 2762, issue:3038)
在文档中包含对 Scrapy subreddit 的引用
修复损坏的链接;外部链接使用
https://
(issue 2978, issue 2982, issue 2958)更好地记录 CloseSpider 扩展(issue 2759)
在 MongoDB 示例中使用
pymongo.collection.Collection.insert_one()
(issue 2781)拼写错误和打字错误(issue 2828, issue 2837, issue 2884, issue 2924)
澄清
CSVFeedSpider.headers
文档(issue 2826)记录
DontCloseSpider
异常并澄清spider_idle
(issue 2791)更新 README 中的“发布”部分(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_USER
和 FTP_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=False
(issue 2537,修复了 issue 1941 和 issue 1982):警告,这在技术上是向后不兼容的默认启用 memusage 扩展(issue 2539,修复了 issue 2187);这在技术上是向后不兼容的,因此请检查您是否设置了任何非默认的
MEMUSAGE_***
选项。EDITOR
环境变量现在优先于EDITOR
选项在 settings.py 中定义的值 (issue 1829);Scrapy 的默认设置不再依赖于环境变量。这在技术上是向后不兼容的更改。Spider.make_requests_from_url
已被废弃 (issue 1728,修复了 issue 1495)。
新特性
在
proxy
请求元键中接受代理凭据 (issue 2526)支持 brotli-压缩 的内容;需要可选的 brotlipy 库 (issue 2535)
新增用于创建请求的 response.follow 快捷方式 (issue 1940)
为
Request
对象添加了flags
参数和属性 (issue 2047)支持匿名 FTP (issue 2342)
为
RetryMiddleware
添加了retry/count
、retry/max_reached
和retry/reason_count/<reason>
统计信息 (issue 2543)为
HttpErrorMiddleware
添加了httperror/response_ignored_count
和httperror/response_ignored_status_count/<status>
统计信息 (issue 2566)在
RefererMiddleware
中可自定义Referrer 策略
(issue 2306)新增
data:
URI 下载处理器 (issue 2334,修复了 issue 2156)使用 HTTP Cache 时记录缓存目录 (issue 2611,修复了 issue 2604)
当项目包含重复的 spider 名称时警告用户 (修复了 issue 2181)
scrapy.utils.datatypes.CaselessDict
现在接受Mapping
实例,而不仅限于 dicts (issue 2646)媒体下载,通过
FilesPipeline
或ImagesPipeline
,现在可以使用新的MEDIA_ALLOW_REDIRECTS
设置可选地处理 HTTP 重定向 (issue 2616,修复了 issue 2004)使用新的
DOWNLOAD_FAIL_ON_DATALOSS
设置接受来自网站的不完整响应 (issue 2590,修复了 issue 2586)通过
FEED_EXPORT_INDENT
设置可选地漂亮打印 JSON 和 XML item (issue 2456,修复了 issue 1327)当传递
None
值时,允许在FormRequest.from_response
的 formdata 中丢弃字段 (issue 667)使用新的
max_retry_times
元键进行单请求重试次数控制 (issue 2642)python -m scrapy
作为scrapy
命令更明确的替代方式 (issue 2740)
错误修复
LinkExtractor 现在会剥离属性的前导和尾随空格 (issue 2547,修复了 issue 1614)
在
FormRequest
中正确处理 action 属性中的空格 (issue 2548)从代理缓冲 CONNECT 响应字节,直到接收到所有 HTTP 头部 (issue 2495,修复了 issue 2491)
FTP 下载器现在可以在 Python 3 上工作,前提是使用 Twisted>=17.1 (issue 2599)
解压内容后使用 body 选择响应类型 (issue 2393,修复了 issue 2145)
总是在
HttpCompressionMiddleware
阶段解压Content-Encoding: gzip
(issue 2391)在
Spider.custom_settings
中尊重自定义日志级别 (issue 2581,修复了 issue 1612)修复 macOS 上的“make htmlview” (issue 2661)
从命令列表中移除“commands” (issue 2695)
修复 POST 请求空 body 时重复的 Content-Length 头部 (issue 2677)
正确取消大型下载,即超过
DOWNLOAD_MAXSIZE
的下载 (issue 1616)ImagesPipeline: 修复了带调色板的透明 PNG 图像处理问题 (issue 2675)
清理与重构
测试:移除临时文件和文件夹 (issue 2570),修复了 macOS 上的 ProjectUtilsTest (issue 2569),在 Travis CI 的 Linux 上使用便携式 pypy (issue 2710)
在 CrawlSpider 中将请求构建从
_requests_to_follow
分离 (issue 2562)移除“Python 3 progress”徽章 (issue 2567)
向
.gitignore
添加更多行 (issue 2557)移除 bumpversion 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)
文档
导出器需要二进制模式 (issue 2564,修复了 issue 2553)
提及由于 lxml 中的错误导致
FormRequest.from_response()
存在的问题 (issue 2572)在模板中统一使用单引号 (issue 2596)
文档化
ftp_user
和ftp_password
元键 (issue 2587)移除关于已废弃
contrib/
的章节 (issue 2636)在 Windows 上安装 Scrapy 时推荐使用 Anaconda (issue 2477,修复了 issue 2475)
FAQ: 重写关于 Windows 上 Python 3 支持的说明 (issue 2690)
重新组织选择器章节 (issue 2705)
从
SelectorList
文档中移除__nonzero__
(issue 2683)在
DUPEFILTER_CLASS
设置的文档中提及如何禁用请求过滤 (issue 2714)在 docs setup readme 中添加 sphinx_rtd_theme (issue 2668)
在 JSON item writer 示例中以文本模式打开文件 (issue 2729)
澄清
allowed_domains
示例 (issue 2670)
Scrapy 1.3.3 (2017-03-10)
错误修复
默认情况下,使
SpiderLoader
再次因缺失依赖和错误的SPIDER_MODULES
而引发ImportError
。自 1.3.0 以来,这些异常被作为警告静默处理。现在引入了一个新设置来在需要时切换警告或异常;详情请参阅SPIDER_LOADER_WARN_ONLY
。
Scrapy 1.3.2 (2017-02-13)
错误修复
在转换为/从 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_MIDDLEWARES
、DOWNLOADER_MIDDLEWARES
、EXTENSIONS
和SPIDER_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.client
和 twisted.internet.endpoints
。(另见下面的清理部分。)
由于这是一个重大更改,我们希望在不影响使用 1.2 系列的项目的情况下快速发布此错误修复。
新特性
MailSender
现在接受单个字符串作为to
和cc
参数的值 (issue 2272)scrapy fetch url
、scrapy shell url
和 Scrapy shell 内部的fetch(url)
现在默认遵循 HTTP 重定向 (issue 2290);详情请参阅fetch
和shell
。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)
文档
文档化
Request
的meta
字典中的"download_latency"
键 (issue 2033)从目录中移除关于 (已废弃且不受支持的) Ubuntu 软件包的页面 (issue 2335)
修复了一些错别字 (issue 2346, issue 2369, issue 2369, issue 2380) 和澄清 (issue 2354, issue 2325, issue 2414)
其他更改
宣传 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
不再允许同时传递response
和text
(issue 2153)。修复了使用
scrapy parse
时日志记录了错误的 callback 名称的问题 (issue 2169)。修复了一个奇怪的 gzip 解压错误 (issue 1606)。
修复了将
CrawlSpider
与scrapy parse
一起使用时,选定 callbacks 的问题 (issue 2225)。修复了当 spider 没有产生任何 item 时,JSON 和 XML 文件无效的问题 (issue 872)。
为
StreamLogger
实现了flush()
方法,避免了日志中的警告 (issue 2125)。
重构
canonicalize_url
已移至 w3lib.url (issue 2168)。
测试与要求
Scrapy 的新最低要求基准是 Debian 8 “Jessie”。之前是 Ubuntu 12.04 Precise。这在实践中意味着我们将持续集成测试运行在这些(主要)软件包的最低版本上:Twisted 14.0, pyOpenSSL 0.14, lxml 3.4。
Scrapy 很可能仍然可以在这些软件包的旧版本上工作(例如,代码库仍然保留了对旧版本 Twisted 的兼容开关),但不再保证(因为它不再进行测试)。
文档
语法修复:issue 2128, issue 1566。
从 README 中移除了下载统计徽章 (issue 2160)。
新的 Scrapy 架构图 (issue 2165)。
更新了
Response
参数文档 (issue 2197)。重写了易产生误解的
RANDOMIZE_DOWNLOAD_DELAY
描述 (issue 2190)。将 StackOverflow 添加为支持渠道 (issue 2257)。
Scrapy 1.1.4 (2017-03-03)
打包修复:在 setup.py 中禁止不受支持的 Twisted 版本。
Scrapy 1.1.3 (2016-09-22)
错误修复
ImagesPipeline
和FilesPipeline
子类的类属性现在像 1.1.1 之前一样工作 (issue 2243, 修复了 issue 2198)。
文档
概览和教程重写,以使用 http://toscrape.com 网站 (issue 2236, issue 2249, issue 2252)。
Scrapy 1.1.2 (2016-08-18)
错误修复
引入了缺失的
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
) 的一些修复。不解码 HEAD 响应 (issue 2008, 修复了 issue 1899)。
处理 gzip Content-Type 头部中的 charset 参数 (issue 2050, 修复了 issue 2049)。
不解压 gzip octet-stream 响应 (issue 2065, 修复了 issue 2063)。
捕获(并发出警告忽略)针对 IP 地址主机验证证书时的异常 (issue 2094, 修复了 issue 2092)。
重新使
FilesPipeline
和ImagesPipeline
在使用遗留类属性进行自定义方面向后兼容 (issue 1989, 修复了 issue 1985)。
新功能
允许在项目文件夹外使用 genspider 命令 (issue 2052)。
默认重试 HTTPS CONNECT
TunnelError
(issue 1974)。
文档
FEED_TEMPDIR
设置按字母顺序排序 (commit 9b3c72c)。在概览中使用更地道的
.extract_first()
(issue 1994)。更新版权声明中的年份 (commit c2c8036)。
添加了关于 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 支持。
热门新功能
Item loaders 现在支持嵌套 loader (issue 1467)。
FormRequest.from_response
改进 (issue 1382, issue 1137)。添加了
AUTOTHROTTLE_TARGET_CONCURRENCY
设置并改进了 AutoThrottle 文档 (issue 1324)。添加了
response.text
以将 body 获取为 unicode (issue 1730)。匿名 S3 连接 (issue 1358)。
下载器中间件中的 Deferred (issue 1473)。这使得更好地处理 robots.txt 成为可能 (issue 1471)。
HTTP 缓存现在更严格遵循 RFC2616,添加了设置
HTTPCACHE_ALWAYS_STORE
和HTTPCACHE_IGNORE_RESPONSE_CACHE_CONTROLS
(issue 1151)。Selectors 已提取到 parsel 库 (issue 1409)。这意味着您可以在不使用 Scrapy 的情况下使用 Scrapy Selectors,并且无需升级 Scrapy 即可升级选择器引擎。
HTTPS 下载器现在默认进行 TLS 协议协商,而不是强制使用 TLS 1.0。您还可以使用新的
DOWNLOADER_CLIENT_TLS_METHOD
设置 SSL/TLS 方法。
这些错误修复可能需要您注意
默认情况下不重试错误请求(HTTP 400)(issue 1289)。如果您需要旧的行为,请将
400
添加到RETRY_HTTP_CODES
。修复了 shell 处理文件参数的问题 (issue 1710, issue 1550)。如果您尝试
scrapy shell index.html
,它将尝试加载 URLhttp://index.html
,请使用scrapy shell ./index.html
来加载本地文件。新创建的项目默认启用 robots.txt 遵从 (issue 1724)。Scrapy 在继续抓取之前会等待 robots.txt 下载完成 (issue 1735)。如果您想禁用此行为,请在创建新项目后更新
settings.py
文件中的ROBOTSTXT_OBEY
设置。Exporter 现在默认处理 unicode,而不是 bytes (issue 1080)。如果您使用
PythonItemExporter
,您可能需要更新您的代码以禁用已弃用的二进制模式。接受包含点的 XML 节点名称作为有效名称 (issue 1533)。
使用
FilesPipeline
或ImagesPipeline
上传文件或图像到 S3 时,默认 ACL 策略现在是“private”而不是“public”警告:不向后兼容!。您可以使用FILES_STORE_S3_ACL
来更改它。我们重新实现了
canonicalize_url()
函数,以获得更正确的输出,特别是对于包含非 ASCII 字符的 URL (issue 1947)。这可能会改变链接提取器的输出与之前 Scrapy 版本的对比。这也可能导致您从 1.1 版本之前运行中保留的一些缓存条目失效。警告:不向后兼容!。
继续阅读以获取更多关于其他改进和错误修复的详细信息。
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 控制台。
其他新功能和增强功能
Scrapy 现在有了行为准则 (issue 1681)。
命令行工具现在支持 zsh 补全 (issue 934)。
对
scrapy shell
的改进支持 bpython 并通过
SCRAPY_PYTHON_SHELL
配置首选 Python shell (issue 1100, issue 1444)。支持没有 scheme 的 URL (issue 1498) 警告:不向后兼容!
重新支持相对文件路径 (issue 1710, issue 1550)。
添加了
MEMUSAGE_CHECK_INTERVAL_SECONDS
设置以更改默认检查间隔 (issue 1282)。下载处理器现在在使用其 scheme 的第一个请求时延迟加载 (issue 1390, issue 1421)。
HTTPS 下载处理器不再强制使用 TLS 1.0;而是使用 OpenSSL 的
SSLv23_method()/TLS_method()
,从而可以尝试与远程主机协商它支持的最高 TLS 协议版本 (issue 1794, issue 1629)。RedirectMiddleware
现在会跳过 spider 属性或Request
的meta
键中handle_httpstatus_list
的状态码 (issue 1334, issue 1364, issue 1447)。表单提交
现在也支持
<button>
元素 (issue 1469)。对于没有值的提交按钮,现在使用空字符串 (issue 1472)。
字典式设置现在具有每个键的优先级 (issue 1135, issue 1149 和 issue 1586)。
发送非 ASCII 电子邮件 (issue 1662)。
如果没有设置相关配置,
CloseSpider
和SpiderState
扩展现在会被禁用 (issue 1723, issue 1725)。添加了方法
ExecutionEngine.close
(issue 1423)。添加了方法
CrawlerRunner.create_crawler
(issue 1528)。现在可以通过
SCHEDULER_PRIORITY_QUEUE
自定义调度器优先级队列 (issue 1822)。链接提取器现在默认忽略
.pps
链接 (issue 1835)。FTP 和 S3 feed 存储的临时数据文件夹可以使用新的
FEED_TEMPDIR
设置进行自定义 (issue 1847)。FilesPipeline
和ImagesPipeline
的设置现在是实例属性而不是类属性,从而可以实现特定于 spider 的行为 (issue 1891)。JsonItemExporter
现在将开方括号和闭方括号格式化到单独的行(输出文件的第一行和最后一行)(issue 1950)。如果可用,将使用
botocore
来处理S3FeedStorage
,S3DownloadHandler
和S3FilesStore
(issue 1761, issue 1883)。大量文档更新和相关修复 (issue 1291, issue 1302, issue 1335, issue 1683, issue 1660, issue 1642, issue 1721, issue 1727, issue 1879)。
其他重构、优化和清理 (issue 1476, issue 1481, issue 1477, issue 1315, issue 1290, issue 1750, issue 1881)。
弃用和移除
添加了
to_bytes
和to_unicode
函数,弃用了str_to_unicode
和unicode_to_str
函数 (issue 778)。引入了
binary_is_text
函数,取代了isbinarytext
的使用(但返回值是相反的)(issue 1851)。optional_features
集合已被移除 (issue 1359)。--lsprof
命令行选项已被移除 (issue 1689)。警告:不向后兼容,但不会破坏用户代码。以下数据类型已被弃用 (issue 1720):
scrapy.utils.datatypes.MultiValueDictKeyError
scrapy.utils.datatypes.MultiValueDict
scrapy.utils.datatypes.SiteNode
之前捆绑的
scrapy.xlib.pydispatch
库已被弃用,并由 pydispatcher 替换。
位置变更
telnetconsole
已被移至extensions/
(issue 1524)。注意:telnet 在 Python 3 上未启用 (https://github.com/scrapy/scrapy/pull/1524#issuecomment-146985595)。
错误修复
Scrapy 不再重试收到
HTTP 400 Bad Request
响应的请求 (issue 1289)。警告:不向后兼容!支持 http_proxy 配置的空密码 (issue 1274)。
将
application/x-json
解析为TextResponse
(issue 1333)。支持具有多个值的链接 rel 属性 (issue 1201)。
修复了存在
<base>
标签时scrapy.FormRequest.from_response
的问题 (issue 1564)。修复了
TEMPLATES_DIR
处理问题 (issue 1575)。各种
FormRequest
修复 (issue 1595, issue 1596, issue 1597)。使
_monkeypatches
更健壮 (issue 1634)。修复了
XMLItemExporter
处理 item 中非字符串字段的 bug (issue 1738)。修复了 macOS 中的 startproject 命令问题 (issue 1635)。
修复了
PythonItemExporter
和 CSVExporter 处理非字符串 item 类型的问题 (issue 1737)。各种日志相关修复 (issue 1294, issue 1419, issue 1263, issue 1624, issue 1654, issue 1722, issue 1726 和 issue 1303)。
修复了
utils.template.render_templatefile()
中的 bug (issue 1212)。从
robots.txt
提取 sitemap 现在不区分大小写 (issue 1902)。当使用多个代理连接到同一个远程主机时,HTTPS+CONNECT 隧道可能会混淆 (issue 1912)。
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)
FIX:[Backport] LinkExtractors 忽略无效链接 (修复了 issue 907, commit 108195e)。
TST:更改了 buildbot makefile 以使用 ‘pytest’ (commit 1f3d90a)。
DOC:修复了教程和媒体管道中的拼写错误 (commit 808a9ea 和 commit 803bd87)。
DOC:在 settings 文档中将 AjaxCrawlMiddleware 添加到
DOWNLOADER_MIDDLEWARES_BASE
(commit aa94121)。
Scrapy 1.0.4 (2015-12-30)
根据 Twisted 版本忽略 xlib/tx 文件夹。(commit 7dfa979)。
在新的 travis-ci 基础设施上运行 (commit 6e42f0b)。
拼写修复 (commit 823a1cc)。
在 xmliter 正则表达式中转义节点名称 (commit da3c155)。
测试带有点的 xml 节点名称 (commit 4418fc3)。
TST 在测试中不使用损坏的 Pillow 版本。关闭 #1426 (commit a55078c)。
在 version 命令上禁用日志。关闭 #1426 (commit 86fc330)。
在 startproject 命令上禁用日志 (commit db4c9fe)。
添加 PyPI 下载统计徽章 (commit df2b944)。
如果 PR 是从 scrapy/scrapy 分支创建的,则不在 Travis 上运行两次测试 (commit a83ab41)。
将 Python 3 移植状态徽章添加到 README (commit 73ac80d)。
修复了 RFPDupeFilter 持久化问题 (commit 97d080e)。
TST 添加了一个测试以表明 dupefilter 持久化不起作用 (commit 97f2fb3)。
在 file:// scheme 处理器上显式关闭文件 (commit d9b4850)。
在 shell 中禁用 dupefilter (commit c0d0734)。
DOC:为侧边栏中显示的 toctree 添加标题 (commit aa239ad)。
DOC:从安装说明中移除了 pywin32,因为它已被声明为依赖项。(commit 10eb400)。
添加了关于在 Windows 和其他操作系统上使用 Conda 安装的说明。(commit 1c3600a)。
修复了细微的语法问题。(commit 7f4ddd5)。
修复了文档中的一个拼写错误。(commit b71f677)。
版本 1 现在存在了 (commit 5456c0e)。
修复另一个无效的 xpath 错误 (commit 0a1366e)
修复 selectors.rst 中 ValueError: Invalid XPath: //div/[id=”not-exists”]/text() 错误 (commit ca8d60f)
修正拼写错误 (commit 7067117)
修复 downloader-middleware.rst 和 exceptions.rst 中的拼写错误,middlware -> middleware (commit 32f115c)
在 Ubuntu 安装部分添加关于 Debian 兼容性的说明 (commit 23fda69)
将 macOS 替代安装的变通方法替换为 virtualenv (commit 98b63ee)
引用 Homebrew 的主页以获取安装说明 (commit 1925db1)
在贡献文档中添加支持的最旧 tox 版本 (commit 5d10d6d)
在安装文档中说明 pip 已包含在 python>=2.7.9 中 (commit 85c980e)
在文档的 Ubuntu 安装部分添加非 Python 依赖项 (commit fbd010d)
在文档中添加 macOS 安装部分 (commit d8f4cba)
文档(增强):显式指定 rtd 主题路径 (commit de73b1a)
次要:修正 scrapy.Spider 文档语法 (commit 1ddcc7b)
使通用实践示例代码与注释匹配 (commit 1b85bcf)
nextcall 重复调用 (心跳机制)。(commit 55f7104)
回迁修复与 Twisted 15.4.0 的兼容性问题 (commit b262411)
将 pytest 固定到 2.7.3 (commit a6535c2)
合并 pull request #1512 来自 mgedmin/patch-1 (commit 8876111)
合并 pull request #1513 来自 mgedmin/patch-2 (commit 5d4daf8)
拼写错误 (commit f8d0682)
修复列表格式 (commit 5f83a93)
修复 queuelib 最近更改后 Scrapy squeue 测试的问题 (commit 3365c01)
合并 pull request #1475 来自 rweindl/patch-1 (commit 2d688cd)
更新 tutorial.rst (commit fbc1f25)
合并 pull request #1449 来自 rhoekman/patch-1 (commit 7d6538c)
小幅语法修改 (commit 8752294)
将 openssl 版本添加到 version 命令 (commit 13c45ac)
Scrapy 1.0.3 (2015-08-11)
将 service_identity 添加到 Scrapy 的 install_requires (commit cbc2501)
travis#296 的变通方法 (commit 66af9cd)
Scrapy 1.0.2 (2015-08-06)
Twisted 15.3.0 在序列化 lambda 函数时不再引发 PicklingError (commit b04dd7d)
小幅方法名称修复 (commit 6f85c7f)
次要:修正 scrapy.Spider 语法和清晰度 (commit 9c9d2e0)
在 CONTRIBUTING 中放入关于支持渠道的简短说明 (commit c63882b)
修复拼写错误 (commit a9ae7b0)
修复文档引用。(commit 7c8a4fe)
Scrapy 1.0.1 (2015-07-01)
在传递给 FTPClient 之前取消引用请求路径,它已经转义了路径 (commit cc00ad2)
在 MANIFEST.in 中将 tests/ 包含到源分发包中 (commit eca227e)
文档:修复 SelectJmes 文档 (commit b8567bc)
文档:将 Ubuntu 和 Archlinux 移出 Windows 小节 (commit 392233f)
文档:移除 Ubuntu 包的版本后缀 (commit 5303c66)
文档:更新 1.0 版本的发布日期 (commit c89fa29)
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.contrib
和 scrapy.contrib_exp
合并到顶级包中。内部迁移保留了向后兼容性,同时导入已弃用的模块会收到指示其新位置的警告。
完整的迁移列表
外包包
注意
这些扩展经历了一些小的更改,例如一些设置名称发生了变化。请查看每个新存储库中的文档以熟悉新的用法。
旧位置 |
新位置 |
---|---|
scrapy.commands.deploy |
scrapyd-client (在此处查看其他替代方案:部署 Spider) |
scrapy.contrib.djangoitem |
|
scrapy.webservice |
scrapy.contrib_exp
和 scrapy.contrib
合并
旧位置 |
新位置 |
---|---|
scrapy.contrib_exp.downloadermiddleware.decompression |
scrapy.downloadermiddlewares.decompression |
scrapy.contrib_exp.iterators |
scrapy.utils.iterators |
scrapy.contrib.downloadermiddleware |
scrapy.downloadermiddlewares |
scrapy.contrib.exporter |
scrapy.exporters |
scrapy.contrib.linkextractors |
scrapy.linkextractors |
scrapy.contrib.loader |
scrapy.loader |
scrapy.contrib.loader.processor |
scrapy.loader.processors |
scrapy.contrib.pipeline |
scrapy.pipelines |
scrapy.contrib.spidermiddleware |
scrapy.spidermiddlewares |
scrapy.contrib.spiders |
scrapy.spiders |
|
scrapy.extensions.* |
复数命名更改和模块统一
旧位置 |
新位置 |
---|---|
scrapy.command |
scrapy.commands |
scrapy.dupefilter |
scrapy.dupefilters |
scrapy.linkextractor |
scrapy.linkextractors |
scrapy.spider |
scrapy.spiders |
scrapy.squeue |
scrapy.squeues |
scrapy.statscol |
scrapy.statscollectors |
scrapy.utils.decorator |
scrapy.utils.decorators |
类名更改
旧位置 |
新位置 |
---|---|
scrapy.spidermanager.SpiderManager |
scrapy.spiderloader.SpiderLoader |
设置名更改
旧位置 |
新位置 |
---|---|
SPIDER_MANAGER_CLASS |
SPIDER_LOADER_CLASS |
更新日志
新功能和增强
Python 日志记录 (issue 1060, issue 1235, issue 1236, issue 1240, issue 1259, issue 1278, issue 1286)
FEED_EXPORT_FIELDS 选项 (issue 1159, issue 1224)
DNS 缓存大小和超时选项 (issue 1132)
在 xmliter_lxml 中支持命名空间前缀 (issue 963)
Reactor 线程池最大大小设置 (issue 1123)
允许 spider 返回字典。(issue 1081)
添加 Response.urljoin() 助手方法 (issue 1086)
在 ~/.config/scrapy.cfg 中查找用户配置 (issue 1098)
处理 TLS SNI (issue 1101)
Selectorlist extract first 方法 (issue 624, issue 1145)
添加 JmesSelect (issue 1016)
为 filesystem http 缓存后端添加 gzip 压缩 (issue 1020)
Link extractors 支持 CSS (issue 983)
httpcache dont_cache meta #19 #689 (issue 821)
添加请求被调度器丢弃时发送的信号 (issue 961)
避免下载大型响应 (issue 946)
允许在 CSVFeedSpider 中指定引用字符 (issue 882)
在“Spider error processing”日志消息中添加 referer (issue 795)
只处理一次 robots.txt (issue 896)
GSoC 每个 spider 的设置 (issue 854)
添加项目名称验证 (issue 817)
GSoC API 清理 (issue 816, issue 1128, issue 1147, issue 1148, issue 1156, issue 1185, issue 1187, issue 1258, issue 1268, issue 1276, issue 1285, issue 1284)
提高 IO 操作的响应性 (issue 1074 和 issue 1075)
在关闭时对 httpcache 进行 leveldb 压缩 (issue 1297)
废弃和移除
弃用 htmlparser link extractor (issue 1205)
从 FeedExporter 中移除已弃用的代码 (issue 1155)
遗留的 .15 兼容性问题 (issue 925)
放弃对 CONCURRENT_REQUESTS_PER_SPIDER 的支持 (issue 895)
删除旧的引擎代码 (issue 911)
弃用 SgmlLinkExtractor (issue 777)
重定位
将 exporters/__init__.py 移至 exporters.py (issue 1242)
将基类移至其包中 (issue 1218, issue 1233)
模块迁移 (issue 1181, issue 1210)
将 SpiderManager 重命名为 SpiderLoader (issue 1166)
移除 djangoitem (issue 1177)
移除 scrapy deploy 命令 (issue 1102)
合并 contrib_exp (issue 1134)
从根目录删除 bin 文件夹,修复 #913 (issue 914)
移除基于 jsonrpc 的 webservice (issue 859)
修复设置中迁移路径的向后不兼容性问题 (issue 1267)
文档
CrawlerProcess 文档 (issue 1190)
在描述中倾向于使用“web scraping”而不是“screen scraping” (issue 1188)
Scrapy 教程的一些改进 (issue 1180)
将文件管道与图片管道一起文档化 (issue 1150)
部署文档调整 (issue 1164)
添加了包含 scrapyd-deploy 和 shub 的部署部分 (issue 1124)
向项目模板添加更多设置 (issue 1073)
概述页面的一些改进 (issue 1106)
更新 docs/topics/architecture.rst 中的链接 (issue 647)
文档:重新排序主题 (issue 1022)
更新 Request.meta 特殊键列表 (issue 1071)
文档:记录 download_timeout (issue 898)
文档:简化扩展文档 (issue 893)
内存泄漏文档 (issue 894)
文档:记录 item pipelines 的 from_crawler 方法 (issue 904)
Spider_error 不支持 deferreds (issue 1292)
修正和 Sphinx 相关修复 (issue 1220, issue 1219, issue 1196, issue 1172, issue 1171, issue 1169, issue 1160, issue 1154, issue 1127, issue 1112, issue 1105, issue 1041, issue 1082, issue 1033, issue 944, issue 866, issue 864, issue 796, issue 1260, issue 1271, issue 1293, issue 1298)
Bug 修复
Item 多重继承修复 (issue 353, issue 1228)
ItemLoader.load_item:迭代字段的副本 (issue 722)
修复 Deferred 中的未处理错误 (RobotsTxtMiddleware) (issue 1131, issue 1197)
强制将 DOWNLOAD_TIMEOUT 读取为 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)
在 PY2 下使用 unicode_escape 编码无效的 xpath (commit 07cb3e5)
修复 IPython shell 范围问题并加载 IPython 用户配置 (commit 2c8e573)
修复文档中的小拼写错误 (commit d694019)
修复小拼写错误 (commit f92fa83)
在“Extracting the data”部分将 sel.xpath() 调用转换为 response.xpath() (commit c2c6d15)
Scrapy 0.24.5 (2015-02-25)
支持 Twisted 15.0.0 中的新 _getEndpoint Agent 签名 (commit 540b9bc)
文档:修复了另外几个引用 (commit b4c454b)
文档:修复一个引用 (commit e3c1260)
t.i.b.ThreadedResolver 现在是一个新式类 (commit 9e13f42)
S3DownloadHandler:修复带引用路径/查询参数请求的认证问题 (commit cdb9a0b)
修复 mailsender 文档中的变量类型 (commit bb3a848)
重置 items_scraped 而不是 item_count (commit edb07a4)
关于贡献时应阅读哪些文档的暂定注意事项 (commit 7ee6f7a)
mitmproxy 0.10.1 也需要 netlib 0.10.1 (commit 874fcdd)
将 mitmproxy 固定到 0.10.1,因为 >0.11 版本无法通过测试 (commit c6b21f0)
在本地测试 parse 命令,而不是针对外部 URL (commit c3a6628)
补丁修复了 HTTPDownloadHandler 关闭连接池时 Twisted 的问题 (commit d0bf957)
更新了动态 Item 类的文档。(commit eeb589a)
合并 pull request #943 来自 Lazar-T/patch-3 (commit 5fdab02)
拼写错误 (commit b0ae199)
Twisted 需要 pywin32。关闭 #937 (commit 5cb0cfb)
更新 install.rst (commit 781286b)
合并 pull request #928 来自 Lazar-T/patch-1 (commit b415d04)
使用逗号而不是句号 (commit 627b9ba)
合并 pull request #885 来自 jsma/patch-1 (commit de909ad)
更新 request-response.rst (commit 3f3263d)
SgmlLinkExtractor - 修复解析包含 Unicode 的 <area> 标签的问题 (commit 49b40f0)
Scrapy 0.24.4 (2014-08-09)
pem 文件由 mockserver 使用,并且是 scrapy bench 所必需的 (commit 5eddc68b63)
scrapy bench 需要 scrapy.tests* (commit d6cb999)
Scrapy 0.24.3 (2014-08-09)
对于 0.24 版本,无需在 py3 上浪费 travis-ci 时间 (commit 8e080c1)
更新安装文档 (commit 1d0c096)
Scrapy 框架有一个 trove 分类器!(commit 4c701d7)
更新提到 w3lib 版本的所有其他地方 (commit d109c13)
将 w3lib 要求更新到 1.8.0 (commit 39d2ce5)
使用 w3lib.html.replace_entities() (remove_entities() 已弃用) (commit 180d3ad)
设置 zip_safe=False (commit a51ee8b)
不包含 tests 包 (commit ee3b371)
scrapy.bat 不再需要了 (commit c3861cf)
现代化 setup.py (commit 362e322)
headers 无法处理非字符串值 (commit 94a5c65)
修复 ftp 测试用例 (commit a274a7f)
travis-ci 构建总共耗时约 50 分钟才能完成 (commit ae1e2cc)
更新 shell.rst 中的拼写错误 (commit e49c96a)
移除 shell 结果中奇怪的缩进 (commit 1ca489d)
改进了说明,明确博客文章作为来源,在规范中增加了 XPath 字符串函数的链接 (commit 65c8f05)
重命名 UserTimeoutError 和 ServerTimeouterror #583 (commit 037f6ab)
为选择器文档添加一些 XPath 技巧 (commit 2d103e0)
修复测试以适应 https://github.com/scrapy/w3lib/pull/23 (commit f8d366a)
修复 get_func_args 最大递归问题 #728 (commit 81344ea)
根据 #560 更新了输入/输出处理器示例。 (commit f7c4ea8)
修复了教程中的 Python 语法错误。 (commit db59ed9)
添加隧道代理的测试用例 (commit f090260)
修复了使用隧道时将 Proxy-Authorization header 泄露到远程主机的 Bug (commit d8793af)
从 MIME 类型为“application/xml”的 XHTML 文档中提取链接 (commit ed1f376)
合并来自 roysc/patch-1 的 pull request #793 (commit 91a1106)
修复 commands.rst 中的拼写错误 (commit 743e1e2)
settings.overrides.setdefault 的更好的测试用例 (commit e22daaf)
根据 http 1.1 定义使用 CRLF 作为行标记 (commit 5ec430b)
Scrapy 0.24.2 (2014-07-08)
使用可变映射代理已废弃的 settings.overrides 和 settings.defaults 属性 (commit e5e8133)
尚未支持 python3 (commit 3cd6146)
更新 Debian 包的 Python 兼容版本集 (commit fa5d76b)
文档:修复发行说明中的格式 (commit c6a9e20)
Scrapy 0.24.1 (2014-06-27)
修复已废弃的 CrawlerSettings 并增加与 .defaults 属性的向后兼容性 (commit 8e3f20a)
Scrapy 0.24.0 (2014-06-26)
改进
添加新的基于 lxml 的 LinkExtractor 以替换不再维护的 SgmlLinkExtractor (issue 559, issue 761, issue 763)
清理 settings API - per-spider settings GSoC 项目 的一部分 (issue 737)
Telnet 控制台现在默认绑定到 127.0.0.1 (issue 699)
在 lxml XPath 求值中禁用 smart strings (issue 535)
将基于文件系统的缓存恢复为 http 缓存中间件的默认设置 (issue 541, issue 500, issue 571)
在 Scrapy shell 中暴露当前爬虫 (issue 557)
改进比较 CSV 和 XML 导出器的测试套件 (issue 570)
新增
offsite/filtered
和offsite/domains
统计信息 (issue 566)在 CrawlSpider 中支持 process_links 作为生成器 (issue 555)
为 DupeFilter 添加更详细的日志记录和新的统计计数器 (issue 553)
为
MailSender.send()
添加 mimetype 参数 (issue 602)泛化文件管道的日志消息 (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)
使用来自 ppa 的最新 pypi 运行 pypy 测试 (issue 674)
使用 pytest 而非 trial 运行测试套件 (issue 679)
在 tox 环境中构建文档并检查死链接 (issue 687)
在
url_is_from_any_domain()
中支持不区分大小写的域名 (issue 693)移除项目和爬虫模板中的 pep8 警告 (issue 698)
request_fingerprint
函数的测试和文档 (issue 597)更新 GSoC 项目
per-spider settings
的 SEP-19 (issue 705)合约失败时设置非零退出码 (issue 727)
添加一个设置来控制哪个类实例化为下载器组件 (issue 738)
在
item_dropped
信号中传递响应 (issue 724)文档记录
spider.closed()
快捷方式 (issue 719)文档记录
request_scheduled
信号 (issue 746)添加关于报告安全问题的说明 (issue 697)
对
scrapy list
命令的爬虫列表输出进行排序 (issue 742)多项文档增强和修复 (issue 575, issue 587, issue 590, issue 596, issue 610, issue 617, issue 618, issue 627, issue 613, issue 643, issue 654, issue 675, issue 663, issue 711, issue 714)
Bug 修复
在 RegexLinkExtractor 中创建链接时对 unicode URL 值进行编码 (issue 561)
在 ItemLoader 处理器中忽略 None 值 (issue 556)
修复 SGMLLinkExtractor 和 HtmlParserLinkExtractor 中存在内部标签时的链接文本问题 (issue 485, issue 574)
处理 inspect.stack() 失败导致的错误 (issue 582)
修复 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)
修复对不存在的 engine.slots 的引用。关闭 #593 (commit 13c099a)
下载器中间件文档拼写错误(爬虫中间件文档复制残留) (commit 8ae11bf)
更正拼写错误 (commit 1346037)
Scrapy 0.22.1 (发布于 2014-02-08)
在某些情况下 localhost666 可以解析 (commit 2ec2279)
测试 inspect.stack 失败 (commit cc3eda3)
处理 inspect.stack() 失败的情况 (commit 8cb44f9)
修复对已废弃类进行子类化时的错误检查。关闭 #581 (commit 46d98d6)
文档:最终爬虫示例使用 4 个空格缩进 (commit 13846de)
合并 #485 后修复 HtmlParserLinkExtractor 和测试 (commit 368a946)
BaseSgmlLinkExtractor:修复链接具有内部标签时缺失的空格 (commit b566388)
BaseSgmlLinkExtractor:添加了带有内部标签的链接的单元测试 (commit c1cb418)
BaseSgmlLinkExtractor:修复 unknown_endtag(),使其仅在结束标签与开始标签匹配时设置 current_link=None (commit 7e4d627)
修复 Travis-CI 构建的测试 (commit 76c7e20)
用 html 实体替换无法编码的码位。修复 #562 和 #285 (commit 5f87b17)
RegexLinkExtractor:创建链接时对 URL unicode 值进行编码 (commit d0ee545)
使用最新输出更新了教程的爬取输出。 (commit 8da65de)
更新了 shell 文档中的爬虫引用,并修复了实际的 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
添加一个中间件来爬取 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)
修复
FormRequest.from_response()
中 url 覆盖的问题 (issue 507)修复 pip 1.5 下的测试运行器问题 (issue 513)
修复爬虫名称为 unicode 时记录日志错误的问题 (issue 479)
Scrapy 0.20.2 (发布于 2013-12-09)
使用 Selector 更改更新 CrawlSpider 模板 (commit 6d1457d)
修复教程中的方法名称。关闭 GH-480 (commit b4fc359
Scrapy 0.20.1 (发布于 2013-11-28)
include_package_data 是从发布源构建 wheels 所必需的 (commit 5ba1ad5)
process_parallel 泄露了其内部 deferred 的失败。关闭 #458 (commit 419a780)
Scrapy 0.20.0 (发布于 2013-11-08)
改进
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 现在针对
w3lib
和queuelib
Python 包的开发版本测试 Scrapy 更改。将 pypy 2.1 添加到持续集成测试中 (commit ecfa7431)
使用 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)
修复 setup.py 中无效的变量名 (issue 429)
修复教程引用 (issue 387)
改进请求-响应文档 (issue 391)
改进 django 集成文档 (issue 404)
文档记录
bindaddress
请求 meta (commit 37c24e01d7)改进
Request
类文档 (issue 226)
其他
致谢
感谢所有为本次发布做出贡献的人!
按提交数排序的贡献者列表
69 Daniel Graña <dangra@...>
37 Pablo Hoffman <pablo@...>
13 Mikhail Korobov <kmike84@...>
9 Alex Cepoi <alex.cepoi@...>
9 alexanderlukanin13 <alexander.lukanin.13@...>
8 Rolando Espinoza La fuente <darkrho@...>
8 Lukasz Biedrycki <lukasz.biedrycki@...>
6 Nicolas Ramirez <nramirez.uy@...>
3 Paul Tremberth <paul.tremberth@...>
2 Martin Olveyra <molveyra@...>
2 Stefan <misc@...>
2 Rolando Espinoza <darkrho@...>
2 Loren Davie <loren@...>
2 irgmedeiros <irgmedeiros@...>
1 Stefan Koch <taikano@...>
1 Stefan <cct@...>
1 scraperdragon <dragon@...>
1 Kumara Tharmalingam <ktharmal@...>
1 Francesco Piccinno <stack.box@...>
1 Marcos Campal <duendex@...>
1 Dragon Dave <dragon@...>
1 Capi Etheriel <barraponto@...>
1 cacovsky <amarquesferraz@...>
1 Berend Iwema <berend@...>
Scrapy 0.18.4 (发布于 2013-10-10)
IPython 拒绝更新命名空间。修复 #396 (commit 3d32c4f)
修复 shell 命令中替换请求时的 AlreadyCalledError。关闭 #407 (commit b1d8919)
修复
start_requests()
的惰性求值和过早挂起的问题 (commit 89faf52)
Scrapy 0.18.3 (发布于 2013-10-03)
修复起始请求惰性求值的回归问题 (commit 12693a5)
表单:不提交 reset 输入 (commit e429f63)
增加单元测试超时以减少 travis 误报失败 (commit 912202e)
将 master 分支的修复回传到 json 导出器 (commit cfc2d46)
生成 sdist tarball 前修复权限并设置 umask (commit 06149e0)
Scrapy 0.18.2 (发布于 2013-09-03)
回传
scrapy check
命令修复和向后兼容的多爬虫进程(issue 339)
Scrapy 0.18.1 (发布于 2013-08-27)
移除通过 cherry pick 添加的额外导入 (commit d20304e)
修复 twisted 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)
FormRequest.from_response
支持 xpath 表单选择 (issue 185)修复
SgmlLinkExtractor
中的 unicode 解码错误 (issue 199)修复 pypi 解释器上的信号分发问题 (issue 205)
改进请求延迟和并发处理 (issue 206)
向
HttpCacheMiddleware
添加 RFC2616 缓存策略 (issue 212)允许自定义引擎记录的消息 (issue 214)
使用 setuptools 入口点扩展 Scrapy 命令 (issue 260)
允许 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 标签重定向,
MetaRefreshMiddleware
和RedirectMiddleware
具有不同的优先级,以解决 #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)
移除使用下载延迟时的并发限制,同时仍确保请求之间的延迟得到强制执行 (commit 487b9b5)
在图片 pipeline 失败时添加错误详情 (commit 8232569)
改进 macOS 兼容性 (commit 8dcf8aa)
setup.py: 使用 README.rst 填充 long_description (commit 7b5310d)
文档:移除 ClientForm 的过时引用 (commit 80f9bb6)
更正默认存储后端的文档 (commit 2aa491b)
文档:从 FAQ 中移除损坏的 proxyhub 链接 (commit bdf61c4)
修复 SpiderOpenCloseLogging 示例中的文档拼写错误 (commit 7184094)
Scrapy 0.16.2 (发布于 2012-11-09)
Scrapy 契约:python2.6 兼容性 (commit a4a9199)
Scrapy 契约 verbose 选项 (commit ec41673)
Scrapy 契约的类 unittest 输出 (commit 86635e4)
在调试文档中添加了
open_in_browser
(commit c9b690d)从设置文档中移除了对全局 Scrapy 统计信息的引用 (commit dd55067)
修复 Windows 平台上的 SpiderState 错误 (commit 58998f4)
Scrapy 0.16.1 (发布于 2012-10-26)
修复 LogStats 扩展,该扩展在 0.16 版本发布前的错误合并后损坏 (commit 8c780fd)
改进
scrapy.conf.settings
的向后兼容性 (commit 3403089)扩展了关于如何从扩展访问 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.BeautifulSoup
和scrapy.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
将 precise 添加到支持的 Ubuntu 发行版中 (commit b7e46df)
修复了在 https://groups.google.com/forum/#!topic/scrapy-users/qgVBmFybNAQ/discussion 中报告的 json-rpc webservice 中的错误。同时移除了 extras/scrapy-ws.py 中不再支持的 ‘run’ 命令 (commit 340fbdb)
content-type http equiv 的 meta 标签属性可以按任意顺序排列。#123 (commit 0cb68af)
用更标准的 “from PIL import Image” 替换 “import Image”。closes #88 (commit 4d17048)
将 trial 状态作为 bin/runtests.sh 的退出值返回。#118 (commit b7b2e7f)
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
在计算 checksum 之前将 buffer 指向文件开头。refs #92 (commit 6a5bef2)
在持久化图片之前计算图片 checksum。closes #92 (commit 9817df1)
移除缓存失败中的泄露引用 (commit 673a120)
修复
MemoryUsage
扩展中的错误:get_engine_status()
接受恰好 1 个参数(提供了 0 个) (commit 11133e9)修复 http 压缩中间件上的 struct.error。closes #87 (commit 1423140)
ajax 爬取未能为 unicode url 进行扩展 (commit 0de3fb4)
捕获
start_requests()
迭代器错误。refs #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)
文档:移除了
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 转储到文件(或使用-
转储到标准输出)的快捷方式。为 S3 下载器处理程序添加 boto 2.0 支持 (r2763)
在请求错误回调中,出现问题的请求现在可以在
failure.request
属性中接收到 (r2738)- 下载器重大重构,支持按域名/IP 设置并发限制 (r2732)
CONCURRENT_REQUESTS_PER_SPIDER
设置已弃用,并替换为
详见文档。
添加了内置缓存 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.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 对象的
url
和body
属性现在是只读的 (#230)Request.copy()
和Request.replace()
现在也复制它们的callback
和errback
属性 (#231)从
scrapy.contrib
中移除了UrlFilterMiddleware
(已默认禁用)Offsite 中间件不再过滤掉来自没有 allowed_domains 属性的 spider 的任何请求 (#225)
移除了 Spider Manager 的
load()
方法。现在 spider 在__init__
方法本身中加载。- Scrapy Manager(现在称为“Crawler”)的变更
scrapy.core.manager.ScrapyManager
类重命名为scrapy.crawler.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)
保持向后兼容性(带有弃用警告)
- 更改了 Item pipeline 的
- 模块移动:
scrapy.core.signals
移至scrapy.signals
保持向后兼容性(带有弃用警告)
- 模块移动:
- 模块移动:
scrapy.core.exceptions
移至scrapy.exceptions
保持向后兼容性(带有弃用警告)
- 模块移动:
为
BaseSpider
添加了handles_request()
类方法删除了
scrapy.log.exc()
函数(改用scrapy.log.err()
)删除了
scrapy.log.msg()
函数的component
参数删除了
scrapy.log.log_level
属性为 Spider Manager 和 Item Pipeline Manager 添加了
from_settings()
类方法
设置变更
添加了
HTTPCACHE_IGNORE_SCHEMES
设置,用于在 !HttpCacheMiddleware 中忽略某些 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)
添加了
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)添加了
ExecutionQueue
用于向爬虫馈送待抓取的数据 (r2034)移除了
ExecutionEngine
单例 (r2039)将
S3ImagesStore
(images pipeline) 移植为使用 boto 和线程 (r2033)模块移动:
scrapy.management.telnet
移至scrapy.telnet
(r2047)
默认设置变更
将默认的
SCHEDULER_ORDER
更改为DFO
(r1939)
Scrapy 0.8
像 #NNN 这样的数字引用了旧问题跟踪器 (Trac) 中的工单,该跟踪器现已不再可用。
新特性
向后不兼容的变更
更改了
scrapy.utils.response.get_meta_refresh()
签名 (r1804)移除了已弃用的
scrapy.item.ScrapedItem
类 - 请改用scrapy.item.Item
(r1838)移除了已弃用的
scrapy.xpath
模块 - 请改用scrapy.selector
(r1836)移除了已弃用的
core.signals.domain_open
信号 - 请改用core.signals.domain_opened
(r1822)log.msg()
现在接收一个spider
参数 (r1822)旧的 domain 参数已被弃用,并将在 0.9 中移除。对于 spider,您应始终使用
spider
参数并传递 spider 引用。如果您确实想传递一个字符串,请改用component
参数。
更改了核心信号
domain_opened
,domain_closed
,domain_idle
- 更改了 Item pipeline 以使用 spider 而不是 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_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 Cache 中间件
HTTP Cache 中间件已进行了大量重构,保留了相同的功能,但移除了 domain sectorization (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 的首次发布。