一、什麼是cookie?
在網站中,http請求是無狀態的.也就是說即使第一次和服務器連接後並且登錄成功後,第二次請求服務器依然不能知道當前請求是哪個用戶。
cookie的出現就是爲了解決這個問題,第一次登錄後服務器返回一些數據(cookie)給瀏覽器,然後瀏覽器保存在本地,當該用戶發送第二次請求的時候,就會自動的把上次請求存儲的cookie數據自動的攜帶給服務器,服務器通過瀏覽器攜帶的數據就能判斷當前用戶是哪個了。cookie存儲的數據量有限,不同的瀏覽器有不同的存儲大小,但一般不超過4KB.因此使用cookie 只能存儲一些小量的數據.
cookie的格式:
Set-Cookie:NAME=VALUE:Expires/Max-age=DATE;Path=PATH;Domain=DONAIIN_NAME;SECURE
參數意義:
- NAME:cookie的名字。
- VALUE:cookie的值。
- Expires:cookie的過期時間。
- Path:cookie作用的路徑。
- Domain:cookie作用的域名。
- SECURE:是否只在https協議下起作用。
使用cookielib庫和HTTPCookieProcessor模擬登錄:
Cookie是指網站服務器爲了辨別用戶身份和進行Session跟蹤,而儲存在用戶刻覽器上的文本文件,Cookie可以保持登錄信息到用戶下次與服務器的會話。
這裏以人人網爲例。人人網中,要訪問某個人的主頁,必須先登錄才能訪問,登錄說白了就是要有cookie信息。那麼如果我們想要用代碼的方式訪問,就必須要有正確的cookie信息才能訪問。解決方案有兩種,第一種是使用刻覽器訪問,然後將cookie信息複製下來,放到headers中。示例代碼如下:
from urllib import request
# 1.不使用cookie請求大鵬主頁
# dapeng_url = "http://www.renren.com/880151247/profile"
# headers = {
# "User-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
#
# }
#
# req = request.Request(url=dapeng_url,headers=headers)
# resp = request.urlopen(req)
# # print(resp.read().decode('utf-8'))
# with open('renren.html','w') as fp:
# # write函數必須寫入一個str的數據類型
# # resp.read()讀出來的是bytes數據類型
# # bytes -> decode -> str
# # str -> encode -> bytes
# fp.write(resp.read().decode('utf-8'))
# 2.使用cookie
dapeng_url = "http://www.renren.com/880151247/profile"
headers = {
"User-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36",
"Cookie":"anonymid=kc8gdto1-vg5rhe; depovince=ZGQT; _r01_=1; taihe_bi_sdk_uid=e248d1662297420b5f06cd39f5473be6; JSESSIONID=abcd7dz_b4rckd6y2ZEmx; taihe_bi_sdk_session=73ccff9edc2442cb1943f51498722d59; ick_login=917cc18b-cda3-4db0-9cfb-da1e66d794ed; t=7e664919cb492b651432f05ae73537fd8; societyguester=7e664919cb492b651432f05ae73537fd8; id=974712998; xnsid=e1262476; jebecookies=cc307376-600f-4a31-8694-23c4c218aecb|||||; ver=7.0; loginfrom=null; XNESSESSIONID=ac057eb05af7; WebOnLineNotice_974712998=1"
}
req = request.Request(url=dapeng_url,headers=headers)
resp = request.urlopen(req)
# print(resp.read().decode('utf-8'))
with open('renren1.html','w',encoding='utf-8') as fp:
# write函數必須寫入一個str的數據類型
# resp.read()讀出來的是bytes數據類型
# bytes -> decode -> str
# str -> encode -> bytes
fp.write(resp.read().decode('utf-8'))
但是每次在訪問需要cookie的頁面都要從瀏覽器中複製cookiet較麻煩。在Python處理Cookie,一般是通過http.cookiejar模塊和ur11ib慣塊的HTTPCookieProcessor 處理器類一起使用。http.cookiejar模塊主要作用是提供用於存儲cookie的對象。
而HTTPCookieProcessor 處理器主要作用是處理這些cookie對象,並構建handler對象。
http.cookiejar模塊:
該模塊主要的類有CookieJar、FileCookieJar、MozllaCookieJar、LwPCookieJar。這四個類的作用分別如下:
-
CookieJar:管理HTTP cookie值、存儲HTTP請求生成的cookie、向傳出的HTTP請求添加cookie的對象。整個cookie都存儲在內存中,對CookieJar實例進行垃圾回收後cookie也將丟失。
-
FileCookieJar(filename.delayload=None,policy=None):從CookieJar派生而來,用來創建FileCookieJar實例,檢素cookie信息並將cookie存儲到文件中。filename是存儲cookie的文件名。delayload爲True時支持延遲訪問訪問文件,即只有在需要時纔讀取文件或在文件中存儲數據。
-
MozillaCookieJar(filename.delayload=None.policy=None):從FileCookieJar凝生而來,創建與Mozilla/覽器cookies.txt兼容的FileCookieJar實例。
-
LWPCookieJar(filename,delayload=None,policy=None):從FileCookieJar派生而來,創建與libwww-per標準的 Set-Cookie3文件格式兼容的FileCookieJar實例。
利用http.cookiejar和request.HTTPCookieprocessor登錄人人網。相關示例代碼如下:
from urllib import request
from http.cookiejar import CookieJar
from urllib import parse
# 1、登錄
# 1.1 創建一個cookiejar對象
cookiejar = CookieJar()
# 1.2 使用cookiejar創建一個HTTPCookieProcess對象
handler = request.HTTPCookieProcessor(cookiejar)
# 1.3 使用上一步創建的handler創建一個opener
opener = request.build_opener(handler)
# 1.4 使用opener發送登錄請求(人人網的郵箱和密碼)
headers = {
"User-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
}
data = {
'email':"你的用戶郵箱",
'password':"密碼"
}
login_url = "http://www.renren.com/PLogin.do"
req = request.Request(login_url,data=parse.urlencode(data).encode('utf-8'),headers=headers)
opener.open(req)
# 2、訪問個人主頁
dapeng_url = "http://www.renren.com/880151247/profile"
# 獲取個人主頁信息頁面時,不要新建opener
# 應該使用前面創建好的opener,因爲之前的那個opener已經包含了登錄所需要的cookie信息
req = request.Request(dapeng_url,headers=headers)
resp = opener.open(req)
with open('renren2.html','w',encoding='utf-8') as fp :
fp.write(resp.read().decode('utf-8'))
from urllib import request
from http.cookiejar import CookieJar
from urllib import parse
headers = {
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
}
def get_opener():
# 1、登錄
# 1.1 創建一個cookiejar對象
cookiejar = CookieJar()
# 1.2 使用cookiejar創建一個HTTPCookieProcess對象
handler = request.HTTPCookieProcessor(cookiejar)
# 1.3 使用上一步創建的handler創建一個opener
opener = request.build_opener(handler)
return opener
def login_renren(opener):
# 1.4 使用opener發送登錄請求(人人網的郵箱和密碼)
data = {
'email': "你的用戶郵箱",
'password': "密碼"
}
login_url = "http://www.renren.com/PLogin.do"
req = request.Request(login_url, data=parse.urlencode(data).encode('utf-8'), headers=headers)
opener.open(req)
def visit_profile(opener):
# 2、訪問個人主頁
dapeng_url = "http://www.renren.com/880151247/profile"
# 獲取個人主頁信息頁面時,不要新建opener
# 應該使用前面創建好的opener,因爲之前的那個opener已經包含了登錄所需要的cookie信息
req = request.Request(dapeng_url, headers=headers)
resp = opener.open(req)
with open('renren3.html', 'w', encoding='utf-8') 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
方法,並且需要指定一個文件名:
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar = MozillaCookieJar('cookie.txt')
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open('http://www.baidu.com/')
cookiejar.save()
通過http://httpbin.org/cookies/set?course=abc 來設置cookie:
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar = MozillaCookieJar('cookie1.txt')
# cookiejar.load()
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
# resp = opener.open('http://www.baidu.com/')
resp = opener.open('http://httpbin.org/cookies/set?course=abc')
# resp = opener.open('http://httpbin.org/cookies')
# for cookie in cookiejar:
# print(cookie)
cookiejar.save(ignore_discard=True)
加載保存在本地的cookie:
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar = MozillaCookieJar('cookie1.txt')
cookiejar.load(ignore_discard=True) # 加載保存在本地的cookie
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
# resp = opener.open('http://www.baidu.com/')
# resp = opener.open('http://httpbin.org/cookies/set?course=abc')
resp = opener.open('http://httpbin.org/cookies')
for cookie in cookiejar:
print(cookie)
# cookiejar.save(ignore_discard=True)