Cookie,指某些網站為了辨別使用者身分、進行session追蹤而儲存在使用者本地端上的資料(通常經過加密)。
舉個例子,某些網站是需要登入後才能得到你想要的資訊的,不登陸只能是遊客模式,那麼我們可以利用Urllib2庫保存我們以前登入過的Cookie,之後載入cookie獲取我們想要的頁面,然後再進行抓取。理解cookie主要是為我們快速模擬登入抓取目標網頁做出準備。
我之前的帖子中使用過urlopen()這個函數來打開網頁進行抓取,這僅僅只是一個簡單的Python網頁打開器,其參數也僅有urlopen(url,data,timeout),這三個參數對於我們取得目標網頁的cookie是遠遠不夠的。這時候我們就要利用另一種Opener——CookieJar。
cookielib也是Python進行爬蟲的重要模組,他能與urllib2相互結合一起爬取想要的內容。該模組的CookieJar類別的物件可以捕獲cookie並在後續連接請求時重新發送,這樣就可以實現我們所需的模擬登入功能。
這裡特別說明一下,cookielib是在py2.7中自帶的模組,無需重新安裝,想要查看其自帶模組可以查看Python目錄下的Lib資料夾,裡面有所有安裝的模組。我一開始沒想起來,在pycharm中竟然沒有搜到cookielib,使用了快捷安裝也報錯:Couldn't find index page for 'Cookielib' (maybe misspelled?)
之後才想起來是不是自自自如帶的就有,沒想到去lib文件夾一看還真有,白白浪費半個小時各種瞎折騰~~
下面我們就來介紹一下這個模組,該模組主要的對像有CookieJar、FileCookieJar、MozillaCookieJar、 LWPCookieJar。
它們的關係:CookieJar —-衍生—->FileCookieJar —-衍生—–>MozillaCookieJar和LWPCookieJar 主要用法,我們下面也會講到。 urllib2.urlopen()函數不支援驗證、cookie或其它HTTP進階功能。要支援這些功能,必須使用build_opener()(可以用於讓python程式模擬瀏覽器進行訪問,作用你懂得~)函數創建自訂Opener物件。
1、首先我們就來獲取一下網站的cookie
例子:
#coding=utf-8 import cookielib import urllib2 mycookie = cookielib.CookieJar() #声明一个CookieJar的类对象保存cookie(注意CookieJar的大小写问题) handler = urllib2.HTTPCookieProcessor(mycookie) #利用urllib2库中的HTTPCookieProcessor来声明一个处理cookie的处理器 opener = urllib2.build_opener(handler) #利用handler来构造opener,opener的用法和urlopen()类似 response = opener.open("http://www.baidu.com") #opener返回的一个应答对象response for item in my.cookie: print"name="+item.name print"value="+item.value
結果:
name=BAIDUID value=73BD718962A6EA0DAD4CB9578A08FDD0:FG=1 name=BIDUPSID value=73BD718962A6EA0DAD4CB9578A08FDD0 name=H_PS_PSSID value=1450_19035_21122_17001_21454_21409_21394_21377_21526_21189_21398 name=PSTM value=1478834132 name=BDSVRTM value=0 name=BD_HOME value=0
這樣我們就得到了一個最簡單的cookie。
2、將cookie保存到文件
上面我們得到了cookie,下面我們學習如何保存cookie。這裡我們使用它的子類MozillaCookieJar來實現Cookie的保存
例子:
#coding=utf-8 import cookielib import urllib2 mycookie = cookielib.MozillaCookieJar() #声明一个MozillaCookieJar的类对象保存cookie(注意MozillaCookieJar的大小写问题) handler = urllib2.HTTPCookieProcessor(mycookie) #利用urllib2库中的HTTPCookieProcessor来声明一个处理cookie的处理器 opener = urllib2.build_opener(handler) #利用handler来构造opener,opener的用法和urlopen()类似 response = opener.open("http://www.baidu.com") #opener返回的一个应答对象response for item in mycookie: print"name="+item.name print"value="+item.value filename='mycookie.txt'#设定保存的文件名 mycookie.save(filename,ignore_discard=True, ignore_expires=True)
將上面的例子簡單變形就可以得到本例,使用了CookieJarokiJar,為什麼呢?我們將MozillaCookiJar換成CookieJar試試,下面一張圖你就能明白:
CookieJar是沒有保存save屬性的~
save()這個方法中:ignore_discard的意思是丟棄即使cookies將被丟棄也將它保存下來,ignore_expires的意思是如果在該檔案中cookies已經存在,則覆蓋原始檔案寫入,在這裡,我們將這兩個全部設定為True。運行之後,cookies將保存到cookie.txt檔案中,我們查看一下內容:
這樣我們就成功保存了我們想要的cookie
3、從檔案中獲取cookie並存取
<pre style="background-color: rgb(255, 255, 255); font-family: 宋体; font-size: 9pt;"><pre name="code" class="python">#coding=utf-8 import urllib2 import cookielib import urllib #第一步先给出账户密码网址准备模拟登录 postdata = urllib.urlencode({ 'stuid': '1605122162', 'pwd': 'xxxxxxxxx'#密码这里就不泄漏啦,嘿嘿嘿 }) loginUrl = 'http://ids.xidian.edu.cn/authserver/login?service=http%3A%2F%2Fjwxt.xidian.edu.cn%2Fcaslogin.jsp'# 登录教务系统的URL,成绩查询网址 # 第二步模拟登陆并保存登录的cookie filename = 'cookie.txt' #创建文本保存cookie mycookie = cookielib.MozillaCookieJar(filename) # 声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(mycookie)) #定义这个opener,对象是cookie result = opener.open(loginUrl, postdata) mycookie.save(ignore_discard=True, ignore_expires=True)# 保存cookie到cookie.txt中 # 第三步利用cookie请求访问另一个网址,教务系统总址 gradeUrl = 'http://ids.xidian.edu.cn/authserver/login?service' #只要是帐号密码一样的网址就可以, 请求访问成绩查询网址 result = opener.open(gradeUrl) print result.read()
核心思想:创建opener,包含了cookie的内容。之后在利用opener时,就会自动使用原先保存的cookie.
感謝閱讀,希望能幫助大家,謝謝大家對本站的支持! 更多Python爬蟲利用cookie實現模擬登陸實例詳解相關文章請關注PHP中文網!