Python爬蟲:Requests模擬登錄知乎 Matplotlib識別中文倒立驗證碼

先說明一下重點中文驗證碼的問題(這里用的還是人工識別的辦法)。

剛開始用requests登錄知乎的時候,只是簡單地根據(jù)不同登錄方式請求的url來用requests傳遞參數(shù)請求胚宦,然后debug次數(shù)多了以后就會一直出錯。如下注釋掉我要post的驗證碼數(shù)據(jù),由一個函數(shù)調(diào)用返回:


先用寫完后的代碼作說明掏愁,captcha為驗證碼


pycharm調(diào)試模式下response的內(nèi)容

將msg內(nèi)容在python shell里print一下就是驗證碼識別失敗歇由,說明這個時候必須將驗證碼數(shù)據(jù)在登錄表單里post過去。

因為一般瀏覽器登錄以后果港,都會獲取服務(wù)器返回的cookie保存在本地印蓖,以后瀏覽器再訪問都會帶上cookie中的信息供服務(wù)端識別。這里登錄以后可以保存cookie京腥,用reqeusts庫的會話實例來完成原本requests的函數(shù)調(diào)用

session = requests.Session()

session.cookies = cookielib.LWPCookieJar(filename="cookies.txt")?? # 指定cookies的保存文件名

以上代碼和調(diào)用session.cookies.save()保存cookies還需要cookiejar

(好像有這個庫兼容性問題赦肃,用這樣的寫法比較好

try:

??? import cookielib

except:

??? import http.cookiejar as cookielib

另外知乎總會識別請求頭是否有不合法的字段值,比如用戶的請求代理是客戶端瀏覽器還是python代碼公浪,從而拒絕請求他宛,必須在每個請求帶上header, 如:

header = {

"Host": "www.zhihu.com",

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0",

"Referer": "https://www.zhihu.com/"

}

1. 模擬登錄開始:

用requests登錄重要的一個方法就是requests.post(), 參數(shù)為目標(biāo)url和表單數(shù)據(jù)。在知乎登錄界面欠气,輸入郵箱或者手機號厅各,故意填錯密碼,打開瀏覽器網(wǎng)頁調(diào)試器预柒,點擊網(wǎng)絡(luò)(network)队塘,觀察請求的網(wǎng)頁文件,可以看到http協(xié)議的請求頭和響應(yīng)頭宜鸯。


郵箱登錄的請求(firefox下)

點擊參數(shù)可以看到請求所帶的參數(shù)

請求的參數(shù):

_xsrf: 防止跨站腳本攻擊的隨機數(shù)

password: 登錄密碼

capatcha_type: 驗證碼類型憔古,這里是cn

email: 登錄郵箱

手機號碼登錄同理,url和表單餐宿略有不同淋袖。


主登錄邏輯

正則表達式判斷是哪種登錄方式『枋校現(xiàn)在需要確定_xsrf 和 驗證碼,完成兩個方法來返回即碗。

2. _xsrf比較簡單焰情,用lxml或者beautifulsoup從響應(yīng)中的html文件解析即可,我這里直接用lxml解析剥懒,了解xpath就可以了内舟,和css selector有類似結(jié)構(gòu)。

需要 from lxml import etree

返回_xsrf

3. 獲取中文驗證碼:

先來看下中文驗證碼和什么url或者參數(shù)有關(guān):


刷新驗證碼圖片可以看到出現(xiàn)一個GET請求初橘,其請求url為:https://www.zhihu.com/captcha.gif?r=1508680722707&type=login&lang=cn

有過了解易知這個參數(shù)r是一個格林威治時間, 由str(int(time.time() * 1000))轉(zhuǎn)換為字符串验游,

將其與其他固定參數(shù)拼接而成請求url。

需要用到兩個庫pillow和matplotlib(這也是我第一次用matplotlib~)

pillow是python常用的操作圖像的庫壁却,matplotlib功能強大批狱,更像一個繪圖庫。

用requests請求以后保存圖片為以后識別做準(zhǔn)備展东。因為圖片有可能有兩個或一個倒立文字赔硫,先用pillow顯示圖片,手動輸入個數(shù)盐肃,再用matploylib讀入圖像文件爪膊,由ginput()函數(shù)獲取鼠標(biāo)點擊的坐標(biāo)权悟。

這里尤其要注意要用到matplotlib的ion()方法打開interactive模式!因為這個花了好久查資料推盛,因為注意到了代碼在調(diào)試模式下才工作峦阁,有輸出關(guān)于Tkagg的信息,反復(fù)看了官方文檔找到: 什么是interactive模式

將坐標(biāo)與其他信息拼接成字符串傳回耘成。

(原來知乎的請求頭里可以看得見表單數(shù)據(jù)榔昔,現(xiàn)在采用了了gzip編碼,看到的都是亂碼)

Accept-Encodingg:zip, deflate, br

返回captcha數(shù)據(jù)

4.判斷是否登錄成功

請求私信的url根據(jù)返回的status_code即可判斷瘪菌,也可以下載首頁的HTML看是否登錄撒会。

保存了cookies以后可以不用每次都重新登錄,在.py文件開頭加載進cookies师妙,在cookie過期時效內(nèi)可以直接登錄

try:

??? session.cookies.load(ignore_discard=True)

except:

??? print("cookie未能加載")


參考:

http://blog.wish7.xyz/2016/11/05/%E7%9F%A5%E4%B9%8E%E7%88%AC%E8%99%AB/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诵肛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子默穴,更是在濱河造成了極大的恐慌怔檩,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蓄诽,死亡現(xiàn)場離奇詭異薛训,居然都是意外死亡,警方通過查閱死者的電腦和手機若专,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門许蓖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝴猪,“玉大人调衰,你說我怎么就攤上這事∽在澹” “怎么了嚎莉?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沛豌。 經(jīng)常有香客問我趋箩,道長,這世上最難降的妖魔是什么加派? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任叫确,我火速辦了婚禮,結(jié)果婚禮上芍锦,老公的妹妹穿的比我還像新娘竹勉。我一直安慰自己,他們只是感情好娄琉,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布次乓。 她就那樣靜靜地躺著吓歇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪票腰。 梳的紋絲不亂的頭發(fā)上城看,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機與錄音杏慰,去河邊找鬼测柠。 笑死,一個胖子當(dāng)著我的面吹牛缘滥,可吹牛的內(nèi)容都是我干的鹃愤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼完域,長吁一口氣:“原來是場噩夢啊……” “哼软吐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吟税,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凹耙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肠仪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肖抱,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年异旧,在試婚紗的時候發(fā)現(xiàn)自己被綠了意述。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡吮蛹,死狀恐怖荤崇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情潮针,我是刑警寧澤术荤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站每篷,受9級特大地震影響瓣戚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜焦读,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一子库、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矗晃,春花似錦仑嗅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啊楚。三九已至,卻和暖如春浑彰,著一層夾襖步出監(jiān)牢的瞬間恭理,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工郭变, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留颜价,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓诉濒,卻偏偏與公主長得像周伦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子未荒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容