一、什麼是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()