Scrapy框架--cookie的獲取/傳遞/本地保存


環境: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.Requestcookies參數中,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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM