07Python爬蟲---Cookie實戰

一、什麼是Cookie

  我們在瀏覽器中,經常涉及到數據的交換,比如你登錄郵箱,登錄一個頁面。我們經常會在此時設置30天內記住我,或者自動登錄選項。那麼它們是怎麼記錄信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服務器設置的,保存在瀏覽器中,但HTTP協議是一種無狀態協議,在數據交換完畢後,服務器端和客戶端的鏈接就會關閉,每次交換數據都需要建立新的鏈接。就像我們去超市買東西,沒有積分卡的情況下,我們買完東西之後,超市沒有我們的任何消費信息,但我們辦了積分卡之後,超市就有了我們的消費信息。cookie就像是積分卡,可以保存積分,商品就是我們的信息,超市的系統就像服務器後臺,http協議就是交易的過程。

二、爬蟲Cookie實戰

此次實戰登錄ChinaUnix論壇

(1)無cookie處理登錄

步驟:
(1)使用urllib.request.Resquest創建對象
(2)add_header添加頭部信息
(3)urllib.request.urlopen進行登錄並讀取
(4)將爬取的網頁保存到本地
(5)登錄後再爬取該網頁下的其他網頁進行爬取
import urllib.request
import urllib.parse
url = "http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LfgTz"
postdata = urllib.parse.urlencode({
    "username": "weisuen",
    "password": "aA123456"
}).encode('utf-8')  # 使用urlencode編碼處理後,再設置爲utf-8編碼

req = urllib.request.Request(url, postdata)  # 構建Resquest對象

req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36")

data = urllib.request.urlopen(req).read()  #登錄並爬取對應的網頁
fhandle = open("/home/zyb/crawler/myweb/part5/chinaUnixLogin.html", "wb")
fhandle.write(data)
fhandle.close()

url2 = "http://bbs.chinaunix.net/"  # 設置要爬取的該網站下其他網頁地址
req2 = urllib.request.Request(url2, postdata)
req2.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36")
data2 = urllib.request.urlopen(req2).read()  # 爬取該站下的其他網頁
fhandle2 = open("/home/zyb/crawler/myweb/part5/chinaUnixBBS.html", "wb")
fhandle2.write(data2)
fhandle2.close()

網頁效果展示
這裏寫圖片描述


問題:登陸後,打開本地第二個網頁還是未登錄狀態
問題由來:因爲我們沒有設置Cookie,而HTTP協議是一個無狀態的協議,訪問新的網頁,自然會話信息會消失

(2)問題解決

解決方案
(1)導入Cookie處理模塊http.cookiejar
(2)使用http.cookiejar.CookieJar()創建CookieJar對象
(3)使用HTTPCookieProcessor創建cookie處理器,並以其爲參數構建opener對象。
(4)創建全局默認的opener對象
import urllib.request
import urllib.parse
import http.cookiejar
url = "http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LfgTz"
postdata = urllib.parse.urlencode({  #  此處登錄可用自己在網站上註冊的用戶名和密碼
    "username": "weisuen",
    "password": "aA123456"
}).encode("utf-8")
req = urllib.request.Request(url, postdata)
req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 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)
file = opener.open(req)
data = file.read()
file = open("/home/zyb/crawler/myweb/part5/chinaUnixLogin_2.html", "wb")
file.write(data)
file.close()

url2 = "http://bbs.chinaunix.net/"  # 設置要爬取的該網站下其他網頁地址
data2 = urllib.request.urlopen(url2).read()
fhandle = open("/home/zyb/crawler/myweb/part5/chinaUnixBBS_2.html", "wb")
fhandle.write(data2)
fhandle.close()

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章