這一片是繼 《Python之爬蟲-- cookie & session》這一篇之後在網上找到的一篇小練習,也是對cookie有更深的認識
一、爲什麼要使用Cookie
Cookie,指某些網站爲了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(通常經過加密)。
比如說有些網站需要登錄後才能訪問某個頁面,在登錄之前,你想抓取某個頁面內容,登陸前與登陸後是不同的,或者不允許的。
使用Cookie和使用代理IP一樣,也需要創建一個自己的opener。在HTTP包中,提供了cookiejar模塊,用於提供對Cookie的支持。
http.cookiejar功能強大,我們可以利用本模塊的CookieJar類的對象來捕獲cookie並在後續連接請求時重新發送,比如可以實現模擬登錄功能。該模塊主要的對象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
它們的關係: CookieJar–派生–>FileCookieJar–派生–>MozillaCookieJar和LWPCookieJar
工作原理:創建一個帶有cookie的opener,在訪問登錄的URL時,將登錄後的cookie保存下來,然後利用這個cookie來訪問其他網址。查看登錄之後才能看到的信息。
同樣,我們以實例進行講解,爬取伯樂在線的面向對象的漂亮MM的郵箱聯繫方式。
二、實戰
1.背景介紹
在伯樂在線有這麼一個有趣的模塊,面向對象,它說白了就是提供了一個程序員(媛)網上相親的平臺。
它的樣子是這樣的:
可以看到,這裏有很多的相親貼,隨便點進去就會有網上相親MM的詳細信息,想獲取MM的聯繫方式,需要積分,積分可以通過簽到的方式獲取。如果沒有登陸賬戶,獲取聯繫方式的地方是這個樣子的:
如果登陸了賬號,獲取聯繫方式的地方是這個樣子的:
想要爬取MM的聯繫郵箱,就需要用到我們本次講到的知識,Cookie的使用。當然,首先你積分也得夠。在講解之前,推薦一款抓包工具–Fiddler,可以在Google Chrome的Google商店下載這個插件,它的樣子是這樣的:
可以看到,通過這個插件,我們可以很容易找到Post的Form Data等信息,很方便,當然也可以用之前講得瀏覽器審查元素的方式查看這些信息。
2.過程分析
在伯樂在線首頁點擊登陸的按鈕,Fiddler的抓包內容如下:
Form Data的內容記住,這些是我們編程需要用到的。user_login是用戶名,user_pass是用戶密碼。
在點擊取得聯繫郵箱按鈕的時候,Fiddler的抓包內容如下:
從上圖可以看出,此刻真正請求的url是
同樣Form Data中內容要記下來。postId是每個帖子的id。例如,打開一個相親貼,它的URL是http://date.jobbole.com/4128/,那麼它的這個postId就是4128。爲了簡化程序,這裏就不講解如何自動獲取這個postId了,本實例直接指定postId。如果想要自動獲取,可以使用beautifulsoup解析http://date.jobbole.com/返回的信息。beautifulsoup的使用。有機會的話,會在後面的爬蟲筆記中進行講解。
3.測試
1)將Cookie保存到變量中
首先,我們先利用CookieJar對象實現獲取cookie的功能,存儲到變量中,先來感受一下:
# -*- coding: UTF-8 -*-
from urllib import request
from http import cookiejar
if __name__ == '__main__':
#聲明一個CookieJar對象實例來保存cookie
cookie = cookiejar.CookieJar()
#利用urllib.request庫的HTTPCookieProcessor對象來創建cookie處理器,也就CookieHandler
handler=request.HTTPCookieProcessor(cookie)
#通過CookieHandler創建opener
opener = request.build_opener(handler)
#此處的open方法打開網頁
response = opener.open('http://www.baidu.com')
#打印cookie信息
for item in cookie:
print('Name = %s' % item.name)
print('Value = %s' % item.value)
我們使用以上方法將cookie保存到變量中,然後打印出了cookie中的值,運行結果如下:
2)保存Cookie到文件
在上面的方法中,我們將cookie保存到了cookie這個變量中,如果我們想將cookie保存到文件中該怎麼做呢?方便以後直接讀取文件使用,這時,我們就要用到FileCookieJar這個對象了,在這裏我們使用它的子類MozillaCookieJar來實現Cookie的保存,編寫代碼如下:
# -*- coding: UTF-8 -*-
from urllib import request
from http import cookiejar
if __name__ == '__main__':
#設置保存cookie的文件,同級目錄下的cookie.txt
filename = 'cookie.txt'
#聲明一個MozillaCookieJar對象實例來保存cookie,之後寫入文件
cookie = cookiejar.MozillaCookieJar(filename)
#利用urllib.request庫的HTTPCookieProcessor對象來創建cookie處理器,也就CookieHandler
handler=request.HTTPCookieProcessor(cookie)
#通過CookieHandler創建opener
opener = request.build_opener(handler)
#此處的open方法打開網頁
response = opener.open('http://www.baidu.com')
#保存cookie到文件
cookie.save(ignore_discard=True, ignore_expires=True)
cookie.save的參數說明:
-
ignore_discard的意思是即使cookies將被丟棄也將它保存下來;
-
ignore_expires的意思是如果在該文件中cookies已經存在,則覆蓋原文件寫入。
在這裏,我們將這兩個全部設置爲True。
運行之後,cookies將被保存到cookie.txt文件中。我們可以查看自己查看下cookie.txt這個文件的內容。
3)從文件中獲取Cookie並訪問
我們已經做到把Cookie保存到文件中了,如果以後想使用,可以利用下面的方法來讀取cookie並訪問網站,感受一下:
# -*- coding: UTF-8 -*-
from urllib import request
from http import cookiejar
if __name__ == '__main__':
#設置保存cookie的文件的文件名,相對路徑,也就是同級目錄下
filename = 'cookie.txt'
#創建MozillaCookieJar實例對象
cookie = cookiejar.MozillaCookieJar()
#從文件中讀取cookie內容到變量
cookie.load(filename, ignore_discard=True, ignore_expires=True)
#利用urllib.request庫的HTTPCookieProcessor對象來創建cookie處理器,也就CookieHandler
handler=request.HTTPCookieProcessor(cookie)
#通過CookieHandler創建opener
opener = request.build_opener(handler)
#此用opener的open方法打開網頁
response = opener.open('http://www.baidu.com')
#打印信息
print(response.read().decode('utf-8'))
瞭解到以上內容,我們那就可以開始正式編寫模擬登陸伯樂在線的程序了。同時,我們也可以獲取相親MM的聯繫方式。
4.編寫代碼
我們利用CookieJar對象實現獲取cookie的功能,存儲到變量中。然後使用這個cookie變量創建opener,使用這個設置好cookie的opener即可模擬登陸,同筆記四中講到的IP代理的使用方法類似。
創建cookie_test.py文件,編寫代碼如下:
# -*- coding: UTF-8 -*-
from urllib import request
from urllib import error
from urllib import parse
from http import cookiejar
if __name__ == '__main__':
#登陸地址
login_url = 'http://www.jobbole.com/wp-admin/admin-ajax.php'
#User-Agent信息
user_agent = r'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36'
#Headers信息
head = {'User-Agnet': user_agent, 'Connection': 'keep-alive'}
#登陸Form_Data信息
Login_Data = {}
Login_Data['action'] = 'user_login'
Login_Data['redirect_url'] = 'http://www.jobbole.com/'
Login_Data['remember_me'] = '0' #是否一個月內自動登陸
Login_Data['user_login'] = '********' #改成你自己的用戶名
Login_Data['user_pass'] = '********' #改成你自己的密碼
#使用urlencode方法轉換標準格式
logingpostdata = parse.urlencode(Login_Data).encode('utf-8')
#聲明一個CookieJar對象實例來保存cookie
cookie = cookiejar.CookieJar()
#利用urllib.request庫的HTTPCookieProcessor對象來創建cookie處理器,也就CookieHandler
cookie_support = request.HTTPCookieProcessor(cookie)
#通過CookieHandler創建opener
opener = request.build_opener(cookie_support)
#創建Request對象
req1 = request.Request(url=login_url, data=logingpostdata, headers=head)
#面向對象地址
date_url = 'http://date.jobbole.com/wp-admin/admin-ajax.php'
#面向對象
Date_Data = {}
Date_Data['action'] = 'get_date_contact'
Date_Data['postId'] = '4128'
#使用urlencode方法轉換標準格式
datepostdata = parse.urlencode(Date_Data).encode('utf-8')
req2 = request.Request(url=date_url, data=datepostdata, headers=head)
try:
#使用自己創建的opener的open方法
response1 = opener.open(req1)
response2 = opener.open(req2)
html = response2.read().decode('utf-8')
index = html.find('jb_contact_email')
#打印查詢結果
print('聯繫郵箱:%s' % html[index+19:-2])
except error.URLError as e:
if hasattr(e, 'code'):
print("HTTPError:%d" % e.code)
elif hasattr(e, 'reason'):
print("URLError:%s" % e.reason)
5.運行結果如下: