Cookie的使用
用 Python 來登錄網站, 用Cookies記錄登錄信息, 然后就可以抓取登錄之后才能看到的信息。
什么是cookies?
Cookie,指某些網站為了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(通常經過加密)。
比如說有些網站需要登錄后才能訪問某個頁面,在登錄之前,你想抓取某個頁面內容是不允許的。那么我們可以利用Urllib庫保存我們登錄的Cookie,然后再抓取其他頁面就達到目的了。
opener的概念
當你獲取一個URL你使用一個opener(一個urllib2.OpenerDirector的實例)。在前面,我們都是使用的默認的opener,也就是urlopen。
urlopen是一個特殊的opener,可以理解成opener的一個特殊實例,傳入的參數僅僅是url,data,timeout。
如果我們需要用到Cookie,只用這個opener是不能達到目的的,所以我們需要創建更一般的opener來實現對Cookie的設置。
Cookielib
cookielib模塊的主要作用是提供可存儲cookie的對象,以便於與urllib2模塊配合使用來訪問Internet資源。Cookielib模塊非常強大,我們可以利用本模塊的CookieJar類的對象來捕獲cookie並在后續連接請求時重新發送,比如可以實現模擬登錄功能。該模塊主要的對象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
它們的關系:CookieJar —-派生—->FileCookieJar —-派生—–>MozillaCookieJar和LWPCookieJar
使用cookie登錄的步驟
1)獲取Cookie保存到變量
import urllib.request import http.cookiejar URL_ROOT = r'http://d.weibo.com/' cookie = http.cookiejar.CookieJar() # 聲明一個CookieJar對象實例來保存cookie handler = urllib.request.HTTPCookieProcessor(cookie) # 利用urllib2庫的HTTPCookieProcessor對象來創建cookie處理器 opener = urllib.request.build_opener(handler) # 通過handler來構建opener response = opener.open(URL_ROOT) # 此處的open方法同urllib2的urlopen方法,也可以傳入request for item in cookie: print('Name = ' + item.name) print('Value = ' + item.value)
我們使用以上方法將cookie保存到變量中,然后打印出了cookie中的值,運行結果如下
Name = YF-Page-G0
Value = dc8d8d4964cd93a7c3bfa7640c1bd10c
Note:py3中opener也可以這樣使用:
request = urllib.request.Request(URL_ROOT, postdata, headers) response = opener.open(request)
或者:
urllib.request.install_opener(opener)
request = urllib.request.Request(URL_ROOT, postdata, headers)
response = urllib.request.urlopen(request)
2)保存Cookie到文件
上面我們將cookie保存到了cookie這個變量中,如果我們想將cookie保存到文件中該怎么做呢?
這時,我們就要用到FileCookieJar這個對象了,在這里我們使用它的子類MozillaCookieJar來實現Cookie的保存
import urllib.request, urllib.parse, urllib.error import http.cookiejar URL_ROOT = 'http://www.jobbole.com/login/' values = {'name': '******', 'password': '******'} postdata = urllib.parse.urlencode(values).encode() user_agent = r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36' headers = {'User-Agent': user_agent} cookie_filename = 'cookie.txt' cookie = http.cookiejar.LWPCookieJar(cookie_filename) handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler) request = urllib.request.Request(URL_ROOT, postdata, headers) try: response = opener.open(request) except urllib.error.URLError as e: print(e.reason) cookie.save(ignore_discard=True, ignore_expires=True) # 保存cookie到cookie.txt中 for item in cookie: print('Name = ' + item.name) print('Value = ' + item.value)
Note:
1. 不同cookie寫入文件方法的解釋:
FileCookieJar(filename):創建FileCookieJar實例,檢索cookie信息並將信息存儲到文件中,filename是文件名。
MozillaCookieJar(filename):創建與Mozilla cookies.txt文件兼容的FileCookieJar實例。
LWPCookieJar(filename):創建與libwww-perl Set-Cookie3文件兼容的FileCookieJar實例。
2. save方法的兩個參數的官方解釋:
ignore_discard: save even cookies set to be discarded. 即使cookies將被丟棄也將它保存下來
ignore_expires: save even cookies that have expiredThe file is overwritten if it already exists.如果在該文件中cookies已經存在,則覆蓋原文件寫入
3. python3中如果直接使用http.cookiejar.CookieJar(filename)的方式會出錯:self._policy._now = self._now = int(time.time()) AttributeError: 'str' object has no attribute '_now'。注意要將CookieJar改為LWPCookieJar。
3)從文件中獲取Cookie並訪問
那么我們已經做到把Cookie保存到文件中了,如果以后想使用,可以利用下面的方法來讀取cookie並訪問網站,感受一下
import urllib.request import urllib.parse import urllib.error import http.cookiejar cookie_filename = 'cookie_jar.txt' cookie = http.cookiejar.MozillaCookieJar(cookie_filename) cookie.load(cookie_filename, ignore_discard=True, ignore_expires=True) handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler) get_url = 'http://www.jobbole.com/' # 利用cookie請求訪問另一個網址 get_request = urllib.request.Request(get_url) get_response = opener.open(get_request) print(get_response.read().decode())
http://blog.csdn.net/pipisorry/article/details/47905781