python爬蟲知乎

在以前寫過一篇使用python爬蟲爬取電影天堂資源的博客,重點是如何解析頁面和提升爬蟲的效率。因爲電影天堂上的資源獲取權限是全部人都同樣的,因此不須要進行登陸驗證操做,寫完那篇文章後又花了些時間研究了一下python模擬登錄,網上關於這部分的資料不少,不少demo都是登錄知乎的,緣由是知乎的登錄比較簡單,只須要post幾個參數,保存cookie。並且尚未進行加密,很適合用來作教學。我也是是新手,一點點的摸索終於成功登錄上了知乎。就經過這篇文章分享一下學習這部分的心得,但願對那些和我同樣的初學者有所幫助。前端

先來講一下,爬蟲模擬登錄的基本原理吧,我也是剛開始接觸對於一些深層次的東西也不是掌握的很清楚。首先比較重要的一個概念就是cookie,咱們都知道HTTP是一種無狀態的協議,也就是說當一個瀏覽器客戶端向服務器提交一個request,服務器迴應一個response後,他們之間的聯繫就中斷了。這樣就致使了這個客戶端在向服務器發送請求時,服務器沒法判別這兩個客戶端是否是一個了。這樣確定是不行的。這時cookie的做用就體現出來了。當客戶端向服務器發送一個請求後,服務器會給它分配一個標識(cookie),並保存到客戶端本地,當下次該客戶端再次發送請求時連帶着cookie一併發送給服務器,服務器一看到cookie,啊原來是你呀,這是你的東西,拿走吧。因此一個爬蟲模擬登錄就是要要作到模擬一個瀏覽器客戶端的行爲,首先將你的基本登陸信息發送給指定的url,服務器驗證成功後會返回一個cookie,咱們就利用這個cookie進行後續的爬取工做就好了。python

我這裏抓包用的就是chrome的開發者工具,不過你也能夠使用Fiddler、Firebug等均可以,只不過做爲一名前端er對chrome有一種特殊的喜好之情。準備好工具接下來就要打開知乎的登錄頁面並查看https://www.zhihu.com/#signin咱們能夠很容易發現這個請求 發送的就是登陸信息,固然我使用手機登錄的 用郵件登錄的是最後結尾是email正則表達式

Python 爬蟲模擬登錄知乎

因此咱們只須要向這個地址post數據就好了chrome

phone_num 登陸名瀏覽器

password 密碼服務器

captcha_type 驗證碼類型(這個參數着這裏並無實質做用)cookie

rember_me 記住密碼併發

_xsrf 一個隱藏的表單元素 知乎用來防護CSRF的(關於CSRF請打開這裏) 我發現這個值是固定因此就在這裏直接寫死了 若果有興趣的同窗能夠寫一個正則表達式 把這部分的值提取出來 這樣更嚴謹一些。python爬蟲

# -*- 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.CookieJarcookie_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去訪問服務器上關於這個身份的完整頁面。更復雜的好比微博的登錄這種對請求的數據進行加密了的後面有時間再寫出來,與你們分享

相關文章
相關標籤/搜索