scrapy中的cookie与header管理
摘要:记录以下关于scrapy中的cookie管理,以前学的差不多了,但是没留下笔记啥的,所以这次记录以下。
scrapy中的cookie管理
在setting.py文件中有个选项叫做COOKIES_ENABLED
默认情况下为下面这样:
# COOKIES_ENABLED = False
- 当处于注释情况下,应该是COOKIES_ENABLED = True。scrapy会自动管理cookie。
COOKIES_ENABLED = False 时,应该是禁止浏览器返回的response使用set-cookie设置cookie,这个时候scrapy不会接受网站站设置的cookie。同时当COOKIES_ENABLED的值为False时使用
# 在spider目录下爬虫文件的start_requests方法下设置 cookies ={ 'authCode':'3a15f9d88833c3', 'uid':'1', 'PHPSESSID':'0tgqsqlrt', } return [scrapy.Request(url=self.url,callback=self.parse,cookies=cookies,dont_filter=True)]
以及在middlewares.py中设置cookie如下:
# 首先在settings.py给 DOWNLOADER_MIDDLEWARES 解注释。然后在middlewares中的DownloaderMiddleware的process_request方法中添加 request.cookies ={ 'authCode':'3a15f9d88833c3', 'uid':'1', 'PHPSESSID':'0tgqsqlrt', }
都会失效。这个时候只能通过在settings.py中的EFAULT_REQUEST_HEADERS设置cookie才会生效。
COOKIES_ENABLED = True 时,应该scrapy默认 COOKIES_ENABLED 的值就是True,这个时候无论是在 settings.py 中的 EFAULT_REQUEST_HEADERS设置cookie如下:
DEFAULT_REQUEST_HEADERS = { 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36', 'cookie':'authCode=3a15f9d88833c3;uid=1;PHPSESSID=0tgqsqlrt' }
还是在middlewares.py或者start_requests设置cookie都可以生效。
总结一下:
方法 | COOKIES_ENABLED = False | COOKIES_ENABLED = True | 注释状态 |
---|---|---|---|
DEFAULT_REQUEST_HEADERS | yes | yes | yes |
DOWNLOADER_MIDDLEWARES | no | yes | yes |
start_requests | no | yes | yes |
关于scrapy设置cookie优先级问题
当在middlewares.py中的DOWNLOADER_MIDDLEWARES里面的和cookies=cookies同时设置cookies时最后按照middlewares中的。
当在DEFAULT_REQUEST_HEADERS里面的和start_requests中的cookies=cookies同时设置cookies时最后按照cookies=cookies的。
获取scrapy中的cookie
获取request头的cookie
Cookie3 = response.request.headers.getlist('Cookie') print(Cookie3)
获取response中的cookie
Cookie = response.headers.getlist('Set-Cookie') print(Cookie)
保存response中的cookie
方法一:from scrapy.http.cookies import CookieJar cookie_jar = CookieJar() cookie_jar.extract_cookies(response, response.request) for cookie in cookie_jar: print(str(cookie)) with open('cookies.txt', 'w') as f: for cookie in cookie_jar: f.write(str(cookie) + '\n')
这个方法有缺陷。当使用scrapy.FormRequest或者scrapy.Response.FormRequest进行登陆时,scrapy发出第一次请求,网站返回第一次response。然后如果网站返回的第一次response包含重定向302,scrapy自动处理header中的302重定向,自动发出第二次请求。网站返回第二次response。这个时候获取的response是第二次response。用上面的方法获取不到第一次response中的cookie,并且第二次response中没有Set-Cookie字段,所以会失败。
方法二:同时对response和request获取cookie然后保存
Cookie = response.headers.getlist('Set-Cookie') print(Cookie.decode(encoding='utf-8')) Cookie3 = response.request.headers.getlist('Cookie') print(Cookie3.decode(encoding='utf-8'))
获取response和request的body
print(response.body.decode(encoding='utf-8'))
print(response.request.body.decode(encoding='utf-8'))
获取request的ua
ua = response.request.headers.getlist('user-agent')
print(ua)
获取response和request的headers
print(response.headers)
print(response.request.headers)
关于scrapy设置header以及优先级
在spider目录下爬虫文件的start_requests方法下设置header
# 在spider目录下爬虫文件的start_requests方法下设置 headers={ 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36', 'Origin': 'https://www.keepnight.com', } return [scrapy.Request(url=self.url,callback=self.parse,headers=headers,cookies=cookies,dont_filter=True)]
在settings.py中的DEFAULT_REQUEST_HEADERS设置header
DEFAULT_REQUEST_HEADERS = { 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36', 'Origin': 'https://www.keepnight.com', 'Content-Type': 'application/x-www-form-urlencoded', }
在settings.py中的USER_AGENT设置header
start_requests中设置headers=headers会优先于EFAULT_REQUEST_HEADERS,EFAULT_REQUEST_HEADERS优先于USER_AGENT, 当三个中的值冲突时时以headers=headers为准。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。