鍍金池/ 教程/ Python/ Cookie 的使用
綜述
Cookie 的使用
爬蟲基礎(chǔ)了解
計算大學本學期績點
抓取淘寶 MM 照片
爬蟲框架 Scrapy 安裝配置
模擬登錄淘寶并獲取所有訂單
Urllib 庫的高級用法
URLError 異常處理
正則表達式
Beautiful Soup 的用法
爬取糗事百科段子
爬取百度貼吧帖子
Urllib 庫的基本使用

Cookie 的使用

大家好哈,上一節(jié)我們研究了一下爬蟲的異常處理問題,那么接下來我們一起來看一下 Cookie 的使用。

為什么要使用 Cookie 呢?

Cookie,指某些網(wǎng)站為了辨別用戶身份、進行 session 跟蹤而儲存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密)

比如說有些網(wǎng)站需要登錄后才能訪問某個頁面,在登錄之前,你想抓取某個頁面內(nèi)容是不允許的。那么我們可以利用 Urllib2 庫保存我們登錄的 Cookie,然后再抓取其他頁面就達到目的了。

在此之前呢,我們必須先介紹一個 opener 的概念。

Opener

當你獲取一個 URL 你使用一個 opener(一個 urllib2.OpenerDirector 的實例)。在前面,我們都是使用的默認的 opener,也就是 urlopen。它是一個特殊的 opener,可以理解成opener 的一個特殊實例,傳入的參數(shù)僅僅是 url,data,timeout。

如果我們需要用到 Cookie,只用這個 opener 是不能達到目的的,所以我們需要創(chuàng)建更一般的opener 來實現(xiàn)對 Cookie 的設(shè)置。

Cookielib

cookielib 模塊的主要作用是提供可存儲 cookie 的對象,以便于與 urllib2 模塊配合使用來訪問 Internet 資源。Cookielib 模塊非常強大,我們可以利用本模塊的 CookieJar 類的對象來捕獲 cookie 并在后續(xù)連接請求時重新發(fā)送,比如可以實現(xiàn)模擬登錄功能。該模塊主要的對象有 CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。

它們的關(guān)系:CookieJar —-派生—->FileCookieJar —-派生—–>MozillaCookieJar 和LWPCookieJar

獲取 Cookie 保存到變量

首先,我們先利用 CookieJar 對象實現(xiàn)獲取 cookie 的功能,存儲到變量中,先來感受一下

import urllib2
import cookielib
\#聲明一個CookieJar對象實例來保存cookie
cookie = cookielib.CookieJar()
\#利用urllib2庫的HTTPCookieProcessor對象來創(chuàng)建cookie處理器
handler=urllib2.HTTPCookieProcessor(cookie)
\#通過handler來構(gòu)建opener
opener = urllib2.build_opener(handler)
\#此處的open方法同urllib2的urlopen方法,也可以傳入request
response = opener.open('http://www.baidu.com')
for item in cookie:
    print 'Name = '+item.name
    print 'Value = '+item.value  

我們使用以上方法將 cookie 保存到變量中,然后打印出了 cookie 中的值,運行結(jié)果如下

Name = BAIDUID
Value = B07B663B645729F11F659C02AAE65B4C:FG=1
Name = BAIDUPSID
Value = B07B663B645729F11F659C02AAE65B4C
Name = H\_PS\_PSSID
Value = 12527\_11076\_1438\_10633
Name = BDSVRTM
Value = 0
Name = BD_HOME
Value = 0  

保存 Cookie 到文件

在上面的方法中,我們將 cookie 保存到了 cookie 這個變量中,如果我們想將 cookie 保存到文件中該怎么做呢?這時,我們就要用到

FileCookieJar 這個對象了,在這里我們使用它的子類 MozillaCookieJar 來實現(xiàn) Cookie的保存

import cookielib
import urllib2

\#設(shè)置保存cookie的文件,同級目錄下的cookie.txt
filename = 'cookie.txt'
\#聲明一個MozillaCookieJar對象實例來保存cookie,之后寫入文件
cookie = cookielib.MozillaCookieJar(filename)
\#利用urllib2庫的HTTPCookieProcessor對象來創(chuàng)建cookie處理器
handler = urllib2.HTTPCookieProcessor(cookie)
\#通過handler來構(gòu)建opener
opener = urllib2.build_opener(handler)
\#創(chuàng)建一個請求,原理同urllib2的urlopen
response = opener.open("http://www.baidu.com")
\#保存cookie到文件
cookie.save(ignore_discard=True, ignore_expires=True)  

關(guān)于最后 save 方法的兩個參數(shù)在此說明一下:

官方解釋如下:

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 已經(jīng)存在,則覆蓋原文件寫入,在這里,我們將這兩個全部設(shè)置為 True。運行之后,cookies 將被保存到 cookie.txt文件中,我們查看一下內(nèi)容,附圖如下

http://wiki.jikexueyuan.com/project/python-crawler-guide/images/03.png" alt="" />

從文件中獲取 Cookie 并訪問

那么我們已經(jīng)做到把 Cookie 保存到文件中了,如果以后想使用,可以利用下面的方法來讀取cookie 并訪問網(wǎng)站,感受一下

import cookielib
import urllib2

\#創(chuàng)建MozillaCookieJar實例對象
cookie = cookielib.MozillaCookieJar()
\#從文件中讀取cookie內(nèi)容到變量
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
\#創(chuàng)建請求的request
req = urllib2.Request("http://www.baidu.com")
\#利用urllib2的build_opener方法創(chuàng)建一個opener
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
response = opener.open(req)
print response.read()  

設(shè)想,如果我們的 cookie.txt 文件中保存的是某個人登錄百度的 cookie,那么我們提取出這個 cookie 文件內(nèi)容,就可以用以上方法模擬這個人的賬號登錄百度。

利用 cookie 模擬網(wǎng)站登錄

下面我們以我們學校的教育系統(tǒng)為例,利用 cookie 實現(xiàn)模擬登錄,并將 cookie 信息保存到文本文件中,來感受一下 cookie 大法吧!

import urllib
import urllib2
import cookielib

filename = 'cookie.txt'
\#聲明一個MozillaCookieJar對象實例來保存cookie,之后寫入文件
cookie = cookielib.MozillaCookieJar(filename)
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
postdata = urllib.urlencode({
            'stuid':'201200131012',
            'pwd':'23342321'
        })
\#登錄教務系統(tǒng)的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請求訪問另一個網(wǎng)址,此網(wǎng)址是成績查詢網(wǎng)址
gradeUrl = 'http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bkscjcx.curscopre'
\#請求訪問成績查詢網(wǎng)址
result = opener.open(gradeUrl)
print result.read()  

以上程序的原理如下

創(chuàng)建一個帶有 cookie 的 opener,在訪問登錄的 URL 時,將登錄后的 cookie 保存下來,然后利用這個 cookie 來訪問其他網(wǎng)址。

如登錄之后才能查看的成績查詢呀,本學期課表呀等等網(wǎng)址,模擬登錄就這么實現(xiàn)啦,是不是很酷炫?

好,小伙伴們要加油哦!我們現(xiàn)在可以順利獲取網(wǎng)站信息了,接下來就是把網(wǎng)站里面有效內(nèi)容提取出來,下一節(jié)我們?nèi)齽t表達式!