在之前寫過一篇使用python爬蟲爬取電影天堂資源的文章,重點是如何解析頁面和提高爬蟲的效率。由於電影天堂上的資源擷取許可權是所有人都一樣的,所以不需要進行登入驗證操作,寫完那篇文章後又花了些時間研究了一下python類比登陸,網上關於這部分的資料很多,很多demo都是登陸知乎的,原因是知乎的登陸比較簡單,只需要post幾個參數,儲存cookie。而且還沒有進行加密,很適合用來做教學。我也是是新手,一點點的摸索終於成功登陸上了知乎。就通過這篇文章分享一下學習這部分的心得,希望對那些和我一樣的初學者有所協助。
先來說一下,爬蟲類比登陸的基本原理吧,我也是剛開始接觸對於一些深層次的東西也不是掌握的很清楚。首先比較重要的一個概念就是cookie,我們都知道HTTP是一種無狀態的協議,也就是說當一個瀏覽器用戶端向伺服器提交一個request,伺服器回應一個response後,他們之間的聯絡就中斷了。這樣就導致了這個用戶端在向伺服器發送請求時,伺服器無法判別這兩個用戶端是不是一個了。這樣肯定是不行的。這時cookie的作用就體現出來了。當用戶端向伺服器發送一個請求後,伺服器會給它分配一個標識(cookie),並儲存到用戶端本地,當下次該用戶端再次發送請求時連帶著cookie一併發送給伺服器,伺服器一看到cookie,啊原來是你呀,這是你的東西,拿走吧。所以一個爬蟲類比登陸就是要要做到類比一個瀏覽器用戶端的行為,首先將你的基本登入資訊發送給指定的url,伺服器驗證成功後會返回一個cookie,我們就利用這個cookie進行後續的爬取工作就行了。
我這裡抓包用的就是chrome的開發人員工具,不過你也可以使用Fiddler、Firebug等都可以,只不過作為一名前端er對chrome有一種特殊的喜愛之情。準備好工具接下來就要開啟知乎的登陸頁面並查看https://www.zhihu.com/#signin 我們可以很容易發現這個請求 發送的就是登入資訊,當然我使用手機登陸的 用郵件登陸的是最後結尾是email
所以我們只需要向這個地址post資料就行了
phone_num 登入名稱
password 密碼
captcha_type 驗證碼類型(這個參數著這裡並沒有實質作用)
rember_me 記住密碼
_xsrf 一個隱藏的表單元素 知乎用來防禦CSRF的(關於CSRF請開啟這裡) 我發現這個值是固定所以就在這裡直接寫死了 若果有興趣的同學可以寫一個Regex 把這部分的值提取出來 這樣更嚴謹一些。
# -*- coding:utf-8 -*-import urllib2import urllibimport cookielibposturl = 'https://www.zhihu.com/login/phone_num'headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) ''AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/52.0.2743.116 Safari/537.36','Referer':'https://www.zhihu.com/'}value = {'password':'*****************','remember_me':True,'phone_num':'*******************','_xsrf':'**********************'}data=urllib.urlencode(value)#初始化一個CookieJar來處理CookiecookieJar=cookielib.CookieJar()cookie_support = urllib2.HTTPCookieProcessor(cookieJar)#執行個體化一個全域openeropener=urllib2.build_opener(cookie_support)request = urllib2.Request(posturl, data, headers)result=opener.open(request)print result.read()
當你看到伺服器返回這個資訊的時候就說明你登陸成功了
{"r":0,"msg": "\u767b\u5f55\u6210\u529f"}#翻譯過來就是 “登陸成功” 四個大字
然後你就可以用這個身份去抓取知乎上的頁面了
page=opener.open("https://www.zhihu.com/people/yu-yi-56-70")content = page.read().decode('utf-8')print(content)
這段代碼就是通過執行個體化一個opener對象儲存成功登陸後的cookie資訊,然後再通過這個opener帶著這個cookie去訪問伺服器上關於這個身份的完整頁面。更複雜的比如微博的登陸這種對請求的資料進行加密了的後面有時間再寫出來,與大家分享