Python爬虫入门六Cookie的使用
為什么要使用 Cookie 呢? Cookie,指某些網站為了辨別用戶身份、進行 session 跟蹤而儲存在用戶本地終端上的數據(通常經過加密) 比如說有些網站需要登錄后才能訪問某個頁面,在登錄之前,你想抓取某個頁面內容是不允許的。那么我們可以利用 Urllib2 庫保存我們登錄的 Cookie,然后再抓取其他頁面就達到目的了。 在此之前呢,我們必須先介紹一個 opener 的概念。
1.Opener
當你獲取一個 URL 你使用一個 opener (一個 urllib2.OpenerDirector 的實例)。在前面,我們都是使用的默認的 opener,也就是 urlopen。它是一個特殊的 opener,可以理解成 opener 的一個特殊實例,傳入的參數僅僅是 url,data,timeout。 如果我們需要用到 Cookie,只用這個 opener 是不能達到目的的,所以我們需要創建更一般的 opener 來實現對 Cookie 的設置。
2.Cookielib
cookielib 模塊的主要作用是提供可存儲 cookie 的對象,以便于與 urllib2 模塊配合使用來訪問 Internet 資源。Cookielib 模塊非常強大,我們可以利用本模塊的 CookieJar 類的對象來捕獲 cookie 并在后續連接請求時重新發送,比如可以實現模擬登錄功能。該模塊主要的對象有 CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。 它們的關系:CookieJar —— 派生 ——>FileCookieJar —— 派生 ——->MozillaCookieJar 和 LWPCookieJar
獲取Cookie保存到變量
首先,我們先利用 CookieJar 對象實現獲取 cookie 的功能,存儲到變量中,先來感受一下
import urllib2 import cookielib #聲明一個CookieJar對象實例來保存cookie cookie = cookielib.CookieJar() #利用urllib2庫的HTTPCookieProcessor對象來創建cookie處理器 handler=urllib2.HTTPCookieProcessor(cookie) #通過handler來構建opener opener = urllib2.build_opener(handler) #此處的open方法同urllib2的urlopen方法,也可以傳入request response = opener.open('http://www.baidu.com') for item in cookie:print("{}:{}".format(item.name,item.value))結果:
BAIDUID:5E5BB57DD1B922B6CFA22BC660CA2641:FG=1 BIDUPSID:5E5BB57DD1B922B6F3874B1DF9628134 H_PS_PSSID:33423_1438_33306_31254_32972_33351_33313_33312_33311_33310_33413_33309_26350_33308_33307_33389_33370 PSTM:1609568045 BDSVRTM:0 BD_HOME:12.保存Cookie到文件
在上面的方法中,我們將 cookie 保存到了 cookie 這個變量中,如果我們想將 cookie 保存到文件中該怎么做呢?這時,我們就要用到 FileCookieJar 這個對象了,在這里我們使用它的子類 MozillaCookieJar 來實現 Cookie 的保存
import cookielib import urllib2#設置保存cookie的文件,同級目錄下的cookie.txt filename = 'cookie.txt' #聲明一個MozillaCookieJar對象實例來保存cookie,之后寫入文件 cookie = cookielib.MozillaCookieJar(filename) #利用urllib2庫的HTTPCookieProcessor對象來創建cookie處理器 handler = urllib2.HTTPCookieProcessor(cookie) #通過handler來構建opener opener = urllib2.build_opener(handler) #創建一個請求,原理同urllib2的urlopen response = opener.open("http://www.baidu.com") #保存cookie到文件 cookie.save(ignore_discard=True, ignore_expires=True)關于最后 save 方法的兩個參數在此說明一下: 官方解釋如下
- ignore_discard: save even cookies set to be discarded.
- ignore_expires: save even cookies that have expiredThe file is overwritten if it already exists
由此可見,ignore_discard 的意思是即使 cookies 將被丟棄也將它保存下來,ignore_expires 的意思是如果在該文件中 cookies 已經存在,則覆蓋原文件寫入,在這里,我們將這兩個全部設置為 True。運行之后,cookies 將被保存到 cookie.txt 文件中,我們查看一下內容,如下
# Netscape HTTP Cookie File # http://curl.haxx.se/rfc/cookie_spec.html # This is a generated file! Do not edit..baidu.com TRUE / FALSE 1641104421 BAIDUID A614B3154C44552F0472B9D9BA37F9ED:FG=1 .baidu.com TRUE / FALSE 3757052068 BIDUPSID A614B3154C44552FDDEF489DFBD028B8 .baidu.com TRUE / FALSE H_PS_PSSID 33425_1437_33306_31254_33350_33313_33312_33311_33310_33413_33309_33321_33308_33307_33266_33389_33370 .baidu.com TRUE / FALSE 3757052068 PSTM 1609568421 www.baidu.com FALSE / FALSE BDSVRTM 0 www.baidu.com FALSE / FALSE BD_HOME 1從文件中獲取Cookie并訪問
那么我們已經做到把 Cookie 保存到文件中了,如果以后想使用,可以利用下面的方法來讀取 cookie 并訪問網站,感受一下
import cookielib import urllib2#創建MozillaCookieJar實例對象 cookie = cookielib.MozillaCookieJar() #從文件中讀取cookie內容到變量 cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True) #創建請求的request req = urllib2.Request("http://www.baidu.com") #利用urllib2的build_opener方法創建一個opener opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) response = opener.open(req) print response.read()4.利用Cookie模擬登陸網站
以教育系統為例,利用 cookie 實現模擬登錄,并將 cookie 信息保存到文本文件中
import urllib import urllib2 import cookielibfilename = 'cookie.txt' #聲明一個MozillaCookieJar對象實例來保存cookie,之后寫入文件 cookie = cookielib.MozillaCookieJar(filename) opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) postdata = urllib.urlencode({'stuid':'xxx','pwd':'xxx'}) #登錄教務系統的URL loginUrl = 'http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bks_login2.login' #模擬登錄,并把cookie保存到變量 result = opener.open(loginUrl,postdata) #保存cookie到cookie.txt中 cookie.save(ignore_discard=True, ignore_expires=True) #利用cookie請求訪問另一個網址,此網址是成績查詢網址 gradeUrl = 'http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bkscjcx.curscopre' #請求訪問成績查詢網址 result = opener.open(gradeUrl) print result.read()以上程序的原理如下 創建一個帶有 cookie 的 opener,在訪問登錄的 URL 時,將登錄后的 cookie 保存下來,然后利用這個 cookie 來訪問其他網址。 如登錄之后才能查看的成績查詢呀,本學期課表呀等等網址,模擬登錄就這么實現
總結
以上是生活随笔為你收集整理的Python爬虫入门六Cookie的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: (深度原创)华为基于LTC主流程的组织销
- 下一篇: 一、部署虚拟环境来安装Linux系统
