Python 爬蟲模擬登陸知乎
在之前寫過一篇使用python爬蟲爬取電影天堂資源的文章,重點(diǎn)是如何解析頁面和提高爬蟲的效率。由于電影天堂上的資源獲取權(quán)限是所有人都一樣的,所以不需要進(jìn)行登錄驗(yàn)證操作,寫完那篇文章后又花了些時(shí)間研究了一下python模擬登陸,網(wǎng)上關(guān)于這部分的資料很多,很多demo都是登陸知乎的,原因是知乎的登陸比較簡單,只需要post幾個參數(shù),保存cookie。而且還沒有進(jìn)行加密,很適合用來做教學(xué)。我也是是新手,一點(diǎn)點(diǎn)的摸索終于成功登陸上了知乎。就通過這篇文章分享一下學(xué)習(xí)這部分的心得,希望對那些和我一樣的初學(xué)者有所幫助。
先來說一下,爬蟲模擬登陸的基本原理吧,我也是剛開始接觸對于一些深層次的東西也不是掌握的很清楚。首先比較重要的一個概念就是cookie,我們都知道HTTP是一種無狀態(tài)的協(xié)議,也就是說當(dāng)一個瀏覽器客戶端向服務(wù)器提交一個request,服務(wù)器回應(yīng)一個response后,他們之間的聯(lián)系就中斷了。這樣就導(dǎo)致了這個客戶端在向服務(wù)器發(fā)送請求時(shí),服務(wù)器無法判別這兩個客戶端是不是一個了。這樣肯定是不行的。這時(shí)cookie的作用就體現(xiàn)出來了。當(dāng)客戶端向服務(wù)器發(fā)送一個請求后,服務(wù)器會給它分配一個標(biāo)識(cookie),并保存到客戶端本地,當(dāng)下次該客戶端再次發(fā)送請求時(shí)連帶著cookie一并發(fā)送給服務(wù)器,服務(wù)器一看到cookie,啊原來是你呀,這是你的東西,拿走吧。所以一個爬蟲模擬登陸就是要要做到模擬一個瀏覽器客戶端的行為,首先將你的基本登錄信息發(fā)送給指定的url,服務(wù)器驗(yàn)證成功后會返回一個cookie,我們就利用這個cookie進(jìn)行后續(xù)的爬取工作就行了。
我這里抓包用的就是chrome的開發(fā)者工具,不過你也可以使用Fiddler、Firebug等都可以,只不過作為一名前端er對chrome有一種特殊的喜愛之情。準(zhǔn)備好工具接下來就要打開知乎的登陸頁面并查看https://www.zhihu.com/#signin 我們可以很容易發(fā)現(xiàn)這個請求 發(fā)送的就是登錄信息,當(dāng)然我使用手機(jī)登陸的 用郵件登陸的是最后結(jié)尾是email
所以我們只需要向這個地址post數(shù)據(jù)就行了
phone_num 登錄名
password 密碼
captcha_type 驗(yàn)證碼類型(這個參數(shù)著這里并沒有實(shí)質(zhì)作用)
rember_me 記住密碼
_xsrf 一個隱藏的表單元素 知乎用來防御CSRF的(關(guān)于CSRF請打開這里) 我發(fā)現(xiàn)這個值是固定所以就在這里直接寫死了 若果有興趣的同學(xué)可以寫一個正則表達(dá)式 把這部分的值提取出來 這樣更嚴(yán)謹(jǐn)一些。
# -*- 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) #實(shí)例化一個全局opener opener=urllib2.build_opener(cookie_support) request = urllib2.Request(posturl, data, headers) result=opener.open(request) print result.read()
當(dāng)你看到服務(wù)器返回這個信息的時(shí)候就說明你登陸成功了
{"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)
這段代碼就是通過實(shí)例化一個opener對象保存成功登陸后的cookie信息,然后再通過這個opener帶著這個cookie去訪問服務(wù)器上關(guān)于這個身份的完整頁面。更復(fù)雜的比如微博的登陸這種對請求的數(shù)據(jù)進(jìn)行加密了的后面有時(shí)間再寫出來,與大家分享
相關(guān)文章
python pandas利用fillna方法實(shí)現(xiàn)部分自動填充功能
這篇文章主要介紹了python pandas通過fillna方法實(shí)現(xiàn)部分自動填充功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Python利用keyboard模塊實(shí)現(xiàn)鍵盤記錄操作
模擬鍵盤操作執(zhí)行自動化任務(wù),我們常用的有pyautowin等自動化操作模塊。今天介紹的這個模塊叫做keyboard,它是純Python原生開發(fā),編譯時(shí)完全不需要依賴C語言模塊。一行命令就能完成安裝,非常方便,需要的可以了解一下2022-10-10Python OpenCV實(shí)現(xiàn)鼠標(biāo)畫框效果
這篇文章主要為大家詳細(xì)介紹了Python OpenCV實(shí)現(xiàn)鼠標(biāo)畫框效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08pytorch實(shí)現(xiàn)seq2seq時(shí)對loss進(jìn)行mask的方式
今天小編就為大家分享一篇pytorch實(shí)現(xiàn)seq2seq時(shí)對loss進(jìn)行mask的方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02