Python爬蟲利用cookie實(shí)現(xiàn)模擬登陸實(shí)例詳解
Cookie,指某些網(wǎng)站為了辨別用戶身份、進(jìn)行session跟蹤而儲存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密)。
舉個(gè)例子,某些網(wǎng)站是需要登錄后才能得到你想要的信息的,不登陸只能是游客模式,那么我們可以利用Urllib2庫保存我們以前登錄過的Cookie,之后載入cookie獲取我們想要的頁面,然后再進(jìn)行抓取。理解cookie主要是為我們快捷模擬登錄抓取目標(biāo)網(wǎng)頁做出準(zhǔn)備。
我之前的帖子中使用過urlopen()這個(gè)函數(shù)來打開網(wǎng)頁進(jìn)行抓取,這僅僅只是一個(gè)簡單的Python網(wǎng)頁打開器,其參數(shù)也僅有urlopen(url,data,timeout),這三個(gè)參數(shù)對于我們獲取目標(biāo)網(wǎng)頁的cookie是遠(yuǎn)遠(yuǎn)不夠的。這時(shí)候我們就要利用到另外一種Opener——CookieJar。
cookielib也是Python進(jìn)行爬蟲的一個(gè)重要模塊,他能與urllib2相互結(jié)合一起爬取想要的內(nèi)容。該模塊的CookieJar類的對象可以捕獲cookie并在后續(xù)連接請求時(shí)重新發(fā)送,這樣就可以實(shí)現(xiàn)我們所需要的模擬登錄功能。
這里特別說明一下,cookielib是在py2.7中自帶的模塊,無需重新安裝,想要查看其自帶模塊可以查看Python目錄下的Lib文件夾,里面有所有安裝的模塊。我一開始沒想起來,在pycharm中竟然沒有搜到cookielib,使用了快捷安裝也報(bào)錯:Couldn't find index page for 'Cookielib' (maybe misspelled?)
之后才想起來是不是自帶的就有,沒想到去lib文件夾一看還真有,白白浪費(fèi)半個(gè)小時(shí)各種瞎折騰~~
下面我們就來介紹一下這個(gè)模塊,該模塊主要的對象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
它們的關(guān)系:CookieJar —-派生—->FileCookieJar —-派生—–>MozillaCookieJar和LWPCookieJar 主要用法,我們下面也會講到。urllib2.urlopen()函數(shù)不支持驗(yàn)證、cookie或者其它HTTP高級功能。要支持這些功能,必須使用build_opener()(可以用于讓python程序模擬瀏覽器進(jìn)行訪問,作用你懂得~)函數(shù)創(chuàng)建自定義Opener對象。
1、首先我們就來獲取一下網(wǎng)站的cookie
例子:
#coding=utf-8 import cookielib import urllib2 mycookie = cookielib.CookieJar() #聲明一個(gè)CookieJar的類對象保存cookie(注意CookieJar的大小寫問題) handler = urllib2.HTTPCookieProcessor(mycookie) #利用urllib2庫中的HTTPCookieProcessor來聲明一個(gè)處理cookie的處理器 opener = urllib2.build_opener(handler) #利用handler來構(gòu)造opener,opener的用法和urlopen()類似 response = opener.open("http://www.baidu.com") #opener返回的一個(gè)應(yīng)答對象response for item in my.cookie: print"name="+item.name print"value="+item.value
結(jié)果:
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
這樣我們就得到了一個(gè)最簡單的cookie。
2、將cookie保存到文件
上面我們得到了cookie,下面我們學(xué)習(xí)如何保存cookie。在這里我們使用它的子類MozillaCookieJar來實(shí)現(xiàn)Cookie的保存
例子:
#coding=utf-8 import cookielib import urllib2 mycookie = cookielib.MozillaCookieJar() #聲明一個(gè)MozillaCookieJar的類對象保存cookie(注意MozillaCookieJar的大小寫問題) handler = urllib2.HTTPCookieProcessor(mycookie) #利用urllib2庫中的HTTPCookieProcessor來聲明一個(gè)處理cookie的處理器 opener = urllib2.build_opener(handler) #利用handler來構(gòu)造opener,opener的用法和urlopen()類似 response = opener.open("http://www.baidu.com") #opener返回的一個(gè)應(yīng)答對象response for item in mycookie: print"name="+item.name print"value="+item.value filename='mycookie.txt'#設(shè)定保存的文件名 mycookie.save(filename,ignore_discard=True, ignore_expires=True)
將上面的例子簡單變形就可以得到本例,使用了CookieJar的子類MozillaCookiJar,為什么呢?我們將MozillaCookiJar換成CookieJar試試,下面一張圖你就能明白:
CookieJar是沒有保存save屬性的~
save()這個(gè)方法中:ignore_discard的意思是即使cookies將被丟棄也將它保存下來,ignore_expires的意思是如果在該文件中cookies已經(jīng)存在,則覆蓋原文件寫入,在這里,我們將這兩個(gè)全部設(shè)置為True。運(yùn)行之后,cookies將被保存到cookie.txt文件中,我們查看一下內(nèi)容:
這樣我們就成功保存了我們想要的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 #第一步先給出賬戶密碼網(wǎng)址準(zhǔn)備模擬登錄 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'# 登錄教務(wù)系統(tǒng)的URL,成績查詢網(wǎng)址 # 第二步模擬登陸并保存登錄的cookie filename = 'cookie.txt' #創(chuàng)建文本保存cookie mycookie = cookielib.MozillaCookieJar(filename) # 聲明一個(gè)MozillaCookieJar對象實(shí)例來保存cookie,之后寫入文件 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(mycookie)) #定義這個(gè)opener,對象是cookie result = opener.open(loginUrl, postdata) mycookie.save(ignore_discard=True, ignore_expires=True)# 保存cookie到cookie.txt中 # 第三步利用cookie請求訪問另一個(gè)網(wǎng)址,教務(wù)系統(tǒng)總址 gradeUrl = 'http://ids.xidian.edu.cn/authserver/login?service' #只要是帳號密碼一樣的網(wǎng)址就可以, 請求訪問成績查詢網(wǎng)址 result = opener.open(gradeUrl) print result.read()</pre><br> <pre></pre> <pre></pre> <p></p> <pre></pre> <pre></pre> 創(chuàng)建一個(gè)帶有cookie的opener,在訪問登錄的URL時(shí),將登錄后的cookie保存下來,然后利用這個(gè)cookie來訪問其他網(wǎng)址。 <p></p> <p><br> </p> <p>核心思想:創(chuàng)建opener,包含了cookie的內(nèi)容。之后在利用opener時(shí),就會自動使用原先保存的cookie.<br> <br> </p> </pre>
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
pandas按條件篩選數(shù)據(jù)的實(shí)現(xiàn)
這篇文章主要介紹了pandas按條件篩選數(shù)據(jù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02使用Python圖像處理庫Pillow處理圖像文件的案例分析
本文將通過使用Python圖像處理庫Pillow,幫助大家進(jìn)一步了解Python的基本概念:模塊、對象、方法和函數(shù)的使用,文中代碼講解的非常詳細(xì),需要的朋友可以參考下2023-07-07使用Python進(jìn)行情感分析并可視化展示結(jié)果
情感分析是一種通過自然語言處理技術(shù)來識別、提取和量化文本中的情感傾向的方法,Python在這一領(lǐng)域有著豐富的庫和工具,本文將介紹如何使用Python進(jìn)行情感分析,并通過可視化展示結(jié)果,需要的朋友可以參考下2024-05-05CentOS下使用yum安裝python-pip失敗的完美解決方法
這篇文章主要介紹了CentOS下使用yum安裝python-pip失敗的完美解決方法,需要的朋友可以參考下2017-08-08python實(shí)現(xiàn)自動生成C++代碼的代碼生成器
這篇文章介紹了python實(shí)現(xiàn)C++代碼生成器的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07使用Pandas計(jì)算系統(tǒng)客戶名稱的相似度
在日常業(yè)務(wù)處理中,我們經(jīng)常會面臨將不同系統(tǒng)中的數(shù)據(jù)進(jìn)行匹配和比對的情況,本文將介紹如何使用Python的Pandas庫來處理這個(gè)問題,需要的可以參考一下2023-07-07教你如何使用Python快速爬取需要的數(shù)據(jù)
學(xué)點(diǎn)數(shù)據(jù)爬蟲基礎(chǔ)能讓繁瑣的數(shù)據(jù)CV工作(Ctrl+C,Ctrl+V)成為自動化就足夠了.作為一名數(shù)據(jù)分析師而并非開發(fā)工程師,需要掌握的爬蟲必備的知識內(nèi)容,能獲取需要的數(shù)據(jù)即可 ,需要的朋友可以參考下2021-06-06詳解MySQL數(shù)據(jù)類型int(M)中M的含義
int(M)拆分來說,int是代表整型數(shù)據(jù)那,么中間的M應(yīng)該是代表多少位了,后來查mysql手冊也得知了我的理解是正確的,下面這篇文章小編就來舉例詳細(xì)說明。 文中介紹的很詳細(xì),相信對大家的理解和學(xué)習(xí)很有幫助,有需要的朋友們下面就來學(xué)習(xí)學(xué)習(xí)吧。2016-11-11