1. 程式人生 > >Python爬蟲-----什麼是Cookie

Python爬蟲-----什麼是Cookie

什麼是Cookie?(通常是加密的,SSL)

簡單來說,訪問每一個網際網路頁面,都是通過HTTP協議進行的,然而HTTP協議是一個無狀態協議,所謂的無狀態協議即無法維持會話之間的狀態。比如,在僅適用HTTP協議的話,登入一個網站的時候,假如登入成功了,但是當訪問該網站的其他頁面時,該登入狀態則會消失,此時還需要再次登入,這使得在訪問網頁的時候非常不方便。因此,需要一種辦法將登入資訊進行儲存,避免每次都需要登入的繁瑣操作。

實現以上操作的常見方法有兩種:通過Cookie儲存會話資訊或通過Session儲存會話資訊。

通過Cookie方式:如果採用該方式儲存會話資訊,此時會將所有的會話資訊儲存在客戶端,當我們訪問同一個網站的其他頁面時,會從Cookie中讀取對應的會話資訊,從而判斷目前的會話狀態,比如判斷是否已經登入。

通過Seesion方式:如果採用該方式儲存會話資訊,此時會將對應的會話資訊儲存在伺服器端,但是伺服器端給客戶端發SessionID等資訊,這些資訊一般儲存在客戶端的Cookie中,當然,如果客戶端禁用Cookie,也會通過其他方式儲存。但是,就目前而言,大部分情況還是會將這一部分的資訊存到Cookie中。然後使用者在訪問該網頁其他網頁時候,會從Cookie中讀取到這一部分資訊,然後從伺服器中的Session中根據這部分Cookie資訊檢索出該客戶端的所有會話資訊,然後進行會話控制。顯然,在使用Session方式時,也會用到Cookie。

因此,不管使用哪種方式,在大部分情況下,均使用Cookie方式進行會話資訊的儲存。比如在爬蟲的登入中,如果沒有Cookie,登入成功一個網站,但如果需要訪問該網站的其它頁面時,仍然會是未登入狀態。如果有了Cookie,當登入成功後,爬取該網站的其他網頁時,則仍然會儲存登入狀態對其內容進行爬取。

Python3.x中Cookie實戰

在Python3.x中可以使用Cookiejar庫進行處理,Python2中使用Cookielib庫進行處理

第一步:先開啟部落格園首頁,點選登入,並且輸入進去一個錯誤的使用者名稱和密碼

第二步:在瀏覽中按住F12,並且點選NetWork

第三步:點選登入

可以看到,在除錯介面中出現很多網址,這些網址大多數使用的是GET方法,只有一個使用了POST方法,這個使用POST方法的網址,在裡面可以分析出處理POST表單的真實頁面,即Request URL欄位的屬性值,即為POST表單的真實頁面:

第四步:接下來我們要構建需要傳遞的資訊,檢視登陸頁面的原始碼,並且找到登陸框對對應的HTTP原始碼。

可以看到,登入框中使用者名稱對應的表單name為:username,密碼對應的表單name為:password。

所以此時,需要構建資料中需要包含的這兩項,該資料可以構建為:

Login_data={

"username":"你自己的部落格園使用者名稱",

"password":“你自己的部落格園密碼”

}

第五步:有了這些資訊之後,便可以登入了,但是為了作者為了更好的學習,先使用無Cookie登入方式進行。

#匯入庫
import urllib.request
import urllib.parse

#真實的網頁URL
url="https://passport.cnblogs.com/user/signin"
#將表單資料進行urllib.parse.urlencode編碼處理後,在設定為utf-8格式
postdata=urllib.parse.urlencode(
    {
        "username":"你自己的使用者名稱",
        "password":"你自己的密碼"
    }
).encode('utf-8')
#建立Request物件
req=urllib.request.Request(url,postdata)
#對Request物件新增header中使用者代理欄位
req.add_header('User-Agent',"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
#登入並爬取對應網站
data=urllib.request.urlopen(req).read()
#對爬取到的網頁HTML進行處理
f=open("test.html","wb")#開啟當前路徑下檔案test.txt
f.write(data)#寫入檔案
f.close()#關閉檔案
url2="https://www.cnblogs.com"
#建立Request物件
req2=urllib.request.Request(url2)
#對Request物件新增header中使用者代理欄位
req2.add_header('User-Agent',"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
#登入並爬取對應網站
data2=urllib.request.urlopen(req2).read()
#對爬取到的網頁HTML進行處理
f2=open("test1.html","wb")#開啟當前路徑下檔案test.txt
f2.write(data2)#寫入檔案
f2.close()#關閉檔案
print("OK")

第六步:使用Cookie登入

進行Cookie登入常用的思路:

1:匯入Cookie處理模組Cookiejar

2:使用http.cookiejar.CookieJar()建立CookieJar物件

3:使用HTTPCookieProcessor建立Cookie處理器,並以其為引數建立opener物件

4:建立全域性預設的opener物件

#匯入庫
import urllib.request
import urllib.parse
import http.cookiejar

#真實的網頁URL
url="https://passport.cnblogs.com/user/signin"
#將表單資料進行urllib.parse.urlencode編碼處理後,在設定為utf-8格式
postdata=urllib.parse.urlencode(
    {
        "text":"使用者名稱",
        "password":"密碼"
    }
).encode('utf-8')
#建立Request物件
req=urllib.request.Request(url,postdata)
#對Request物件新增header中使用者代理欄位
req.add_header('User-Agent',"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
#使用http.cookiejar.CookieJar()建立CookieJar物件
cjar=http.cookiejar.CookieJar()
#使用HTTPCookieProcessor建立cookie處理器,並以其為引數構建opener物件
opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
#將opener設定為全域性
urllib.request.install_opener(opener)
#登入並爬取對應網站
data=opener.open(req).read()
#對爬取到的網頁HTML進行處理
f=open("test.html","wb")#開啟當前路徑下檔案test.txt
f.write(data)#寫入檔案
f.close()#關閉檔案
url2="https://www.cnblogs.com"
#建立Request物件
req2=urllib.request.Request(url2)
#對Request物件新增header中使用者代理欄位
req2.add_header('User-Agent',"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
#登入並爬取對應網站
data2=urllib.request.urlopen(req2).read()
#對爬取到的網頁HTML進行處理
f2=open("test1.html","wb")#開啟當前路徑下檔案test.txt
f2.write(data2)#寫入檔案
f2.close()#關閉檔案
print("OK")

以上步驟即可完成Cookie實戰。

但是,有很多網站現在都需要進行驗證才能登入,怎樣跳過這個驗證過程直接使用Cookie進行登入呢?