這是我學(xué)習(xí)Python爬蟲第30天的筆記院喜。
模擬登錄是爬取某些站點(diǎn)內(nèi)容的一個關(guān)鍵亡蓉,有些網(wǎng)站(特別是論壇類),不登錄的話喷舀,一個數(shù)據(jù)也拿不到砍濒。
模擬登錄有這樣幾個關(guān)鍵:
-
弄清楚登錄的url
一些網(wǎng)站打開出現(xiàn)登錄的頁面淋肾,地址欄大多數(shù)不是登錄提交表單的url。 -
提交登錄表單的字段
登錄頁面的url和登錄表彰的字段名獲取的方式有兩種:
- 分析頁面源代碼梯影,找到表單標(biāo)簽及屬性巫员。適應(yīng)比較簡單的頁面,或者對網(wǎng)頁代碼甲棍,js非常熟悉。
- 采用抓包工具赶掖,查看提交的url和參數(shù)感猛,如Chrome的開發(fā)者工具中的Network, Fiddler等奢赂。這種方式簡單粗暴陪白、快速。尤其適應(yīng)頁面比較復(fù)雜膳灶,登錄時經(jīng)過了幾次跳轉(zhuǎn)的咱士。
-
登錄以后去往頁面的url
這個不是必須的,因?yàn)橐话愣加械卿浐竽J(rèn)打開的頁面轧钓,或者你所需要取數(shù)據(jù)的頁面是明確的序厉。但是如果對于第三方登錄來講,這個參數(shù)就是必要的毕箍。
知道了登錄url, 表單的參數(shù)后弛房,通過提交參數(shù)的方式來實(shí)現(xiàn)登錄,不難而柑。不是本文討論的重點(diǎn)文捶。
params = {'uname':'kitty','upass':'hello'}
r = requests.post("http://xxx.org/post", data=params)
一些站點(diǎn)的登錄流程還是比較復(fù)雜,如代碼封裝在js中媒咳,登錄時經(jīng)過了跳轉(zhuǎn)粹排。那采用以上的方式來實(shí)現(xiàn)登錄就比較復(fù)雜。即使用抓包拿到登錄url涩澡,表單參數(shù)顽耳,這時的登錄一般還附加了一些其他參數(shù),需要一一構(gòu)造出來筏养,有的如時間戳等等斧抱。
有沒有一種比較簡單的方式,來成功實(shí)現(xiàn)爬蟲模擬登錄的渐溶,然后方便抓取到數(shù)據(jù)辉浦?Cookie就是這樣一種方式。不需要知道登錄url, 不需要知道登錄表單的字段名茎辐,以及還需要哪些其他參數(shù)宪郊。
我以QQ群論壇來說明使用Cookie實(shí)現(xiàn)模擬登錄掂恕,然后抓取數(shù)據(jù)。打開就是加載的登錄div弛槐。
以下兩種方式懊亡,都需要首先拿到Cookie,可以使用Chorme開發(fā)者工具乎串,或者Fiddler店枣,在目標(biāo)網(wǎng)站上使用用戶名和密碼登錄一下,就拿到Cookie了叹誉。
一鸯两、用requests發(fā)送請求,實(shí)現(xiàn)模擬登錄
使用requests發(fā)送請求時长豁,把cookie作為參數(shù)傳遞進(jìn)來就可以了钧唐。
構(gòu)造Cookie:
cookie = {'Cookie': 'qm_username=137958873x0; qm_sid=8a4cce2f4413b4a5c9981093942b3f6f,qMUZrWmt0Z0XQbVZWKlNBZXUzT0xCSXJNRHNXU1NDVzd6MXZFQjJSbGZxMF8.; RK=/jt+Uh72a5; pgv_pvid=2786550760; pgv_info=ssid=s5861035317; ptui_loginuin=1379588730; ptisp=ctc; ptcz=e3d339f47c356076793ff4c270b572e35ed69746057039ee2e78677e391793b9; pt2gguin=o1379588730; uin=o1379588730; skey=@ssNmMQP3p; p_uin=o1379588730; p_skey=2w78648Kd9wuwxK9lsiDM02MQFJfSIhEuxhhE*aH-SU_; pt4_token=aGGiHcty94vO0iC8mxQ*OgkHOI6fZmdzQCxsb-baX1U_'}
發(fā)達(dá)請求時,傳遞Cookie
html = requests.get(url,cookies=cookie).content
詳細(xì)可參考匠襟,《用Python玩轉(zhuǎn)QQ群論壇》
二钝侠、用Scrapy實(shí)現(xiàn)模擬登錄
在Scrapy中Cookie登錄的步驟跟上面一樣,但是在實(shí)現(xiàn)過來中酸舍,卻遇到很多困難帅韧,一直困擾我,而且在Scrapy中提示不多父腕,如請求被禁止:
getting Forbidden by robots.txt: scrapy
總結(jié)一下Scrapy中實(shí)現(xiàn)Cookie登錄的方法:
1)Cookie的寫法不一樣:
注意弱匪,驗(yàn)證登錄寫在start_requests()方法中,傳遞cookie參數(shù)璧亮。
return [FormRequest("http://qgc.qq.com/309o916014x/",cookies=cookies,callback=self.parse)]
- 在settings.py中的配置萧诫,增加:
ROBOTSTXT_OBEY=False
再次啟動爬蟲,成功枝嘶!還是同樣的頁面帘饶,抓取到數(shù)據(jù)。
總結(jié)一下群扶,使用Cookie登錄的好處:
不需要知道登錄url和表單字段以及其他參數(shù)及刻,不需要了解登錄的過程和細(xì)節(jié)。由于不是采用登錄url, 用戶名+密碼的方式竞阐。配合工具使用缴饭,快速方便。
所謂用Cookie實(shí)現(xiàn)登錄骆莹,就把過登錄過的信息(包括用戶名颗搂、密碼以及其他的驗(yàn)證信息)打包一起發(fā)給服務(wù)器,告訴服務(wù)器我是登錄驗(yàn)證過的幕垦。
不足之處丢氢,Cookie有過期時間傅联,過一段時間再運(yùn)行這個爬蟲,需要重新獲取一下Cookie的值疚察。抓取數(shù)據(jù)過程是沒有問題的蒸走。
關(guān)于Cookie的介紹:
Cookie分類
Cookie總是保存在用戶客戶端中,按在客戶端中的存儲位置貌嫡,可分為內(nèi)存Cookie和硬盤Cookie比驻。Cookie的有效性,最短的瀏覽器關(guān)閉后就消失了衅枫,最長是可以一直保存嫁艇,直到被刪除。Cookie用途
因?yàn)镠TTP協(xié)議是無狀態(tài)的弦撩,即服務(wù)器不知道用戶上一次做了什么,這嚴(yán)重阻礙了交互式Web應(yīng)用程序的實(shí)現(xiàn)论皆。
在典型的應(yīng)用是網(wǎng)上購物場景中益楼,用戶瀏覽了幾個頁面,買了一盒餅干和兩飲料点晴。最后結(jié)帳時感凤,由于HTTP的無狀態(tài)性,不通過額外的手段粒督,服務(wù)器并不知道用戶到底買了什么陪竿。
所以Cookie就是用來繞開HTTP的無狀態(tài)性的“額外手段”之一。服務(wù)器可以設(shè)置或讀取Cookies中包含信息屠橄,借此維護(hù)用戶跟服務(wù)器中的狀態(tài)族跛。Cookie的缺陷
1)Cookie會被附加在每個HTTP請求中,所以無形中增加了流量锐墙。
- 由于在HTTP請求中的Cookie是明文傳遞的礁哄,所以安全性成問題。(除非用HTTPS)
- Cookie的大小限制在4KB左右溪北。對于復(fù)雜的存儲需求來說是不夠用的桐绒。