要在使用者瀏覽器上安裝cookie,HTTP伺服器向HTTP響應添加類似以下內容的HTTP前序:
複製代碼 代碼如下:
Set-Cookie:session=8345234;expires=Sun,15-Nov-2013 15:00:00 GMT;path=/;domain=baidu.com
expires是cookie的生存周期,path是cookie的有效路徑,domain是cookie的有效域.
路徑"path"用於設定可以讀取一個cookie的最頂層的目錄.
將cookie的路徑設定為你的網頁最頂層的目錄可以讓該該目錄下的所有網頁都能訪問該cookie.
方法:在你的cookie中加入path=/; 如果你只想讓"food" 目錄中的網頁可以使用該cookie,則你加入path=/food;.
domain:有些網站有許多小的網域名稱,例如百度可能還在"news.baidu.com" "zhidao.baidu.com" 和"v.baidu.com" 網域名稱下有網頁.
如果想讓"baidu.com"下的所有機器都可以讀取該cookie,必須在cookie中加入 "domain=.baidu.com" .
使用者瀏覽器會儲存Cookie直到到期,瀏覽器會向符合path和domain的伺服器發送類似以下內容的HTTP請求前序:
複製代碼 代碼如下:
Cookie:session=8345234。
例如,登陸www.baidu.com的時候,百度伺服器發送回的HTTP響應前序中cookie是:
複製代碼 代碼如下:
Set-Cookie:H_PS_PSSID=4681_4567_1452_9876_4759; path=/; domain=.baidu.com
Set-Cookie:BDSVRTM=74; path=/
瀏覽器的HTTP請求前序:
複製代碼 代碼如下:
Cookie:BAIDUID=0FD996SDFG12********107B9C227F4C:FG=1; locale=zh; bdshare_firstime=1384567418140; NBID=D830DD2345HH2818A9F4134E5A2D778D3B:FG=1; H_PS_LC=4_shadu2014; BD_CK_SAM=1; H_PS_PSSID=4681_4567_1452_9876_4759
瀏覽器將cookie發送回HTTP伺服器時,使用key=value字串的編碼形式,不返回expires,path和domain等可選屬性。
cookie字串通常位於HTTP_COOKIE環境變數中,可以如下讀取:
複製代碼 代碼如下:
import os
print "Content-type: text/plain\n"
if "HTTP_COOKIE" in os.environ:
print os.environ["HTTP_COOKIE"]
else:
print "HTTP_COOKIE not set!"
Python中Cookie模組(python2,python3中為http.cookies)提供了一個類似字典的特殊對象SimpleCookie,其中儲存並管理著稱為Morsel的cookie值集合。
每個Morsel都有name,value以及可選屬性(expires,path,domain,comment,max-age,secure,version,httponly)。
SimpleCookie可使用output()方法建立以HTTP前序形式表示的cookie資料輸出,用js_output()方法產生包含javascript代碼的字串。
用HTTP_COOKIE產生cookie:
複製代碼 代碼如下:
cookie=Cookie.SimpleCookie(os.environ['HTTP_COOKIE'])
print cookie.output()
set cookie:
複製代碼 代碼如下:
import Cookie
import datetime
import random
expiration = datetime.datetime.now() + datetime.timedelta(days=30)
cookie = Cookie.SimpleCookie()
cookie["session"] = random.randint(1,1000000000)
cookie["session"]["domain"] = ".baidu.com"
cookie["session"]["path"] = "/"
cookie["session"]["expires"] = expiration.strftime("%a, %d-%b-%Y %H:%M:%S PST")
print "Content-type: text/plain"
print cookie.output()
print
print "Cookie set with: " + cookie.output()
輸出:
複製代碼 代碼如下:
Content-type: text/plain
Set-Cookie: session=155209565; Domain=.jayconrod.com; expires=Mon, 03-Mar-2014 07:42:47 PST; Path=/
Cookie set with: Set-Cookie: session=155209565; Domain=.jayconrod.com; expires=Mon, 03-Mar-2014 07:42:47 PST; Path=/
Python中cookielib庫(python3中為http.cookiejar)為儲存和管理cookie提供用戶端支援。
該模組主要功能是提供可儲存cookie的對象。使用此模組捕獲cookie並在後續串連請求時重新發送,還可以用來
處理包含cookie資料的檔案。
這個模組主要提供了這幾個對象,CookieJar,FileCookieJar,MozillaCookieJar,LWPCookieJar。
CookieJarObject Storage Service在記憶體中。
複製代碼 代碼如下:
>>> import urllib2
>>> import cookielib
>>> cookie=cookielib.CookieJar()
>>> handler=urllib2.HTTPCookieProcessor(cookie)
>>> opener=urllib2.build_opener(handler)
>>> opener.open('http://www.google.com.hk')<addinfourl at 161806444 whose fp = <socket._fileobject object at 0x9a348ac>>
訪問google的cookie已經被捕捉了。
來看下是怎樣的:
複製代碼 代碼如下:
>>> print cookie
<cookielib.CookieJar[<Cookie NID=67=B6YQoEIEjcqDj-adada_WmNYl_JvADsDEDchFTMtAgERTgRjK452ko6gr9G0Q5p9h1vlmHpCR56XCrWwg1pv6iqhZnaVlnwoeM-Ln7kIUWi92l-X2fvUqgwDnN3qowDW for .google.com.hk/>, <Cookie PREF=ID=7ae0fa51234ce2b1:FF=0:NW=1:TM=1391219446:LM=1391219446:S=cFiZ5X8ts9NY3cmk for .google.com.hk/>]>
看來是Cookie執行個體的集合,Cookie執行個體有name,value,path,expires等屬性:
複製代碼 代碼如下:
>>> for ck in cookie:
... print ck.name,':',ck.value
...
NID : 67=B6YQoEIEjcqDj-adada_WmNYl_JvADsDEDchFTMtAgERTgRjK452ko6gr9G0Q5p9h1vlmHpCR56XCrWwg1pv6iqhZnaVlnwoeM-Ln7kIUWi92l-X2fvUqgwDnN3qowDW
PREF : ID=7ae0fa51234ce2b1:FF=0:NW=1:TM=1391219446:LM=1391219446:S=cFiZ5X8ts9NY3cmk
也可以將cookie捕捉到檔案中。
FileCookieJar(filename)
建立FileCookieJar執行個體,檢索cookie資訊並將資訊儲存到檔案中,filename是檔案名稱。
MozillaCookieJar(filename)
建立與Mozilla cookies.txt檔案相容的FileCookieJar執行個體。
LWPCookieJar(filename)
建立與libwww-perl Set-Cookie3檔案相容的FileCookieJar執行個體。
代碼:
複製代碼 代碼如下:
import urllib2
import cookielib
def HandleCookie():
#handle cookie whit file
filename='FileCookieJar.txt'
url='http://www.google.com.hk'
FileCookieJar=cookielib.LWPCookieJar(filename)
FileCookeJar.save()
opener =urllib2.build_opener(urllib2.HTTPCookieProcessor(FileCookieJar))
opener.open(url)
FileCookieJar.save()
print open(filename).read()
#read cookie from file
readfilename = "readFileCookieJar.txt"
MozillaCookieJarFile =cookielib.MozillaCookieJar(readfilename)
print MozillaCookieJarFile
MozillaCookieJarFile.load(cookieFilenameMozilla)
print MozillaCookieJarFile
if __name__=="__main__":
HandleCookie()