python网络爬虫系列(三)——cookie的原理、保存与加载
一、什么是cookie?
在網站中,http請求是無狀態的.也就是說即使第一次和服務器連接后并且登錄成功后,第二次請求服務器依然不能知道當前請求是哪個用戶。
cookie的出現就是為了解決這個問題,第一次登錄后服務器返回一些數據(cookie)給瀏覽器,然后瀏覽器保存在本地,當該用戶發送第二次請求的時候,就會自動的把上次請求存儲的cookie數據自動的攜帶給服務器,服務器通過瀏覽器攜帶的數據就能判斷當前用戶是哪個了。cookie存儲的數據量有限,不同的瀏覽器有不同的存儲大小,但一般不超過4KB.因此使用cookie 只能存儲一些小量的數據.
cookie的格式:
參數意義:
- NAME:cookie的名字。
- VALUE:cookie的值。
- Expires:cookie的過期時間。
- Path:cookie作用的路徑。
- Domain:cookie作用的域名。
- SECURE:是否只在https協議下起作用。
使用cookielib庫和HTTPCookieProcessor模擬登錄:
Cookie是指網站服務器為了辨別用戶身份和進行Session跟蹤,而儲存在用戶刻覽器上的文本文件,Cookie可以保持登錄信息到用戶下次與服務器的會話。
這里以人人網為例。人人網中,要訪問某個人的主頁,必須先登錄才能訪問,登錄說白了就是要有cookie信息。那么如果我們想要用代碼的方式訪問,就必須要有正確的cookie信息才能訪問。解決方案有兩種,第一種是使用刻覽器訪問,然后將cookie信息復制下來,放到headers中。示例代碼如下:
但是每次在訪問需要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 parseheaders = {"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創建一個openeropener = request.build_opener(handler)return openerdef 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方法,并且需要指定一個文件名:
通過http://httpbin.org/cookies/set?course=abc 來設置cookie:
加載保存在本地的cookie:
總結
以上是生活随笔為你收集整理的python网络爬虫系列(三)——cookie的原理、保存与加载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongoose 入门以及 mongoo
- 下一篇: 1+X web中级 Laravel学习笔