requests有關cookie的使用

requests有關cookie的使用


最近用requests把百度貼吧的腳本重寫了一遍,把用urllib模擬登陸的部分全部重寫了一遍,算是滲入接觸了一下requests,感覺確實方便了很多。

基本使用

get_req = requests.get(url, [cookies, headers])
post_req = requests.post(url, data, [cookies, headers])

req.text #unicode格式的內容,有些gzip格式的返回數據用這個可以直接顯示,很方便
req.content #我猜是原始內容?
req.cookies #獲取的cookies,可以用keys()和values()看內容,但本身不是字典格式,以下可以打印出字典方式查看
print {c.name: c.value for c in req.cookies}

高級用法

這裏主要用了session類,因爲我需要把從登陸開始的cookies數據保存着一直都要用,只用單個的req然後cookies存來存去肯定不方便,用Session類就方便很多了。

bd_session = requests.Session()
bd_session.get(...)
bd_session.post(...)

我的代碼中會把登陸之後得到的cookies保存在本地,下次先嚐試用cookies登陸,失敗再重新登陸,所以有一個cookies保存到本地的問題。
requests庫中的cookies類型,在文檔中看到是RequestsCookieJar這麼一個類,詳細說明如下:

class requests.cookies.RequestsCookieJar(policy=None)

Compatibility class; is a cookielib.CookieJar, but exposes a dict interface.

This is the CookieJar we create by default for requests and sessions that don’t specify one, since some clients may expect response.cookies and session.cookies to support dict operations.

Requests does not use the dict interface internally; it’s just for compatibility with external client code. All requests code should work out of the box with externally provided instances of CookieJar, e.g. LWPCookieJar and FileCookieJar.

Unlike a regular CookieJar, this class is pickleable.

對於cookies格式的轉化,提供了三個工具方法:

requests.utils.dict_from_cookiejar(cj)

Returns a key/value dictionary from a CookieJar.
Parameters: cj – CookieJar object to extract cookies from.

requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)

Returns a CookieJar from a key/value dictionary.
Parameters: 

    cookie_dict – Dict of key/values to insert into CookieJar.
    cookiejar – (optional) A cookiejar to add the cookies to.
    overwrite – (optional) If False, will not replace cookies already in the jar with new ones.

requests.utils.add_dict_to_cookiejar(cj, cookie_dict)

Returns a CookieJar from a key/value dictionary.
Parameters: 

    cj – CookieJar to insert cookies into.
    cookie_dict – Dict of key/values to insert into CookieJar.

但都是cookiejar和字典格式之間的轉換,並沒有幾種cookies格式相互的轉換,所以我是以字典爲中間格式進行轉換的。

讀取cookies

在這裏我用的是LWPCookieJar保存在txt文件中

#實例化一個LWPCookieJar對象
load_cookiejar = cookielib.LWPCookieJar()
#從文件中加載cookies(LWP格式)
load_cookiejar.load('cookies/' + self.username + '.txt', ignore_discard=True, ignore_expires=True)
#工具方法轉換成字典
load_cookies = requests.utils.dict_from_cookiejar(load_cookiejar)
#工具方法將字典轉換成RequestsCookieJar,賦值給session的cookies.
self.session.cookies = requests.utils.cookiejar_from_dict(load_cookies)

存儲cookies

將cookies轉換成LWP格式然後保存爲文本格式

#實例化一個LWPcookiejar對象
new_cookie_jar = cookielib.LWPCookieJar(self.username + '.txt')

#將轉換成字典格式的RequestsCookieJar(這裏我用字典推導手動轉的)保存到LWPcookiejar中
requests.utils.cookiejar_from_dict({c.name: c.value for c in self.session.cookies}, new_cookie_jar)

#保存到本地文件
new_cookie_jar.save('cookies/' + self.username + '.txt', ignore_discard=True, ignore_expires=True)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章