CookieMiddleware
class scrapy.downloadermiddlewares.cookies.CookieMiddlewar
该中间件使得爬取需要cookie(例如使用session)的网站成为了可能。 其追踪了web server发送的cookie,并在之后的request中发送回去, 就如浏览器所做的那样.
以下设置可以用来配置cookie中间件:
- COOKIES_ENABLED
- COOKIES_DEBUG
单spider多cookie session
Scrapy通过使用 cookiejar
Request meta key来支持单spider追踪多cookie session。 默认情况下其使用一个cookie jar(session),不过您可以传递一个标示符来使用多个。
注意这个标识符(即下面代码中的'i'),这里并不是说使用的cookie就是‘i’,而是第i个cookie!!'cookiejar'是meta的特殊关键字,不能以单纯的dict来看待。
cookie是追踪session的,会在request的过程中发生变化,比如在start_requests的时候模拟登陆,cookie就会记录登录信息,后续使用该cookie的request就
能继续沿用其中的cookie。
例如:
for i, url in enumerate(urls): yield scrapy.Request("http://www.example.com", meta={'cookiejar': i}, callback=self.parse_page)
需要注意的是 cookiejar
meta key不是”黏性的(sticky)”。 您需要在之后的request请求中接着传递。
def parse_page(self, response): # do some processing return scrapy.Request("http://www.example.com/otherpage", meta={'cookiejar': response.meta['cookiejar']}, callback=self.parse_other_page)
COOKIES_ENABLED
默认: True
是否启用cookiesmiddleware。如果关闭,cookies将不会发送给web server。
COOKIES_DEBUG
默认: False
如果启用,Scrapy将记录所有在request(cookie 请求头)发送的cookies及response接收到的cookies(set-cookie接收头)
下面是启用COOKIES_DEBUG的记录样例:
2011-04-06 14:35:10-0300 [scrapy] INFO: Spider opened 2011-04-06 14:35:10-0300 [scrapy] DEBUG: Sending cookies to: <GET http://www.diningcity.com/netherlands/index.html> Cookie: clientlanguage_nl=en_EN 2011-04-06 14:35:14-0300 [scrapy] DEBUG: Received cookies from: <200 http://www.diningcity.com/netherlands/index.html> Set-Cookie: JSESSIONID=B~FA4DC0C496C8762AE4F1A620EAB34F38; Path=/ Set-Cookie: ip_isocode=US Set-Cookie: clientlanguage_nl=en_EN; Expires=Thu, 07-Apr-2011 21:21:34 GMT; Path=/ 2011-04-06 14:49:50-0300 [scrapy] DEBUG: Crawled (200) <GET http://www.diningcity.com/netherlands/index.html> (referer: None) [...]
(翻译加个人理解,若有问题请指正,谢谢)
官方文档:https://doc.scrapy.org/en/1.3/topics/downloader-middleware.html#module-scrapy.downloadermiddlewares.cookies