Scrapy 1.x release notes
Scrapy 1.8.4 (2024-02-14)
Security bug fixes:
Due to its ReDoS vulnerabilities,
scrapy.utils.iterators.xmliteris now deprecated in favor ofxmliter_lxml(), whichXMLFeedSpidernow uses.To minimize the impact of this change on existing code,
xmliter_lxml()now supports indicating the node namespace as a prefix in the node name, and big files with highly nested trees when using libxml2 2.7+.Please, see the cc65-xxvf-f7r9 security advisory for more information.
DOWNLOAD_MAXSIZEandDOWNLOAD_WARNSIZEnow also apply to the decompressed response body. Please, see the 7j7m-v7m3-jqm7 security advisory for more information.Also in relation with the 7j7m-v7m3-jqm7 security advisory, use of the
scrapy.downloadermiddlewares.decompressionmodule is discouraged and will trigger a warning.The
Authorizationheader is now dropped on redirects to a different domain. Please, see the cw9j-q3vf-hrrv security advisory for more information.
Scrapy 1.8.3 (2022-07-25)
Security bug fix:
When
HttpProxyMiddlewareprocesses a request withproxymetadata, and thatproxymetadata includes proxy credentials,HttpProxyMiddlewaresets theProxy-Authorizationheader, but only if that header is not already set.There are third-party proxy-rotation downloader middlewares that set different
proxymetadata every time they process a request.Because of request retries and redirects, the same request can be processed by downloader middlewares more than once, including both
HttpProxyMiddlewareand any third-party proxy-rotation downloader middleware.These third-party proxy-rotation downloader middlewares could change the
proxymetadata of a request to a new value, but fail to remove theProxy-Authorizationheader from the previous value of theproxymetadata, causing the credentials of one proxy to be sent to a different proxy.To prevent the unintended leaking of proxy credentials, the behavior of
HttpProxyMiddlewareis now as follows when processing a request:If the request being processed defines
proxymetadata that includes credentials, theProxy-Authorizationheader is always updated to feature those credentials.If the request being processed defines
proxymetadata without credentials, theProxy-Authorizationheader is removed unless it was originally defined for the same proxy URL.To remove proxy credentials while keeping the same proxy URL, remove the
Proxy-Authorizationheader.If the request has no
proxymetadata, or that metadata is a falsy value (e.g.None), theProxy-Authorizationheader is removed.It is no longer possible to set a proxy URL through the
proxymetadata but set the credentials through theProxy-Authorizationheader. Set proxy credentials through theproxymetadata instead.
Scrapy 1.8.2 (2022-03-01)
Security bug fixes:
When a
Requestobject with cookies defined gets a redirect response causing a newRequestobject to be scheduled, the cookies defined in the originalRequestobject are no longer copied into the newRequestobject.If you manually set the
Cookieheader on aRequestobject and the domain name of the redirect URL is not an exact match for the domain of the URL of the originalRequestobject, yourCookieheader is now dropped from the newRequestobject.The old behavior could be exploited by an attacker to gain access to your cookies. Please, see the cjvr-mfj7-j4j8 security advisory for more information.
Note
It is still possible to enable the sharing of cookies between different domains with a shared domain suffix (e.g.
example.comand any subdomain) by defining the shared domain suffix (e.g.example.com) as the cookie domain when defining your cookies. See the documentation of theRequestclass for more information.When the domain of a cookie, either received in the
Set-Cookieheader of a response or defined in aRequestobject, is set to a public suffix, the cookie is now ignored unless the cookie domain is the same as the request domain.The old behavior could be exploited by an attacker to inject cookies into your requests to some other domains. Please, see the mfjm-vh54-3f96 security advisory for more information.
Scrapy 1.8.1 (2021-10-05)
Security bug fix:
If you use
HttpAuthMiddleware(i.e. thehttp_userandhttp_passspider attributes) for HTTP authentication, any request exposes your credentials to the request target.To prevent unintended exposure of authentication credentials to unintended domains, you must now additionally set a new, additional spider attribute,
http_auth_domain, and point it to the specific domain to which the authentication credentials must be sent.If the
http_auth_domainspider attribute is not set, the domain of the first request will be considered the HTTP authentication target, and authentication credentials will only be sent in requests targeting that domain.If you need to send the same HTTP authentication credentials to multiple domains, you can use
w3lib.http.basic_auth_header()instead to set the value of theAuthorizationheader of your requests.If you really want your spider to send the same HTTP authentication credentials to any domain, set the
http_auth_domainspider attribute toNone.Finally, if you are a user of scrapy-splash, know that this version of Scrapy breaks compatibility with scrapy-splash 0.7.2 and earlier. You will need to upgrade scrapy-splash to a greater version for it to continue to work.
Scrapy 1.8.0 (2019-10-28)
Highlights:
Dropped Python 3.4 support and updated minimum requirements; made Python 3.8 support official
New
Request.from_curl()class methodNew
ROBOTSTXT_PARSERandROBOTSTXT_USER_AGENTsettingsNew
DOWNLOADER_CLIENT_TLS_CIPHERSandDOWNLOADER_CLIENT_TLS_VERBOSE_LOGGINGsettings
Backward-incompatible changes
Python 3.4 is no longer supported, and some of the minimum requirements of Scrapy have also changed:
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
(#3892)
JSONRequestis now calledJsonRequestfor consistency with similar classes (#3929, #3982)If you are using a custom context factory (
DOWNLOADER_CLIENTCONTEXTFACTORY), its__init__method must accept two new parameters:tls_verbose_loggingandtls_ciphers(#2111, #3392, #3442, #3450)ItemLoadernow turns the values of its input item into lists:>>> item = MyItem() >>> item["field"] = "value1" >>> loader = ItemLoader(item=item) >>> item["field"] ['value1']
This is needed to allow adding values to existing fields (
loader.add_value('field', 'value2')).
See also Deprecation removals below.
New features
A new
Request.from_curlclass method allows creating a request from a cURL command (#2985, #3862)A new
ROBOTSTXT_PARSERsetting allows choosing which robots.txt parser to use. It includes built-in support for RobotFileParser, Protego (default), Reppy, and Robotexclusionrulesparser, and allows you to implement support for additional parsers (#754, #2669, #3796, #3935, #3969, #4006)A new
ROBOTSTXT_USER_AGENTsetting allows defining a separate user agent string to use for robots.txt parsing (#3931, #3966)Ruleno longer requires aLinkExtractorparameter (#781, #4016)Use the new
DOWNLOADER_CLIENT_TLS_CIPHERSsetting to customize the TLS/SSL ciphers used by the default HTTP/1.1 downloader (#3392, #3442)Set the new
DOWNLOADER_CLIENT_TLS_VERBOSE_LOGGINGsetting toTrueto enable debug-level messages about TLS connection parameters after establishing HTTPS connections (#2111, #3450)Callbacks that receive keyword arguments (see
Request.cb_kwargs) can now be tested using the new@cb_kwargsspider contract (#3985, #3988)When a
@scrapesspider contract fails, all missing fields are now reported (#766, #3939)Custom log formats can now drop messages by having the corresponding methods of the configured
LOG_FORMATTERreturnNone(#3984, #3987)A much improved completion definition is now available for Zsh (#4069)
Bug fixes
ItemLoader.load_item()no longer makes later calls toItemLoader.get_output_value()orItemLoader.load_item()return empty data (#3804, #3819, #3897, #3976, #3998, #4036)Fixed
DummyStatsCollectorraising aTypeErrorexception (#4007, #4052)FilesPipeline.file_pathandImagesPipeline.file_pathno longer choose file extensions that are not registered with IANA (#1287, #3953, #3954)When using botocore to persist files in S3, all botocore-supported headers are properly mapped now (#3904, #3905)
FTP passwords in
FEED_URIcontaining percent-escaped characters are now properly decoded (#3941)A memory-handling and error-handling issue in
scrapy.utils.ssl.get_temp_key_info()has been fixed (#3920)
Documentation
The documentation now covers how to define and configure a custom log format (#3616, #3660)
API documentation added for
MarshalItemExporterandPythonItemExporter(#3973)Minor documentation fixes (#2998, #3398, #3597, #3894, #3934, #3978, #3993, #4022, #4028, #4033, #4046, #4050, #4055, #4056, #4061, #4072, #4071, #4079, #4081, #4089, #4093)
Deprecation removals
scrapy.xlibhas been removed (#4015)
Deprecations
Other changes
Minimum versions of optional Scrapy requirements that are covered by continuous integration tests have been updated:
Lower versions of these optional requirements may work, but it is not guaranteed (#3892)
GitHub templates for bug reports and feature requests (#3126, #3471, #3749, #3754)
Continuous integration fixes (#3923)
Scrapy 1.7.4 (2019-10-21)
Revert the fix for #3804 (#3819), which has a few undesired side effects (#3897, #3976).
As a result, when an item loader is initialized with an item,
ItemLoader.load_item() once again
makes later calls to ItemLoader.get_output_value() or ItemLoader.load_item() return empty data.
Scrapy 1.7.3 (2019-08-01)
Scrapy 1.7.2 (2019-07-23)
Scrapy 1.7.1 (2019-07-18)
Re-packaging of Scrapy 1.7.0, which was missing some changes in PyPI.
Scrapy 1.7.0 (2019-07-18)
Note
Make sure you install Scrapy 1.7.1. The Scrapy 1.7.0 package in PyPI is the result of an erroneous commit tagging and does not include all the changes described below.
Highlights:
Improvements for crawls targeting multiple domains
A cleaner way to pass arguments to callbacks
A new class for JSON requests
Improvements for rule-based spiders
New features for feed exports
Backward-incompatible changes
429is now part of theRETRY_HTTP_CODESsetting by defaultThis change is backward incompatible. If you don’t want to retry
429, you must overrideRETRY_HTTP_CODESaccordingly.Crawler,CrawlerRunner.crawlandCrawlerRunner.create_crawlerno longer accept aSpidersubclass instance, they only accept aSpidersubclass now.Spidersubclass instances were never meant to work, and they were not working as one would expect: instead of using the passedSpidersubclass instance, theirfrom_crawlermethod was called to generate a new instance.Non-default values for the
SCHEDULER_PRIORITY_QUEUEsetting may stop working. Scheduler priority queue classes now need to handleRequestobjects instead of arbitrary Python data structures.An additional
crawlerparameter has been added to the__init__method of theSchedulerclass. Custom scheduler subclasses which don’t accept arbitrary parameters in their__init__method might break because of this change.For more information, see
SCHEDULER.
See also Deprecation removals below.
New features
A new scheduler priority queue,
scrapy.pqueues.DownloaderAwarePriorityQueue, may be enabled for a significant scheduling improvement on crawls targeting multiple web domains, at the cost of noCONCURRENT_REQUESTS_PER_IPsupport (#3520)A new
Request.cb_kwargsattribute provides a cleaner way to pass keyword arguments to callback methods (#1138, #3563)A new
JSONRequestclass offers a more convenient way to build JSON requests (#3504, #3505)A
process_requestcallback passed to theRule__init__method now receives theResponseobject that originated the request as its second argument (#3682)A new
restrict_textparameter for theLinkExtractor__init__method allows filtering links by linking text (#3622, #3635)A new
FEED_STORAGE_S3_ACLsetting allows defining a custom ACL for feeds exported to Amazon S3 (#3607)A new
FEED_STORAGE_FTP_ACTIVEsetting allows using FTP’s active connection mode for feeds exported to FTP servers (#3829)A new
METAREFRESH_IGNORE_TAGSsetting allows overriding which HTML tags are ignored when searching a response for HTML meta tags that trigger a redirect (#1422, #3768)A new
redirect_reasonsrequest meta key exposes the reason (status code, meta refresh) behind every followed redirect (#3581, #3687)The
SCRAPY_CHECKvariable is now set to thetruestring during runs of thecheckcommand, which allows detecting contract check runs from code (#3704, #3739)A new
Item.deepcopy()method makes it easier to deep-copy items (#1493, #3671)Exceptions from
ItemLoaderinput and output processors are now more verbose (#3836, #3840)Crawler,CrawlerRunner.crawlandCrawlerRunner.create_crawlernow fail gracefully if they receive aSpidersubclass instance instead of the subclass itself (#2283, #3610, #3872)
Bug fixes
process_spider_exception()is now also invoked for generators (#220, #2061)System exceptions like KeyboardInterrupt are no longer caught (#3726)
ItemLoader.load_item()no longer makes later calls toItemLoader.get_output_value()orItemLoader.load_item()return empty data (#3804, #3819)The images pipeline (
ImagesPipeline) no longer ignores these Amazon S3 settings:AWS_ENDPOINT_URL,AWS_REGION_NAME,AWS_USE_SSL,AWS_VERIFY(#3625)Fixed a memory leak in
scrapy.pipelines.media.MediaPipelineaffecting, for example, non-200 responses and exceptions from custom middlewares (#3813)Requests with private callbacks are now correctly unserialized from disk (#3790)
FormRequest.from_response()now handles invalid methods like major web browsers (#3777, #3794)
Documentation
A new topic, Selecting dynamically-loaded content, covers recommended approaches to read dynamically-loaded data (#3703)
Speeding up broad crawls now features information about memory usage (#1264, #3866)
The documentation of
Rulenow covers how to access the text of a link when usingCrawlSpider(#3711, #3712)A new section, Writing your own storage backend, covers writing a custom cache storage backend for
HttpCacheMiddleware(#3683, #3692)A new FAQ entry, How to split an item into multiple items in an item pipeline?, explains what to do when you want to split an item into multiple items from an item pipeline (#2240, #3672)
Updated the FAQ entry about crawl order to explain why the first few requests rarely follow the desired order (#1739, #3621)
The
LOGSTATS_INTERVALsetting (#3730), theFilesPipeline.file_pathandImagesPipeline.file_pathmethods (#2253, #3609) and theCrawler.stop()method (#3842) are now documentedSome parts of the documentation that were confusing or misleading are now clearer (#1347, #1789, #2289, #3069, #3615, #3626, #3668, #3670, #3673, #3728, #3762, #3861, #3882)
Minor documentation fixes (#3648, #3649, #3662, #3674, #3676, #3694, #3724, #3764, #3767, #3791, #3797, #3806, #3812)
Deprecation removals
The following deprecated APIs have been removed (#3578):
scrapy.conf(useCrawler.settings)From
scrapy.core.downloader.handlers:http.HttpDownloadHandler(usehttp10.HTTP10DownloadHandler)
scrapy.loader.ItemLoader._get_values(use_get_xpathvalues)scrapy.loader.XPathItemLoader(useItemLoader)scrapy.log(see Logging)From
scrapy.pipelines:files.FilesPipeline.file_key(usefile_path)images.ImagesPipeline.file_key(usefile_path)images.ImagesPipeline.image_key(usefile_path)images.ImagesPipeline.thumb_key(usethumb_path)
From both
scrapy.selectorandscrapy.selector.lxmlsel:From
scrapy.selector.csstranslator:ScrapyGenericTranslator(use parsel.csstranslator.GenericTranslator)ScrapyHTMLTranslator(use parsel.csstranslator.HTMLTranslator)ScrapyXPathExpr(use parsel.csstranslator.XPathExpr)
From
Selector:_root(both the__init__method argument and the object property, useroot)extract_unquoted(usegetall)select(usexpath)
From
SelectorList:extract_unquoted(usegetall)select(usexpath)x(usexpath)
scrapy.spiders.BaseSpider(useSpider)From
Spider(and subclasses):DOWNLOAD_DELAY(use download_delay)set_crawler(usefrom_crawler())
scrapy.spiders.spiders(useSpiderLoader)scrapy.telnet(usescrapy.extensions.telnet)From
scrapy.utils.python:str_to_unicode(useto_unicode)unicode_to_str(useto_bytes)
scrapy.utils.response.body_or_str
The following deprecated settings have also been removed (#3578):
SPIDER_MANAGER_CLASS(useSPIDER_LOADER_CLASS)
Deprecations
The
queuelib.PriorityQueuevalue for theSCHEDULER_PRIORITY_QUEUEsetting is deprecated. Usescrapy.pqueues.ScrapyPriorityQueueinstead.process_requestcallbacks passed toRulethat do not accept two arguments are deprecated.The following modules are deprecated:
scrapy.utils.http(use w3lib.http)scrapy.utils.markup(use w3lib.html)scrapy.utils.multipart(use urllib3)
The
scrapy.utils.datatypes.MergeDictclass is deprecated for Python 3 code bases. UseChainMapinstead. (#3878)The
scrapy.utils.gz.is_gzippedfunction is deprecated. Usescrapy.utils.gz.gzip_magic_numberinstead.
Other changes
It is now possible to run all tests from the same tox environment in parallel; the documentation now covers this and other ways to run tests (#3707)
It is now possible to generate an API documentation coverage report (#3806, #3810, #3860)
The documentation policies now require docstrings (#3701) that follow PEP 257 (#3748)
Internal fixes and cleanup (#3629, #3643, #3684, #3698, #3734, #3735, #3736, #3737, #3809, #3821, #3825, #3827, #3833, #3857, #3877)
Scrapy 1.6.0 (2019-01-30)
Highlights:
better Windows support;
Python 3.7 compatibility;
big documentation improvements, including a switch from
.extract_first()+.extract()API to.get()+.getall()API;feed exports, FilePipeline and MediaPipeline improvements;
better extensibility:
item_errorandrequest_reached_downloadersignals;from_crawlersupport for feed exporters, feed storages and dupefilters.scrapy.contractsfixes and new features;telnet console security improvements, first released as a backport in Scrapy 1.5.2 (2019-01-22);
clean-up of the deprecated code;
various bug fixes, small new features and usability improvements across the codebase.
Selector API changes
While these are not changes in Scrapy itself, but rather in the parsel
library which Scrapy uses for xpath/css selectors, these changes are
worth mentioning here. Scrapy now depends on parsel >= 1.5, and
Scrapy documentation is updated to follow recent parsel API conventions.
Most visible change is that .get() and .getall() selector
methods are now preferred over .extract_first() and .extract().
We feel that these new methods result in a more concise and readable code.
See extract() and extract_first() for more details.
Note
There are currently no plans to deprecate .extract()
and .extract_first() methods.
Another useful new feature is the introduction of Selector.attrib and
SelectorList.attrib properties, which make it easier to get
attributes of HTML elements. See Selecting element attributes.
CSS selectors are cached in parsel >= 1.5, which makes them faster when the same CSS path is used many times. This is very common in case of Scrapy spiders: callbacks are usually called several times, on different pages.
If you’re using custom Selector or SelectorList subclasses,
a backward incompatible change in parsel may affect your code.
See parsel changelog for a detailed description, as well as for the
full list of improvements.
Telnet console
Backward incompatible: Scrapy’s telnet console now requires username and password. See Telnet Console for more details. This change fixes a security issue; see Scrapy 1.5.2 (2019-01-22) release notes for details.
New extensibility features
from_crawlersupport is added to feed exporters and feed storages. This, among other things, allows to access Scrapy settings from custom feed storages and exporters (#1605, #3348).from_crawlersupport is added to dupefilters (#2956); this allows to access e.g. settings or a spider from a dupefilter.item_erroris fired when an error happens in a pipeline (#3256);request_reached_downloaderis fired when Downloader gets a new Request; this signal can be useful e.g. for custom Schedulers (#3393).new SitemapSpider
sitemap_filter()method which allows to select sitemap entries based on their attributes in SitemapSpider subclasses (#3512).Lazy loading of Downloader Handlers is now optional; this enables better initialization error handling in custom Downloader Handlers (#3394).
New FilePipeline and MediaPipeline features
Expose more options for S3FilesStore:
AWS_ENDPOINT_URL,AWS_USE_SSL,AWS_VERIFY,AWS_REGION_NAME. For example, this allows to use alternative or self-hosted AWS-compatible providers (#2609, #3548).ACL support for Google Cloud Storage:
FILES_STORE_GCS_ACLandIMAGES_STORE_GCS_ACL(#3199).
scrapy.contracts improvements
Exceptions in contracts code are handled better (#3377);
dont_filter=Trueis used for contract requests, which allows to test different callbacks with the same URL (#3381);request_clsattribute in Contract subclasses allow to use different Request classes in contracts, for example FormRequest (#3383).Fixed errback handling in contracts, e.g. for cases where a contract is executed for URL which returns non-200 response (#3371).
Usability improvements
more stats for RobotsTxtMiddleware (#3100)
INFO log level is used to show telnet host/port (#3115)
a message is added to IgnoreRequest in RobotsTxtMiddleware (#3113)
better validation of
urlargument inResponse.follow(#3131)non-zero exit code is returned from Scrapy commands when error happens on spider initialization (#3226)
Link extraction improvements: “ftp” is added to scheme list (#3152); “flv” is added to common video extensions (#3165)
better error message when an exporter is disabled (#3358);
scrapy shell --helpmentions syntax required for local files (./file.html) - #3496.Referer header value is added to RFPDupeFilter log messages (#3588)
Bug fixes
fixed issue with extra blank lines in .csv exports under Windows (#3039);
proper handling of pickling errors in Python 3 when serializing objects for disk queues (#3082)
flags are now preserved when copying Requests (#3342);
FormRequest.from_response clickdata shouldn’t ignore elements with
input[type=image](#3153).FormRequest.from_response should preserve duplicate keys (#3247)
Documentation improvements
Docs are re-written to suggest .get/.getall API instead of .extract/.extract_first. Also, Selectors docs are updated and re-structured to match latest parsel docs; they now contain more topics, such as Selecting element attributes or Extensions to CSS Selectors (#3390).
Using your browser’s Developer Tools for scraping is a new tutorial which replaces old Firefox and Firebug tutorials (#3400).
SCRAPY_PROJECT environment variable is documented (#3518);
troubleshooting section is added to install instructions (#3517);
improved links to beginner resources in the tutorial (#3367, #3468);
fixed
RETRY_HTTP_CODESdefault values in docs (#3335);remove unused
DEPTH_STATSoption from docs (#3245);
Deprecation removals
Compatibility shims for pre-1.0 Scrapy module names are removed (#3318):
scrapy.commandscrapy.contrib(with all submodules)scrapy.contrib_exp(with all submodules)scrapy.dupefilterscrapy.linkextractorscrapy.projectscrapy.spiderscrapy.spidermanagerscrapy.squeuescrapy.statsscrapy.statscolscrapy.utils.decorator
See Module Relocations for more information, or use suggestions from Scrapy 1.5.x deprecation warnings to update your code.
Other deprecation removals:
Other improvements, cleanups
All Scrapy tests now pass on Windows; Scrapy testing suite is executed in a Windows environment on CI (#3315).
Testing and CI fixes (#3526, #3538, #3308, #3311, #3309, #3305, #3210, #3299)
scrapy.http.cookies.CookieJar.clearaccepts “domain”, “path” and “name” optional arguments (#3231).additional files are included to sdist (#3495);
unneeded .strip() call is removed (#3519);
collections.deque is used to store MiddlewareManager methods instead of a list (#3476)
Scrapy 1.5.2 (2019-01-22)
Security bugfix: Telnet console extension can be easily exploited by rogue websites POSTing content to http://localhost:6023, we haven’t found a way to exploit it from Scrapy, but it is very easy to trick a browser to do so and elevates the risk for local development environment.
The fix is backward incompatible, it enables telnet user-password authentication by default with a random generated password. If you can’t upgrade right away, please consider setting
TELNETCONSOLE_PORTout of its default value.See telnet console documentation for more info
Backport CI build failure under GCE environment due to boto import error.
Scrapy 1.5.1 (2018-07-12)
This is a maintenance release with important bug fixes, but no new features:
O(N^2)gzip decompression issue which affected Python 3 and PyPy is fixed (#3281);skipping of TLS validation errors is improved (#3166);
Ctrl-C handling is fixed in Python 3.5+ (#3096);
documentation improvements (#3058, #3059, #3089, #3123, #3127, #3189, #3224, #3280, #3279, #3201, #3260, #3284, #3298, #3294).
Scrapy 1.5.0 (2017-12-29)
This release brings small new features and improvements across the codebase. Some highlights:
Google Cloud Storage is supported in FilesPipeline and ImagesPipeline.
Crawling with proxy servers becomes more efficient, as connections to proxies can be reused now.
Warnings, exception and logging messages are improved to make debugging easier.
scrapy parsecommand now allows to set custom request meta via--metaargument.Compatibility with Python 3.6, PyPy and PyPy3 is improved; PyPy and PyPy3 are now supported officially, by running tests on CI.
Better default handling of HTTP 308, 522 and 524 status codes.
Documentation is improved, as usual.
Backward Incompatible Changes
Scrapy 1.5 drops support for Python 3.3.
Default Scrapy User-Agent now uses https link to scrapy.org (#2983). This is technically backward-incompatible; override
USER_AGENTif you relied on old value.Logging of settings overridden by
custom_settingsis fixed; this is technically backward-incompatible because the logger changes from[scrapy.utils.log]to[scrapy.crawler]. If you’re parsing Scrapy logs, please update your log parsers (#1343).LinkExtractor now ignores
m4vextension by default, this is change in behavior.522 and 524 status codes are added to
RETRY_HTTP_CODES(#2851)
New features
Support
<link>tags inResponse.follow(#2785)Support for
ptpythonREPL (#2654)Google Cloud Storage support for FilesPipeline and ImagesPipeline (#2923).
New
--metaoption of the “scrapy parse” command allows to pass additional request.meta (#2883)Populate spider variable when using
shell.inspect_response(#2812)Handle HTTP 308 Permanent Redirect (#2844)
Add 522 and 524 to
RETRY_HTTP_CODES(#2851)Log versions information at startup (#2857)
scrapy.mail.MailSendernow works in Python 3 (it requires Twisted 17.9.0)Connections to proxy servers are reused (#2743)
Add template for a downloader middleware (#2755)
Explicit message for NotImplementedError when parse callback not defined (#2831)
CrawlerProcess got an option to disable installation of root log handler (#2921)
LinkExtractor now ignores
m4vextension by defaultBetter log messages for responses over
DOWNLOAD_WARNSIZEandDOWNLOAD_MAXSIZElimits (#2927)Show warning when a URL is put to
Spider.allowed_domainsinstead of a domain (#2250).
Bug fixes
Fix logging of settings overridden by
custom_settings; this is technically backward-incompatible because the logger changes from[scrapy.utils.log]to[scrapy.crawler], so please update your log parsers if needed (#1343)Default Scrapy User-Agent now uses https link to scrapy.org (#2983). This is technically backward-incompatible; override
USER_AGENTif you relied on old value.Fix PyPy and PyPy3 test failures, support them officially (#2793, #2935, #2990, #3050, #2213, #3048)
Fix DNS resolver when
DNSCACHE_ENABLED=False(#2811)Add
cryptographyfor Debian Jessie tox test env (#2848)Add verification to check if Request callback is callable (#2766)
Port
extras/qpsclient.pyto Python 3 (#2849)Use getfullargspec under the scenes for Python 3 to stop DeprecationWarning (#2862)
Update deprecated test aliases (#2876)
Fix
SitemapSpidersupport for alternate links (#2853)
Docs
Added missing bullet point for the
AUTOTHROTTLE_TARGET_CONCURRENCYsetting. (#2756)Update Contributing docs, document new support channels (#2762, #3038)
Include references to Scrapy subreddit in the docs
Fix broken links; use
https://for external links (#2978, #2982, #2958)Document CloseSpider extension better (#2759)
Use
pymongo.collection.Collection.insert_one()in MongoDB example (#2781)Clarify
CSVFeedSpider.headersdocumentation (#2826)Document
DontCloseSpiderexception and clarifyspider_idle(#2791)Update “Releases” section in README (#2764)
Fix rst syntax in
DOWNLOAD_FAIL_ON_DATALOSSdocs (#2763)Small fix in description of startproject arguments (#2866)
Clarify data types in Response.body docs (#2922)
Add a note about
request.meta['depth']to DepthMiddleware docs (#2374)Add a note about
request.meta['dont_merge_cookies']to CookiesMiddleware docs (#2999)A better example of ItemExporters usage (#2989)
Document
from_crawlermethods for spider and downloader middlewares (#3019)
Scrapy 1.4.0 (2017-05-18)
Scrapy 1.4 does not bring that many breathtaking new features but quite a few handy improvements nonetheless.
Scrapy now supports anonymous FTP sessions with customizable user and
password via the new FTP_USER and FTP_PASSWORD settings.
And if you’re using Twisted version 17.1.0 or above, FTP is now available
with Python 3.
There’s a new response.follow method
for creating requests; it is now a recommended way to create Requests
in Scrapy spiders. This method makes it easier to write correct
spiders; response.follow has several advantages over creating
scrapy.Request objects directly:
it handles relative URLs;
it works properly with non-ascii URLs on non-UTF8 pages;
in addition to absolute and relative URLs it supports Selectors; for
<a>elements it can also extract their href values.
For example, instead of this:
for href in response.css('li.page a::attr(href)').extract():
url = response.urljoin(href)
yield scrapy.Request(url, self.parse, encoding=response.encoding)
One can now write this:
for a in response.css('li.page a'):
yield response.follow(a, self.parse)
Link extractors are also improved. They work similarly to what a regular
modern browser would do: leading and trailing whitespace are removed
from attributes (think href=" http://example.com") when building
Link objects. This whitespace-stripping also happens for action
attributes with FormRequest.
Please also note that link extractors do not canonicalize URLs by default anymore. This was puzzling users every now and then, and it’s not what browsers do in fact, so we removed that extra transformation on extracted links.
For those of you wanting more control on the Referer: header that Scrapy
sends when following links, you can set your own Referrer Policy.
Prior to Scrapy 1.4, the default RefererMiddleware would simply and
blindly set it to the URL of the response that generated the HTTP request
(which could leak information on your URL seeds).
By default, Scrapy now behaves much like your regular browser does.
And this policy is fully customizable with W3C standard values
(or with something really custom of your own if you wish).
See REFERRER_POLICY for details.
To make Scrapy spiders easier to debug, Scrapy logs more stats by default in 1.4: memory usage stats, detailed retry stats, detailed HTTP error code stats. A similar change is that HTTP cache path is also visible in logs now.
Last but not least, Scrapy now has the option to make JSON and XML items
more human-readable, with newlines between items and even custom indenting
offset, using the new FEED_EXPORT_INDENT setting.
Enjoy! (Or read on for the rest of changes in this release.)
Deprecations and Backward Incompatible Changes
Default to
canonicalize=Falseinscrapy.linkextractors.LinkExtractor(#2537, fixes #1941 and #1982): warning, this is technically backward-incompatibleEnable memusage extension by default (#2539, fixes #2187); this is technically backward-incompatible so please check if you have any non-default
MEMUSAGE_***options set.EDITORenvironment variable now takes precedence overEDITORoption defined in settings.py (#1829); Scrapy default settings no longer depend on environment variables. This is technically a backward incompatible change.Spider.make_requests_from_urlis deprecated (#1728, fixes #1495).
New Features
Support brotli-compressed content; requires optional brotlipy (#2535)
New response.follow shortcut for creating requests (#1940)
Added
flagsargument and attribute toRequestobjects (#2047)Support Anonymous FTP (#2342)
Added
retry/count,retry/max_reachedandretry/reason_count/<reason>stats toRetryMiddleware(#2543)Added
httperror/response_ignored_countandhttperror/response_ignored_status_count/<status>stats toHttpErrorMiddleware(#2566)Customizable
Referrer policyinRefererMiddleware(#2306)Log cache directory when HTTP Cache is used (#2611, fixes #2604)
Warn users when project contains duplicate spider names (fixes #2181)
scrapy.utils.datatypes.CaselessDictnow acceptsMappinginstances and not only dicts (#2646)Media downloads, with
FilesPipelineorImagesPipeline, can now optionally handle HTTP redirects using the newMEDIA_ALLOW_REDIRECTSsetting (#2616, fixes #2004)Accept non-complete responses from websites using a new
DOWNLOAD_FAIL_ON_DATALOSSsetting (#2590, fixes #2586)Optional pretty-printing of JSON and XML items via
FEED_EXPORT_INDENTsetting (#2456, fixes #1327)Allow dropping fields in
FormRequest.from_responseformdata whenNonevalue is passed (#667)Per-request retry times with the new
max_retry_timesmeta key (#2642)python -m scrapyas a more explicit alternative toscrapycommand (#2740)
Bug fixes
LinkExtractor now strips leading and trailing whitespaces from attributes (#2547, fixes #1614)
Properly handle whitespaces in action attribute in
FormRequest(#2548)Buffer CONNECT response bytes from proxy until all HTTP headers are received (#2495, fixes #2491)
FTP downloader now works on Python 3, provided you use Twisted>=17.1 (#2599)
Use body to choose response type after decompressing content (#2393, fixes #2145)
Always decompress
Content-Encoding: gzipatHttpCompressionMiddlewarestage (#2391)Respect custom log level in
Spider.custom_settings(#2581, fixes #1612)‘make htmlview’ fix for macOS (#2661)
Remove “commands” from the command list (#2695)
Fix duplicate Content-Length header for POST requests with empty body (#2677)
Properly cancel large downloads, i.e. above
DOWNLOAD_MAXSIZE(#1616)ImagesPipeline: fixed processing of transparent PNG images with palette (#2675)
Cleanups & Refactoring
Tests: remove temp files and folders (#2570), fixed ProjectUtilsTest on macOS (#2569), use portable pypy for Linux on Travis CI (#2710)
Separate building request from
_requests_to_followin CrawlSpider (#2562)Remove “Python 3 progress” badge (#2567)
Add a couple more lines to
.gitignore(#2557)Remove bumpversion prerelease configuration (#2159)
Add codecov.yml file (#2750)
Set context factory implementation based on Twisted version (#2577, fixes #2560)
Add omitted
selfarguments in default project middleware template (#2595)Remove redundant
slot.add_request()call in ExecutionEngine (#2617)Catch more specific
os.errorexception inscrapy.pipelines.files.FSFilesStore(#2644)Change “localhost” test server certificate (#2720)
Remove unused
MEMUSAGE_REPORTsetting (#2576)
Documentation
Mention issue with
FormRequest.from_response()due to bug in lxml (#2572)Use single quotes uniformly in templates (#2596)
Document
ftp_userandftp_passwordmeta keys (#2587)Removed section on deprecated
contrib/(#2636)Recommend Anaconda when installing Scrapy on Windows (#2477, fixes #2475)
FAQ: rewrite note on Python 3 support on Windows (#2690)
Rearrange selector sections (#2705)
Remove
__nonzero__fromSelectorListdocs (#2683)Mention how to disable request filtering in documentation of
DUPEFILTER_CLASSsetting (#2714)Add sphinx_rtd_theme to docs setup readme (#2668)
Open file in text mode in JSON item writer example (#2729)
Clarify
allowed_domainsexample (#2670)
Scrapy 1.3.3 (2017-03-10)
Bug fixes
Make
SpiderLoaderraiseImportErroragain by default for missing dependencies and wrongSPIDER_MODULES. These exceptions were silenced as warnings since 1.3.0. A new setting is introduced to toggle between warning or exception if needed ; seeSPIDER_LOADER_WARN_ONLYfor details.
Scrapy 1.3.2 (2017-02-13)
Bug fixes
Scrapy 1.3.1 (2017-02-08)
New features
Support
'True'and'False'string values for boolean settings (#2519); you can now do something likescrapy crawl myspider -s REDIRECT_ENABLED=False.Support kwargs with
response.xpath()to use XPath variables and ad-hoc namespaces declarations ; this requires at least Parsel v1.1 (#2457).Add support for Python 3.6 (#2485).
Run tests on PyPy (warning: some tests still fail, so PyPy is not supported yet).
Bug fixes
Enforce
DNS_TIMEOUTsetting (#2496).Fix tests regarding
*_EXPIRES settingswith Files/Images pipelines (#2460).Fix name of generated pipeline class when using basic project template (#2466).
Fix
scrapy.Iteminheritance on Python 3.6 (#2511).Enforce numeric values for components order in
SPIDER_MIDDLEWARES,DOWNLOADER_MIDDLEWARES,EXTENSIONSandSPIDER_CONTRACTS(#2420).
Documentation
Reword Code of Conduct section and upgrade to Contributor Covenant v1.4 (#2469).
Clarify that passing spider arguments converts them to spider attributes (#2483).
Document
formidargument onFormRequest.from_response()(#2497).Add .rst extension to README files (#2507).
Mention LevelDB cache storage backend (#2525).
Use
yieldin sample callback code (#2533).Add note about HTML entities decoding with
.re()/.re_first()(#1704).
Cleanups
Scrapy 1.3.0 (2016-12-21)
This release comes rather soon after 1.2.2 for one main reason:
it was found out that releases since 0.18 up to 1.2.2 (included) use
some backported code from Twisted (scrapy.xlib.tx.*),
even if newer Twisted modules are available.
Scrapy now uses twisted.web.client and twisted.internet.endpoints directly.
(See also cleanups below.)
As it is a major change, we wanted to get the bug fix out quickly while not breaking any projects using the 1.2 series.
New Features
MailSendernow accepts single strings as values fortoandccarguments (#2272)scrapy fetch url,scrapy shell urlandfetch(url)inside Scrapy shell now follow HTTP redirections by default (#2290); Seefetchandshellfor details.HttpErrorMiddlewarenow logs errors withINFOlevel instead ofDEBUG; this is technically backward incompatible so please check your log parsers.By default, logger names now use a long-form path, e.g.
[scrapy.extensions.logstats], instead of the shorter “top-level” variant of prior releases (e.g.[scrapy]); this is backward incompatible if you have log parsers expecting the short logger name part. You can switch back to short logger names usingLOG_SHORT_NAMESset toTrue.
Dependencies & Cleanups
Scrapy now requires Twisted >= 13.1 which is the case for many Linux distributions already.
As a consequence, we got rid of
scrapy.xlib.tx.*modules, which copied some of Twisted code for users stuck with an “old” Twisted versionChunkedTransferMiddlewareis deprecated and removed from the default downloader middlewares.
Scrapy 1.2.3 (2017-03-03)
Packaging fix: disallow unsupported Twisted versions in setup.py
Scrapy 1.2.2 (2016-12-06)
Bug fixes
Documentation
Other changes
Advertize conda-forge as Scrapy’s official conda channel (#2387)
More helpful error messages when trying to use
.css()or.xpath()on non-Text Responses (#2264)startprojectcommand now generates a samplemiddlewares.pyfile (#2335)Add more dependencies’ version info in
scrapy versionverbose output (#2404)Remove all
*.pycfiles from source distribution (#2386)
Scrapy 1.2.1 (2016-10-21)
Bug fixes
Documentation
Other changes
Removed
www.fromstart_urlsin built-in spider templates (#2299).
Scrapy 1.2.0 (2016-10-03)
New Features
New
FEED_EXPORT_ENCODINGsetting to customize the encoding used when writing items to a file. This can be used to turn off\uXXXXescapes in JSON output. This is also useful for those wanting something else than UTF-8 for XML or CSV output (#2034).startprojectcommand now supports an optional destination directory to override the default one based on the project name (#2005).New
SCHEDULER_DEBUGsetting to log requests serialization failures (#1610).JSON encoder now supports serialization of
setinstances (#2058).Interpret
application/json-amazonui-streamingasTextResponse(#1503).scrapyis imported by default when using shell tools (shell, inspect_response) (#2248).
Bug fixes
DefaultRequestHeaders middleware now runs before UserAgent middleware (#2088). Warning: this is technically backward incompatible, though we consider this a bug fix.
HTTP cache extension and plugins that use the
.scrapydata directory now work outside projects (#1581). Warning: this is technically backward incompatible, though we consider this a bug fix.Selectordoes not allow passing bothresponseandtextanymore (#2153).Fixed logging of wrong callback name with
scrapy parse(#2169).Fix for an odd gzip decompression bug (#1606).
Fix for selected callbacks when using
CrawlSpiderwithscrapy parse(#2225).Fix for invalid JSON and XML files when spider yields no items (#872).
Implement
flush()forStreamLoggeravoiding a warning in logs (#2125).
Refactoring
Tests & Requirements
Scrapy’s new requirements baseline is Debian 8 “Jessie”. It was previously Ubuntu 12.04 Precise. What this means in practice is that we run continuous integration tests with these (main) packages versions at a minimum: Twisted 14.0, pyOpenSSL 0.14, lxml 3.4.
Scrapy may very well work with older versions of these packages (the code base still has switches for older Twisted versions for example) but it is not guaranteed (because it’s not tested anymore).
Documentation
Scrapy 1.1.4 (2017-03-03)
Packaging fix: disallow unsupported Twisted versions in setup.py
Scrapy 1.1.3 (2016-09-22)
Bug fixes
Documentation
Scrapy 1.1.2 (2016-08-18)
Bug fixes
Introduce a missing
IMAGES_STORE_S3_ACLsetting to override the default ACL policy inImagesPipelinewhen uploading images to S3 (note that default ACL policy is “private” – instead of “public-read” – since Scrapy 1.1.0)IMAGES_EXPIRESdefault value set back to 90 (the regression was introduced in 1.1.1)
Scrapy 1.1.1 (2016-07-13)
Bug fixes
Add “Host” header in CONNECT requests to HTTPS proxies (#2069)
Use response
bodywhen choosing response class (#2001, fixes #2000)Do not fail on canonicalizing URLs with wrong netlocs (#2038, fixes #2010)
a few fixes for
HttpCompressionMiddleware(andSitemapSpider):Catch (and ignore with a warning) exception when verifying certificate against IP-address hosts (#2094, fixes #2092)
Make
FilesPipelineandImagesPipelinebackward compatible again regarding the use of legacy class attributes for customization (#1989, fixes #1985)
New features
Documentation
FEED_TEMPDIRsetting at lexicographical position (commit 9b3c72c)Use idiomatic
.extract_first()in overview (#1994)Update years in copyright notice (commit c2c8036)
Add information and example on errbacks (#1995)
Use “url” variable in downloader middleware example (#2015)
New FAQ entry on using BeautifulSoup in spider callbacks (#2048)
Add notes about Scrapy not working on Windows with Python 3 (#2060)
Encourage complete titles in pull requests (#2026)
Tests
Upgrade py.test requirement on Travis CI and Pin pytest-cov to 2.2.1 (#2095)
Scrapy 1.1.0 (2016-05-11)
This 1.1 release brings a lot of interesting features and bug fixes:
Scrapy 1.1 has beta Python 3 support (requires Twisted >= 15.5). See Beta Python 3 Support for more details and some limitations.
Hot new features:
Item loaders now support nested loaders (#1467).
Added setting
AUTOTHROTTLE_TARGET_CONCURRENCYand improved AutoThrottle docs (#1324).Added
response.textto get body as unicode (#1730).Anonymous S3 connections (#1358).
Deferreds in downloader middlewares (#1473). This enables better robots.txt handling (#1471).
HTTP caching now follows RFC2616 more closely, added settings
HTTPCACHE_ALWAYS_STOREandHTTPCACHE_IGNORE_RESPONSE_CACHE_CONTROLS(#1151).Selectors were extracted to the parsel library (#1409). This means you can use Scrapy Selectors without Scrapy and also upgrade the selectors engine without needing to upgrade Scrapy.
HTTPS downloader now does TLS protocol negotiation by default, instead of forcing TLS 1.0. You can also set the SSL/TLS method using the new
DOWNLOADER_CLIENT_TLS_METHODsetting.
These bug fixes may require your attention:
Don’t retry bad requests (HTTP 400) by default (#1289). If you need the old behavior, add
400toRETRY_HTTP_CODES.Fix shell files argument handling (#1710, #1550). If you try
scrapy shell index.htmlit will try to load the URLhttp://index.html, usescrapy shell ./index.htmlto load a local file.Robots.txt compliance is now enabled by default for newly-created projects (#1724). Scrapy will also wait for robots.txt to be downloaded before proceeding with the crawl (#1735). If you want to disable this behavior, update
ROBOTSTXT_OBEYinsettings.pyfile after creating a new project.Exporters now work on unicode, instead of bytes by default (#1080). If you use
PythonItemExporter, you may want to update your code to disable binary mode which is now deprecated.Accept XML node names containing dots as valid (#1533).
When uploading files or images to S3 (with
FilesPipelineorImagesPipeline), the default ACL policy is now “private” instead of “public” Warning: backward incompatible!. You can useFILES_STORE_S3_ACLto change it.We’ve reimplemented
canonicalize_url()for more correct output, especially for URLs with non-ASCII characters (#1947). This could change link extractors output compared to previous Scrapy versions. This may also invalidate some cache entries you could still have from pre-1.1 runs. Warning: backward incompatible!.
Keep reading for more details on other improvements and bug fixes.
Beta Python 3 Support
We have been hard at work to make Scrapy run on Python 3. As a result, now you can run spiders on Python 3.3, 3.4 and 3.5 (Twisted >= 15.5 required). Some features are still missing (and some may never be ported).
Almost all builtin extensions/middlewares are expected to work. However, we are aware of some limitations in Python 3:
Scrapy does not work on Windows with Python 3
Sending emails is not supported
FTP download handler is not supported
Telnet console is not supported
Additional New Features and Enhancements
Scrapy now has a Code of Conduct (#1681).
Command line tool now has completion for zsh (#934).
Improvements to
scrapy shell:Added
MEMUSAGE_CHECK_INTERVAL_SECONDSsetting to change default check interval (#1282).Download handlers are now lazy-loaded on first request using their scheme (#1390, #1421).
HTTPS download handlers do not force TLS 1.0 anymore; instead, OpenSSL’s
SSLv23_method()/TLS_method()is used allowing to try negotiating with the remote hosts the highest TLS protocol version it can (#1794, #1629).RedirectMiddlewarenow skips the status codes fromhandle_httpstatus_liston spider attribute or inRequest’smetakey (#1334, #1364, #1447).Form submission:
Dict-like settings now have per-key priorities (#1135, #1149 and #1586).
Sending non-ASCII emails (#1662)
CloseSpiderandSpiderStateextensions now get disabled if no relevant setting is set (#1723, #1725).Added method
ExecutionEngine.close(#1423).Added method
CrawlerRunner.create_crawler(#1528).Scheduler priority queue can now be customized via
SCHEDULER_PRIORITY_QUEUE(#1822)..ppslinks are now ignored by default in link extractors (#1835).temporary data folder for FTP and S3 feed storages can be customized using a new
FEED_TEMPDIRsetting (#1847).FilesPipelineandImagesPipelinesettings are now instance attributes instead of class attributes, enabling spider-specific behaviors (#1891).JsonItemExporternow formats opening and closing square brackets on their own line (first and last lines of output file) (#1950).If available,
botocoreis used forS3FeedStorage,S3DownloadHandlerandS3FilesStore(#1761, #1883).Tons of documentation updates and related fixes (#1291, #1302, #1335, #1683, #1660, #1642, #1721, #1727, #1879).
Other refactoring, optimizations and cleanup (#1476, #1481, #1477, #1315, #1290, #1750, #1881).
Deprecations and Removals
Added
to_bytesandto_unicode, deprecatedstr_to_unicodeandunicode_to_strfunctions (#778).binary_is_textis introduced, to replace use ofisbinarytext(but with inverse return value) (#1851)The
optional_featuresset has been removed (#1359).The
--lsprofcommand line option has been removed (#1689). Warning: backward incompatible, but doesn’t break user code.The following datatypes were deprecated (#1720):
scrapy.utils.datatypes.MultiValueDictKeyErrorscrapy.utils.datatypes.MultiValueDictscrapy.utils.datatypes.SiteNode
The previously bundled
scrapy.xlib.pydispatchlibrary was deprecated and replaced by pydispatcher.
Relocations
telnetconsolewas relocated toextensions/(#1524).Note: telnet is not enabled on Python 3 (https://github.com/scrapy/scrapy/pull/1524#issuecomment-146985595)
Bugfixes
Scrapy does not retry requests that got a
HTTP 400 Bad Requestresponse anymore (#1289). Warning: backward incompatible!Support empty password for http_proxy config (#1274).
Interpret
application/x-jsonasTextResponse(#1333).Support link rel attribute with multiple values (#1201).
Fixed
scrapy.FormRequest.from_responsewhen there is a<base>tag (#1564).Fixed
TEMPLATES_DIRhandling (#1575).Makes
_monkeypatchesmore robust (#1634).Fixed bug on
XMLItemExporterwith non-string fields in items (#1738).Fixed startproject command in macOS (#1635).
Fixed
PythonItemExporterand CSVExporter for non-string item types (#1737).Various logging related fixes (#1294, #1419, #1263, #1624, #1654, #1722, #1726 and #1303).
Fixed bug in
utils.template.render_templatefile()(#1212).sitemaps extraction from
robots.txtis now case-insensitive (#1902).HTTPS+CONNECT tunnels could get mixed up when using multiple proxies to same remote host (#1912).
Scrapy 1.0.7 (2017-03-03)
Packaging fix: disallow unsupported Twisted versions in setup.py
Scrapy 1.0.6 (2016-05-04)
Scrapy 1.0.5 (2016-02-04)
FIX: [Backport] Ignore bogus links in LinkExtractors (fixes #907, commit 108195e)
TST: Changed buildbot makefile to use ‘pytest’ (commit 1f3d90a)
DOC: Fixed typos in tutorial and media-pipeline (commit 808a9ea and commit 803bd87)
DOC: Add AjaxCrawlMiddleware to DOWNLOADER_MIDDLEWARES_BASE in settings docs (commit aa94121)
Scrapy 1.0.4 (2015-12-30)
Ignoring xlib/tx folder, depending on Twisted version. (commit 7dfa979)
Run on new travis-ci infra (commit 6e42f0b)
Spelling fixes (commit 823a1cc)
escape nodename in xmliter regex (commit da3c155)
test xml nodename with dots (commit 4418fc3)
TST don’t use broken Pillow version in tests (commit a55078c)
disable log on version command. closes #1426 (commit 86fc330)
disable log on startproject command (commit db4c9fe)
Add PyPI download stats badge (commit df2b944)
don’t run tests twice on Travis if a PR is made from a scrapy/scrapy branch (commit a83ab41)
Add Python 3 porting status badge to the README (commit 73ac80d)
fixed RFPDupeFilter persistence (commit 97d080e)
TST a test to show that dupefilter persistence is not working (commit 97f2fb3)
explicit close file on file:// scheme handler (commit d9b4850)
Disable dupefilter in shell (commit c0d0734)
DOC: Add captions to toctrees which appear in sidebar (commit aa239ad)
DOC Removed pywin32 from install instructions as it’s already declared as dependency. (commit 10eb400)
Added installation notes about using Conda for Windows and other OSes. (commit 1c3600a)
Fixed minor grammar issues. (commit 7f4ddd5)
fixed a typo in the documentation. (commit b71f677)
Version 1 now exists (commit 5456c0e)
fix another invalid xpath error (commit 0a1366e)
fix ValueError: Invalid XPath: //div/[id=”not-exists”]/text() on selectors.rst (commit ca8d60f)
Typos corrections (commit 7067117)
fix typos in downloader-middleware.rst and exceptions.rst, middlware -> middleware (commit 32f115c)
Add note to Ubuntu install section about Debian compatibility (commit 23fda69)
Replace alternative macOS install workaround with virtualenv (commit 98b63ee)
Reference Homebrew’s homepage for installation instructions (commit 1925db1)
Add oldest supported tox version to contributing docs (commit 5d10d6d)
Note in install docs about pip being already included in python>=2.7.9 (commit 85c980e)
Add non-python dependencies to Ubuntu install section in the docs (commit fbd010d)
Add macOS installation section to docs (commit d8f4cba)
DOC(ENH): specify path to rtd theme explicitly (commit de73b1a)
minor: scrapy.Spider docs grammar (commit 1ddcc7b)
Make common practices sample code match the comments (commit 1b85bcf)
nextcall repetitive calls (heartbeats). (commit 55f7104)
Backport fix compatibility with Twisted 15.4.0 (commit b262411)
pin pytest to 2.7.3 (commit a6535c2)
Merge pull request #1512 from mgedmin/patch-1 (commit 8876111)
Merge pull request #1513 from mgedmin/patch-2 (commit 5d4daf8)
Typo (commit f8d0682)
Fix list formatting (commit 5f83a93)
fix Scrapy squeue tests after recent changes to queuelib (commit 3365c01)
Merge pull request #1475 from rweindl/patch-1 (commit 2d688cd)
Update tutorial.rst (commit fbc1f25)
Merge pull request #1449 from rhoekman/patch-1 (commit 7d6538c)
Small grammatical change (commit 8752294)
Add openssl version to version command (commit 13c45ac)
Scrapy 1.0.3 (2015-08-11)
add service_identity to Scrapy install_requires (commit cbc2501)
Workaround for travis#296 (commit 66af9cd)
Scrapy 1.0.2 (2015-08-06)
Twisted 15.3.0 does not raises PicklingError serializing lambda functions (commit b04dd7d)
Minor method name fix (commit 6f85c7f)
minor: scrapy.Spider grammar and clarity (commit 9c9d2e0)
Put a blurb about support channels in CONTRIBUTING (commit c63882b)
Fixed typos (commit a9ae7b0)
Fix doc reference. (commit 7c8a4fe)
Scrapy 1.0.1 (2015-07-01)
Unquote request path before passing to FTPClient, it already escape paths (commit cc00ad2)
include tests/ to source distribution in MANIFEST.in (commit eca227e)
DOC Fix SelectJmes documentation (commit b8567bc)
DOC Bring Ubuntu and Archlinux outside of Windows subsection (commit 392233f)
DOC remove version suffix from Ubuntu package (commit 5303c66)
DOC Update release date for 1.0 (commit c89fa29)
Scrapy 1.0.0 (2015-06-19)
You will find a lot of new features and bugfixes in this major release. Make sure to check our updated overview to get a glance of some of the changes, along with our brushed tutorial.
Support for returning dictionaries in spiders
Declaring and returning Scrapy Items is no longer necessary to collect the scraped data from your spider, you can now return explicit dictionaries instead.
Classic version
class MyItem(scrapy.Item):
url = scrapy.Field()
class MySpider(scrapy.Spider):
def parse(self, response):
return MyItem(url=response.url)
New version
class MySpider(scrapy.Spider):
def parse(self, response):
return {'url': response.url}
Per-spider settings (GSoC 2014)
Last Google Summer of Code project accomplished an important redesign of the mechanism used for populating settings, introducing explicit priorities to override any given setting. As an extension of that goal, we included a new level of priority for settings that act exclusively for a single spider, allowing them to redefine project settings.
Start using it by defining a custom_settings
class variable in your spider:
class MySpider(scrapy.Spider):
custom_settings = {
"DOWNLOAD_DELAY": 5.0,
"RETRY_ENABLED": False,
}
Read more about settings population: Settings
Python Logging
Scrapy 1.0 has moved away from Twisted logging to support Python built in’s as default logging system. We’re maintaining backward compatibility for most of the old custom interface to call logging functions, but you’ll get warnings to switch to the Python logging API entirely.
Old version
from scrapy import log
log.msg('MESSAGE', log.INFO)
New version
import logging
logging.info('MESSAGE')
Logging with spiders remains the same, but on top of the
log() method you’ll have access to a custom
logger created for the spider to issue log
events:
class MySpider(scrapy.Spider):
def parse(self, response):
self.logger.info('Response received')
Read more in the logging documentation: Logging
Crawler API refactoring (GSoC 2014)
Another milestone for last Google Summer of Code was a refactoring of the internal API, seeking a simpler and easier usage. Check new core interface in: Core API
A common situation where you will face these changes is while running Scrapy from scripts. Here’s a quick example of how to run a Spider manually with the new API:
from scrapy.crawler import CrawlerProcess
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})
process.crawl(MySpider)
process.start()
Bear in mind this feature is still under development and its API may change until it reaches a stable status.
See more examples for scripts running Scrapy: Common Practices
Module Relocations
There’s been a large rearrangement of modules trying to improve the general
structure of Scrapy. Main changes were separating various subpackages into
new projects and dissolving both scrapy.contrib and scrapy.contrib_exp
into top level packages. Backward compatibility was kept among internal
relocations, while importing deprecated modules expect warnings indicating
their new place.
Full list of relocations
Outsourced packages
Note
These extensions went through some minor changes, e.g. some setting names were changed. Please check the documentation in each new repository to get familiar with the new usage.
Old location |
New location |
|---|---|
scrapy.commands.deploy |
scrapyd-client (See other alternatives here: Deploying Spiders) |
scrapy.contrib.djangoitem |
|
scrapy.webservice |
scrapy.contrib_exp and scrapy.contrib dissolutions
Old location |
New location |
|---|---|
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.* |
Plural renames and Modules unification
Old location |
New location |
|---|---|
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 |
Class renames
Old location |
New location |
|---|---|
scrapy.spidermanager.SpiderManager |
scrapy.spiderloader.SpiderLoader |
Settings renames
Old location |
New location |
|---|---|
SPIDER_MANAGER_CLASS |
SPIDER_LOADER_CLASS |
Changelog
New Features and Enhancements
Python logging (#1060, #1235, #1236, #1240, #1259, #1278, #1286)
Dns cache size and timeout options (#1132)
support namespace prefix in xmliter_lxml (#963)
Reactor threadpool max size setting (#1123)
Allow spiders to return dicts. (#1081)
Add Response.urljoin() helper (#1086)
look in ~/.config/scrapy.cfg for user config (#1098)
handle TLS SNI (#1101)
Added JmesSelect (#1016)
add gzip compression to filesystem http cache backend (#1020)
CSS support in link extractors (#983)
httpcache dont_cache meta #19 #689 (#821)
add signal to be sent when request is dropped by the scheduler (#961)
avoid download large response (#946)
Allow to specify the quotechar in CSVFeedSpider (#882)
Add referer to “Spider error processing” log message (#795)
process robots.txt once (#896)
GSoC Per-spider settings (#854)
Add project name validation (#817)
GSoC API cleanup (#816, #1128, #1147, #1148, #1156, #1185, #1187, #1258, #1268, #1276, #1285, #1284)
Do leveldb compaction for httpcache on closing (#1297)
Deprecations and Removals
Deprecate htmlparser link extractor (#1205)
remove deprecated code from FeedExporter (#1155)
a leftover for.15 compatibility (#925)
drop support for CONCURRENT_REQUESTS_PER_SPIDER (#895)
Drop old engine code (#911)
Deprecate SgmlLinkExtractor (#777)
Relocations
Move exporters/__init__.py to exporters.py (#1242)
rename SpiderManager to SpiderLoader (#1166)
Remove djangoitem (#1177)
remove scrapy deploy command (#1102)
dissolve contrib_exp (#1134)
Deleted bin folder from root, fixes #913 (#914)
Remove jsonrpc based webservice (#859)
Fix backward incompatibility for relocated paths in settings (#1267)
Documentation
CrawlerProcess documentation (#1190)
Favoring web scraping over screen scraping in the descriptions (#1188)
Some improvements for Scrapy tutorial (#1180)
Documenting Files Pipeline together with Images Pipeline (#1150)
deployment docs tweaks (#1164)
Added deployment section covering scrapyd-deploy and shub (#1124)
Adding more settings to project template (#1073)
some improvements to overview page (#1106)
Updated link in docs/topics/architecture.rst (#647)
DOC reorder topics (#1022)
updating list of Request.meta special keys (#1071)
DOC document download_timeout (#898)
DOC simplify extension docs (#893)
Leaks docs (#894)
DOC document from_crawler method for item pipelines (#904)
Spider_error doesn’t support deferreds (#1292)
Corrections & Sphinx related fixes (#1220, #1219, #1196, #1172, #1171, #1169, #1160, #1154, #1127, #1112, #1105, #1041, #1082, #1033, #944, #866, #864, #796, #1260, #1271, #1293, #1298)
Bugfixes
ItemLoader.load_item: iterate over copy of fields (#722)
Fix Unhandled error in Deferred (RobotsTxtMiddleware) (#1131, #1197)
Force to read DOWNLOAD_TIMEOUT as int (#954)
scrapy.utils.misc.load_object should print full traceback (#902)
Fix bug for “.local” host name (#878)
Fix for Enabled extensions, middlewares, pipelines info not printed anymore (#879)
fix dont_merge_cookies bad behaviour when set to false on meta (#846)
Python 3 In Progress Support
disable scrapy.telnet if twisted.conch is not available (#1161)
fix Python 3 syntax errors in ajaxcrawl.py (#1162)
more python3 compatibility changes for urllib (#1121)
assertItemsEqual was renamed to assertCountEqual in Python 3. (#1070)
Import unittest.mock if available. (#1066)
updated deprecated cgi.parse_qsl to use six’s parse_qsl (#909)
Prevent Python 3 port regressions (#830)
PY3: use MutableMapping for python 3 (#810)
PY3: use six.BytesIO and six.moves.cStringIO (#803)
PY3: fix xmlrpclib and email imports (#801)
PY3: use six for robotparser and urlparse (#800)
PY3: use six.iterkeys, six.iteritems, and tempfile (#799)
PY3: fix has_key and use six.moves.configparser (#798)
PY3: use six.moves.cPickle (#797)
PY3 make it possible to run some tests in Python3 (#776)
Tests
remove unnecessary lines from py3-ignores (#1243)
Fix remaining warnings from pytest while collecting tests (#1206)
Add docs build to travis (#1234)
TST don’t collect tests from deprecated modules. (#1165)
install service_identity package in tests to prevent warnings (#1168)
Fix deprecated settings API in tests (#1152)
Add test for webclient with POST method and no body given (#1089)
py3-ignores.txt supports comments (#1044)
modernize some of the asserts (#835)
selector.__repr__ test (#779)
Code refactoring
CSVFeedSpider cleanup: use iterate_spider_output (#1079)
remove unnecessary check from scrapy.utils.spider.iter_spider_output (#1078)
Pydispatch pep8 (#992)
Removed unused ‘load=False’ parameter from walk_modules() (#871)
For consistency, use
job_dirhelper inSpiderStateextension. (#805)rename “sflo” local variables to less cryptic “log_observer” (#775)