在以前的文章中咱們介紹了一下 opener 應用中的 ProxyHandler 處理器(代理設置),本篇文章咱們再來看一下 opener 中的 Cookie 的使用。算法
Cookie 是指某些網站服務器爲了辨別用戶身份和進行Session跟蹤,而儲存在用戶瀏覽器上的文本文件,Cookie能夠保持登陸信息到用戶下次與服務器的會話。瀏覽器
HTTP是無狀態的面向鏈接的協議, 爲了保持鏈接狀態, 引入了Cookie機制 Cookie是http消息頭中的一種屬性,包括:安全
Cookie名字(Name) Cookie的值(Value) Cookie的過時時間(Expires/Max-Age) Cookie做用路徑(Path) Cookie所在域名(Domain), 使用Cookie進行安全鏈接(Secure)。 前兩個參數是Cookie應用的必要條件,另外,還包括Cookie大小(Size,不一樣瀏覽器對Cookie個數及大小限制是有差別的)。
Cookie由變量名和值組成,根據 Netscape公司的規定,Cookie格式以下:服務器
Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECUREcookie
Cookies在爬蟲方面最典型的應用是斷定註冊用戶是否已經登陸網站,用戶可能會獲得提示,是否在下一次進入此網站時保留用戶信息以便簡化登陸手續。post
1 import urllib.request 2 3 # 1. 構建一個已經登陸過的用戶的headers信息 4 headers = { 5 "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36", 6 "Cookie": "anonymid=jurpmxe9-orl7u3;" 7 "depovince=BJ;" 8 " _r01_=1; " 9 "JSESSIONID=abcwYLyIY7VNIhCDVWcPw;" 10 " jebe_key=f6fb270b-d06d-42e6-8b53-e67c3156aa7e%7Cc13c37f53bca9e1e7132d4b58ce00fa3%7C1484060607478%7C1%7C1484060607173;" 11 " jebecookies=f1fd29c4-bd08-4d66-8834-72e42b70d2cb|||||; " 12 "ick_login=0f790ea2-c8bf-4d64-a394-36745febeb26;" 13 " _de=622DE758381206EB340E4CEC836F3769696BF75400CE19CC;" 14 " p=7e50f3fe10ca320e36dae001c72d392d3;" 15 " ap=327550029;" 16 " first_login_flag=1;" 17 " ln_uact=562352353@qq.com;" 18 " ln_hurl=http://hdn.xnimg.cn/photos/hdn121/20120930/2035/h_main_hcDy_40fc000002d91375.jpg;" 19 " t=d7c6ae064b81ae15f5b91f5897dc61553;" 20 " societyguester=d7c6ae064b81ae15f5b91f5897dc61553;" 21 " id=485439163;" 22 " xnsid=bc995dc8;" 23 " ver=7.0;" 24 " loginfrom=null" 25 } 26 27 # 2. 經過headers裏的報頭信息(主要是Cookie信息),構建Request對象 28 request = urllib.request.Request("http://www.renren.com", headers=headers) 29 30 # 3. 直接訪問renren主頁,服務器會根據headers報頭信息(主要是Cookie信息),判斷這是一個已經登陸的用戶,並返回相應的頁面 31 response = urllib.request.urlopen(request) 32 33 # 4. 打印響應內容 34 print(response.read().decode("utf-8"))
可是這樣作太過複雜,咱們先須要在瀏覽器登陸帳戶,而且設置保存密碼,而且經過抓包才能獲取這個Cookie,那有麼有更簡單方便的方法呢?網站
在Python處理Cookie,通常是經過 http 模塊的 cookiejar 模塊和 urllib 模塊的 HTTPCookieProcessor
處理器類一塊兒使用。ui
cookiejar
模塊:主要做用是提供用於存儲cookie的對象加密
HTTPCookieProcessor
處理器:主要做用是處理這些cookie對象,並構建handler對象。url
1 import urllib.request 2 import urllib.parse 3 from http import cookiejar 4 5 # 1. 構建一個CookieJar對象實例來保存cookie 6 cookie = cookiejar.CookieJar() 7 8 # 2. 使用HTTPCookieProcessor()來建立cookie處理器對象,參數爲CookieJar()對象 9 cookie_handler = urllib.request.HTTPCookieProcessor(cookie) 10 11 # 3. 經過 build_opener() 來構建opener 12 opener = urllib.request.build_opener(cookie_handler) 13 14 # 4. addheaders 接受一個列表,裏面每一個元素都是一個headers信息的元祖, opener將附帶headers信息 15 opener.addheaders = [("User-Agent", 16 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36")] 17 18 # 5. 須要登陸的帳戶和密碼 19 data = {"email": "562352353@qq.com", "password": "chen562352353"} 20 21 # 6. 經過urlencode()轉碼 22 postdata = urllib.parse.urlencode(data).encode("utf-8") 23 24 # 7. 構建Request請求對象,包含須要發送的用戶名和密碼 25 request = urllib.request.Request("http://www.renren.com/PLogin.do", data=postdata) 26 27 # 8. 經過opener發送這個請求,並獲取登陸後的Cookie值, 28 opener.open(request) 29 30 # 9. opener包含用戶登陸後的Cookie值,能夠直接訪問那些登陸後才能夠訪問的頁面 31 response = opener.open("http://www.renren.com/485439163") 32 33 # 10. 打印響應內容 34 print(response.read().decode("utf-8"))
模擬登陸要注意幾點:
- 登陸通常都會先有一個HTTP GET,用於拉取一些信息及得到Cookie,而後再HTTP POST登陸。
- HTTP POST登陸的連接有多是動態的,從GET返回的信息中獲取。
- password 有些是明文發送,有些是加密後發送。有些網站甚至採用動態加密的,同時包括了不少其餘數據的加密信息,只能經過查看JS源碼得到加密算法,再去破解加密,很是困難。
- 大多數網站的登陸總體流程是相似的,可能有些細節不同,因此不能保證其餘網站登陸成功。