環境:Python3.6 + Scrapy1.4
我要實現的東西:1. 完成模擬登陸
2. 登陸成功后提取出cookie,然后保存到本地cookie.txt文件中
3. 再次使用時從本地的cookie.txt中讀取cookie,省略模擬登陸.
看了一些關於Scrapy操作cookie的博客,寫的大同小異(都不好使...).我總結一下我嘗試出來的關於cookie的提取和傳遞的操作,親測可用
Cookie的傳遞和提取
from scrapy.http.cookies import CookieJar # 該模塊繼承自內置的http.cookiejar,操作類似
# 實例化一個cookiejar對象
cookie_jar = CookieJar()
# 首先是cookie的提取
class MySpider(scrapy.Spider):
....
....
# 模擬登陸,之后調用一個檢查是否登錄成功的函數
def login(self, response):
....
return [scrapy.FormRequest(
url=login_url,
formdata = {'username':xxx, 'password':xxx},
callback = self.check_login
)]
def check_login(self, response):
if 登錄成功:
# 到這里我們的登錄狀態已經寫入到response header中的'Set-Cookies'中了,
# 使用extract_cookies方法可以提取response中的cookie
cookiejar.extract_cookies(response, response.request)
# cookiejar是類字典類型的,將它寫入到文件中
with open('cookies.txt', 'w') as f:
for cookie in cookie_jar:
f.write(str(cookie) + '\n')
# 有些情況可能在發起登錄之前會有一些請求,會陸續的產生一些cookie,可以在第一次請求的時候將cookiejar寫入到request的meta中進行傳遞
scrapy.Request(url, callback=self.xxx, meta={'cookiejar': cookiejar})
# 之后每次需要傳遞這個cookiejar對象可以從response.meta中拿到
scrapy.Request(url, callback=self.xxx, meta={'cookiejar': response.meta['cookiejar']})
看了不少博文中只是寫將cookie添加到meta中,這樣就可以在請求的過程中獲取到cookie.我這樣嘗試過,cookiejar在多個請求-響應中流轉后依然是空的,所以只能在需要的時候使用cookiejar.extract_cookies方法進行手動提取.
若哪位大神知道meta中的cookiejar自行獲取cookie的方法,請評論指點,謝謝!
從本地文件中讀取Cookie
with open('cookies.txt', 'r') as f:
cookiejar = f.read()
p = re.compile(r'<Cookie (.*?) for .*?>')
cookies = re.findall(p, cookiejar)
cookies = (cookie.split('=', 1) for cookie in cookies)
cookies = dict(cookies)
之后可以在第一次發起請求(start_request)時將cookie手動添加到scrapy.Request的cookies參數中,cookie在后續的請求中會自行流轉.
scrapy.Request(url, callback=self.xxx, cookies=cookies)
關於request meta key中cookiejar的作用請參看[Scrapy源碼注解--CookiesMiddleware](http://www.cnblogs.com/thunderLL/p/8060279.html)--2017.12.18
