1. 程式人生 > 其它 >python爬蟲模擬登入在基礎教育中的應用_Python爬蟲利用cookie實現模擬登陸例項詳解...

python爬蟲模擬登入在基礎教育中的應用_Python爬蟲利用cookie實現模擬登陸例項詳解...

技術標籤:python爬蟲模擬登入在基礎教育中的應用

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?)

15207397531.png

之後才想起來是不是自帶的就有,沒想到去lib資料夾一看還真有,白白浪費半個小時各種瞎折騰~~

下面我們就來介紹一下這個模組,該模組主要的物件有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。

它們的關係:CookieJar ―-派生―->FileCookieJar ―-派生―C>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)

將上面的例子簡單變形就可以得到本例,使用了CookieJar的子類MozillaCookiJar,為什麼呢?我們將MozillaCookiJar換成CookieJar試試,下面一張圖你就能明白:

15207397542.png

CookieJar是沒有儲存save屬性的~

save()這個方法中:ignore_discard的意思是即使cookies將被丟棄也將它儲存下來,ignore_expires的意思是如果在該檔案中cookies已經存在,則覆蓋原檔案寫入,在這裡,我們將這兩個全部設定為True。執行之後,cookies將被儲存到cookie.txt檔案中,我們檢視一下內容:

15207397543.png

這樣我們就成功儲存了我們想要的cookie

3、從檔案中獲取cookie並訪問


#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()





建立一個帶有cookie的opener,在訪問登入的URL時,將登入後的cookie儲存下來,然後利用這個cookie來訪問其他網址。

核心思想:建立opener,包含了cookie的內容。之後在利用opener時,就會自動使用原先儲存的cookie.

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支援!

總結

如果覺得程式設計之家網站內容還不錯,歡迎將程式設計之家網站推薦給程式設計師好友。

本圖文內容來源於網友網路收集整理提供,作為學習參考使用,版權屬於原作者。

如您喜歡交流學習經驗,點選連結加入交流1群:1065694478(已滿)交流2群:163560250