在之前寫過一篇使用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請打開這里) 我發現這個值是固定所以就在這里直接寫死了 若果有興趣的同學可以寫一個正則表達式 把這部分的值提取出來 這樣更嚴謹一些。
# -*- coding:utf-8 -*- import urllib2 import urllib import cookielib posturl = '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來處理Cookie cookieJar=cookielib.CookieJar() cookie_support = urllib2.HTTPCookieProcessor(cookieJar) #實例化一個全局opener opener=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去訪問服務器上關於這個身份的完整頁面。更復雜的比如微博的登陸這種對請求的數據進行加密了的后面有時間再寫出來,與大家分享