urllib的實現---cookie處理


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM