什么是cookie:
在網(wǎng)站中绣夺,http請(qǐng)求是無(wú)狀態(tài)的。也就是說(shuō)即使第一次和服務(wù)器連接后并且登錄成功后荆秦,第二次請(qǐng)求服務(wù)器依然不能知道當(dāng)前請(qǐng)求是哪個(gè)用戶背捌。cookie的出現(xiàn)就是為了解決這個(gè)問(wèn)題,第一次登錄后服務(wù)器返回一些數(shù)據(jù)(cookie)給瀏覽器路狮,然后瀏覽器保存在本地虫啥,當(dāng)該用戶發(fā)送第二次請(qǐng)求的時(shí)候,就會(huì)自動(dòng)的把上次請(qǐng)求存儲(chǔ)的cookie數(shù)據(jù)自動(dòng)的攜帶給服務(wù)器奄妨,服務(wù)器通過(guò)瀏覽器攜帶的數(shù)據(jù)就能判斷當(dāng)前用戶是哪個(gè)了涂籽。cookie存儲(chǔ)的數(shù)據(jù)量有限,不同的瀏覽器有不同的存儲(chǔ)大小砸抛,但一般不超過(guò)4KB评雌。因此使用cookie只能存儲(chǔ)一些小量的數(shù)據(jù)。
cookie的格式:
Set-Cookie: NAME=VALUE直焙;Expires/Max-age=DATE景东;Path=PATH;Domain=DOMAIN_NAME奔誓;SECURE
參數(shù)意義:
- NAME:cookie的名字耐薯。
- VALUE:cookie的值。
- Expires:cookie的過(guò)期時(shí)間丝里。
- Path:cookie作用的路徑曲初。
- Domain:cookie作用的域名。
- SECURE:是否只在https協(xié)議下起作用杯聚。
使用cookielib
庫(kù)和HTTPCookieProcessor
模擬登錄:
Cookie 是指網(wǎng)站服務(wù)器為了辨別用戶身份和進(jìn)行Session跟蹤臼婆,而儲(chǔ)存在用戶瀏覽器上的文本文件,Cookie可以保持登錄信息到用戶下次與服務(wù)器的會(huì)話幌绍。
這里以人人網(wǎng)為例颁褂。人人網(wǎng)中故响,要訪問(wèn)某個(gè)人的主頁(yè),必須先登錄才能訪問(wèn)颁独,登錄說(shuō)白了就是要有cookie信息彩届。那么如果我們想要用代碼的方式訪問(wèn),就必須要有正確的cookie信息才能訪問(wèn)誓酒。解決方案有兩種樟蠕,第一種是使用瀏覽器訪問(wèn),然后將cookie信息復(fù)制下來(lái)靠柑,放到headers中寨辩。示例代碼如下:
from urllib import request
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',
'Cookie': 'anonymid=jacdwz2x-8bjldx; depovince=GW; _r01_=1; _ga=GA1.2.1455063316.1511436360; _gid=GA1.2.862627163.1511436360; wp=1; JSESSIONID=abczwY8ecd4xz8RJcyP-v; jebecookies=d4497791-9d41-4269-9e2b-3858d4989785|||||; ick_login=884e75d4-f361-4cff-94bb-81fe6c42b220; _de=EA5778F44555C091303554EBBEB4676C696BF75400CE19CC; p=61a3c7d0d4b2d1e991095353f83fa2141; first_login_flag=1; ln_uact=970138074@qq.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn121/20170428/1700/main_nhiB_aebd0000854a1986.jpg; t=3dd84a3117737e819dd2c32f1cdb91d01; societyguester=3dd84a3117737e819dd2c32f1cdb91d01; id=443362311; xnsid=169efdc0; loginfrom=syshome; ch_id=10016; jebe_key=9c062f5a-4335-4a91-bf7a-970f8b86a64e%7Ca022c303305d1b2ab6b5089643e4b5de%7C1511449232839%7C1; wp_fold=0'
}
url = 'http://www.renren.com/880151247/profile'
req = request.Request(url,headers=headers)
resp = request.urlopen(req)
with open('renren.html','w') as fp:
fp.write(resp.read().decode('utf-8'))
但是每次在訪問(wèn)需要cookie的頁(yè)面都要從瀏覽器中復(fù)制cookie比較麻煩。在Python處理Cookie歼冰,一般是通過(guò)http.cookiejar
模塊和urllib
模塊的HTTPCookieProcessor
處理器類一起使用靡狞。http.cookiejar
模塊主要作用是提供用于存儲(chǔ)cookie的對(duì)象。而HTTPCookieProcessor
處理器主要作用是處理這些cookie對(duì)象隔嫡,并構(gòu)建handler對(duì)象甸怕。
http.cookiejar模塊:
該模塊主要的類有CookieJar、FileCookieJar腮恩、MozillaCookieJar梢杭、LWPCookieJar。這四個(gè)類的作用分別如下:
CookieJar
:管理HTTP cookie值庆揪、存儲(chǔ)HTTP請(qǐng)求生成的cookie式曲、向傳出的HTTP請(qǐng)求添加cookie的對(duì)象。整個(gè)cookie都存儲(chǔ)在內(nèi)存中缸榛,對(duì)CookieJar
實(shí)例進(jìn)行垃圾回收后cookie也將丟失吝羞。
FileCookieJar (filename,delayload=None,policy=None)
:從CookieJar
派生而來(lái),用來(lái)創(chuàng)建FileCookieJar
實(shí)例内颗,檢索cookie信息并將cookie存儲(chǔ)到文件中钧排。filename
是存儲(chǔ)cookie的文件名。delayload
為True時(shí)支持延遲訪問(wèn)訪問(wèn)文件均澳,即只有在需要時(shí)才讀取文件或在文件中存儲(chǔ)數(shù)據(jù)恨溜。
MozillaCookieJar
(filename,delayload=None,policy=None):從FileCookieJar
派生而來(lái),創(chuàng)建與Mozilla瀏覽器 cookies.txt兼容的FileCookieJar
實(shí)例找前。
LWPCookieJar (filename,delayload=None,policy=None)
:從FileCookieJar
派生而來(lái)糟袁,創(chuàng)建與libwww-perl標(biāo)準(zhǔn)的 Set-Cookie3 文件格式兼容的FileCookieJar
實(shí)例。
登錄人人網(wǎng):
利用http.cookiejar
和request.HTTPCookieProcessor
登錄人人網(wǎng)躺盛。相關(guān)示例代碼如下:
from urllib import request,parse
from http.cookiejar import CookieJar
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
}
def get_opener():
cookiejar = CookieJar()
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
return opener
def login_renren(opener):
data = {"email": "970138074@qq.com", "password": "pythonspider"}
data = parse.urlencode(data).encode('utf-8')
login_url = "http://www.renren.com/PLogin.do"
req = request.Request(login_url, headers=headers, data=data)
opener.open(req)
def visit_profile(opener):
url = 'http://www.renren.com/880151247/profile'
req = request.Request(url,headers=headers)
resp = opener.open(req)
with open('renren.html','w') as fp:
fp.write(resp.read().decode("utf-8"))
if __name__ == '__main__':
opener = get_opener()
login_renren(opener)
visit_profile(opener)
保存cookie到本地:
保存cookie到本地项戴,可以使用cookiejar
的save
方法,并且需要指定一個(gè)文件名:
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar = MozillaCookieJar("cookie.txt")
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
}
req = request.Request('http://httpbin.org/cookies',headers=headers)
resp = opener.open(req)
print(resp.read())
cookiejar.save(ignore_discard=True,ignore_expires=True)
從本地加載cookie:
從本地加載cookie槽惫,需要使用cookiejar
的load
方法周叮,并且也需要指定方法:
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar = MozillaCookieJar("cookie.txt")
cookiejar.load(ignore_expires=True,ignore_discard=True)
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
}
req = request.Request('http://httpbin.org/cookies',headers=headers)
resp = opener.open(req)
print(resp.read())