Cookie 是指某些網(wǎng)站服務(wù)器為了辨別用戶身份和進行Session跟蹤,而儲存在用戶瀏覽器上的文本文件,Cookie可以保持登錄信息到用戶下次與服務(wù)器的會話。
Cookie原理 HTTP是無狀態(tài)的面向連接的協(xié)議, 為了保持連接狀態(tài), 引入了Cookie機制 Cookie是http消息頭中的一種屬性,包括:
| Name | Cookie名字 |
|---|---|
| Value | Cookie的值 |
| Expires/Max-Age | Cookie的過期時間 |
| Path | Cookie作用路徑 |
| Domain | Cookie所在域名 |
| 使用Cookie進行安全連接(Secure),指的是該cookies是否能僅能夠被安全協(xié)議傳輸。 | |
| sameSite是否是同一個站點 |
- 前兩個參數(shù)是Cookie應(yīng)用的必要條件,另外,還包括Cookie大?。⊿ize,不同瀏覽器對Cookie個數(shù)及大小限制是有差異的)。
Cookies保持狀態(tài)
當(dāng)客戶端第一次請求服務(wù)器時,服務(wù)器會返回一個請求頭中帶有Set-Cookie字段的響應(yīng)給客戶端,用來標記是哪一個用戶,客戶端瀏覽器會把Cookies保存起來。當(dāng)瀏覽器下一次再請求該網(wǎng)站時,瀏覽器會把此Cookies放到請求頭一起提交給服務(wù)器,Cookies攜帶了會話ID信息,服務(wù)器檢查該Cookies即可找到對應(yīng)的會話是什么,然后再判斷會話來以此來辨認用戶狀態(tài)。
在成功登錄某個網(wǎng)站時,服務(wù)器會告訴客戶端設(shè)置哪些Cookies信息,在后續(xù)訪問頁面時客戶端會把Cookies發(fā)送給服務(wù)器,服務(wù)器再找到對應(yīng)的會話加以判斷。如果會話中的某些設(shè)置登錄狀態(tài)的變量是有效的,那就證明用戶處于登錄狀態(tài),此時返回登錄之后才可以查看的網(wǎng)頁內(nèi)容,瀏覽器再進行解析便可以看到了。
反之,如果傳給服務(wù)器的Cookies是無效的,或者會話已經(jīng)過期了,我們將不能繼續(xù)訪問頁面,此時可能會收到錯誤的響應(yīng)或者跳轉(zhuǎn)到登錄頁面重新登錄。
所以,Cookies和會話需要配合,一個處于客戶端,一個處于服務(wù)端,二者共同協(xié)作,就實現(xiàn)了登錄會話控制。
Cookie由變量名和值組成,根據(jù) Netscape公司的規(guī)定,Cookie格式如下:
Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
Cookie應(yīng)用 Cookies在爬蟲方面最典型的應(yīng)用是判定注冊用戶是否已經(jīng)登錄網(wǎng)站,用戶可能會得到提示,是否在下一次進入此網(wǎng)站時保留用戶信息以便簡化登錄手續(xù)。
實例
對人人網(wǎng)進行模擬登錄

獲取到一個有登錄信息的Cookie模擬登陸
# -*- coding:utf-8 -*-
import urllib.request
url = 'http://www.renren.com/'
#根據(jù)剛才的登錄信息來構(gòu)建一個已經(jīng)登錄過的用戶的headers信息
headers = {
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'User-Agent':' Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:59.0) Gecko/20100101 Firefox/59.0',
'Upgrade-Insecure-Requests':'1',
'Connection':'keep-alive',
'Host':'www.renren.com',
'Cookie':'anonymid=jgoj4xlw-3izsk4; depovince=BJ; jebecookies=62d94404-de1f-450a-919b-a2d9f4c8b811|||||; _r01_=1; JSESSIONID=abchsGLNgne0L8_wz2Emw; ick_login=cf54f2dc-8b0b-417a-96b2-32d4051f7236; jebe_key=02cb19ad-2966-4641-8828-217160ca67a0%7Cba6f6d6ec917200a4e17a85dbfe33a4a%7C1525230975024%7C1%7C1525230982574; t=87a502d75601f8e8c0c6e0f79c7c07c14; societyguester=87a502d75601f8e8c0c6e0f79c7c07c14; id=965706174; xnsid=e1264d85; ver=7.0; loginfrom=null; wp_fold=0',
}
# 2. 通過headers里的報頭信息(主要是Cookie信息),構(gòu)建Request對象
request = urllib.request.Request(url, headers=headers)
# 3. 直接訪問renren主頁,服務(wù)器會根據(jù)headers報頭信息(主要是Cookie信息)
#,判斷這是一個已經(jīng)登錄的用戶,并返回相應(yīng)的頁面
response = urllib.request.urlopen(request)
# 4. 打印響應(yīng)內(nèi)容
print (response.read().decode())