Python 爬蟲從入門到進階之路(六)


在之前的文章中我們介紹了一下 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;SECURE

Cookie應用

Cookies在爬蟲方面最典型的應用是判定注冊用戶是否已經登錄網站,用戶可能會得到提示,是否在下一次進入此網站時保留用戶信息以便簡化登錄手續。

 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,那有么有更簡單方便的方法呢?

cookielib庫 和 HTTPCookieProcessor處理器

在Python處理Cookie,一般是通過 http 模塊的 cookiejar 模塊和 urllib 模塊的 HTTPCookieProcessor 處理器類一起使用。

cookiejar模塊:主要作用是提供用於存儲cookie的對象

HTTPCookieProcessor處理器:主要作用是處理這些cookie對象,並構建handler對象。

 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"))

 模擬登錄要注意幾點:

  1. 登錄一般都會先有一個HTTP GET,用於拉取一些信息及獲得Cookie,然后再HTTP POST登錄。
  2. HTTP POST登錄的鏈接有可能是動態的,從GET返回的信息中獲取。
  3. password 有些是明文發送,有些是加密后發送。有些網站甚至采用動態加密的,同時包括了很多其他數據的加密信息,只能通過查看JS源碼獲得加密算法,再去破解加密,非常困難。
  4. 大多數網站的登錄整體流程是類似的,可能有些細節不一樣,所以不能保證其他網站登錄成功。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM