網上流傳着許多抓取知乎數據的代碼,抓取它的數據有一個問題一定繞不過去,那就是模擬登錄,今天我們就來聊聊知乎的模擬登錄。
獲取知乎內容的方法有兩種,一種是使用request,想辦法攜帶cookies等必要參數去請求數據,但是使用requests的話,不僅要解析Cookies,還要獲取XSRF,比較麻煩,所以我想到了selenium。
我直接控制Chrome請求知乎,然后模擬輸入用戶名和密碼,這樣不也可以嗎,嘿嘿
接下來說一下大體流程:
首先控制selenium模擬請求知乎登錄界面:https://www.zhihu.com/signup?next=%2F
但是默認為注冊,所以需要控制鼠標來點擊上邊那個登錄按鈕,就變成這樣了。
然后我們在控制瀏覽器找到輸入用戶名、密碼的這兩個input標簽,使用send_keys()來將用戶名密碼輸入進去即可,部分代碼如下:
但就在我正要點擊登錄按鈕時問題出現了:驗證碼
經過測試,知乎的驗證碼分為兩種,而且兩種驗證碼所對應的代碼是不一樣的:
第一種:4位英文數字組成的圖片,用戶輸入對應的英文數字即可。
第二種:純中文組成的圖片,用戶使用鼠標來點擊圖片中倒立的漢字進行驗證。
但是我發現驗證碼也不是次次都出現的,而且如果驗證碼要出現,當用戶輸入完密碼之后就可以看見了。
而且即使驗證碼沒有在頁面中顯示出來,卻並不代表沒有驗證碼,驗證碼那一部分代碼還是存在的,只是在存放驗證碼圖片的<img>標簽那兒圖片鏈接顯示為null而已。
那么當一個用戶在登錄知乎,輸入完用戶名、密碼之后會遇到兩大類、四小類(一共四種情況):
(一)無驗證碼:用戶輸入完用戶名、密碼之后沒有看見驗證碼
(1):(英文數字驗證碼)代碼部分中<img>的class為englishImg, src為null
(2):(純中文驗證碼)代碼部分中<img>的class為chineseImg, src為null
(二)有驗證碼:用戶輸入完用戶名、密碼之后會看見驗證碼
(1):(英文數字驗證碼)代碼部分中<img>的class為englishImg, src為base64編碼的圖片路徑
(2):(純中文驗證碼)代碼部分中<img>的class為chineseImg, src為base64編碼的圖片路徑
既然分為兩大類四小類,那我們就挨個的處理,首先在輸入用戶名改密碼密碼后判斷有沒有驗證碼顯示出來,若沒有,則直接點擊登錄按鈕進行登錄;
這是我辨別驗證碼類型的部分代碼:
若有驗證碼顯示出來,則再進行細分,是中文點擊驗證碼還是英文數字輸入驗證碼,辨別驗證碼類型后再分別進行處理。
首先說一下中文驗證碼:嘿嘿嘿,時間比較倉促,這個我就沒有識別,我看別人都是將驗證碼保存至本地然后對每個中文的位置進行大致定位,然后人工輸入倒立的字的序號,然后計算出該字在圖片中的位置,在操控鼠標進行模擬點擊。
下面我們說說英文數字驗證碼:這個主要有兩種解決方案
第一種:人工打碼。當驗證碼出現時,將經過base64編碼的圖片進行解碼然后保存至本地,然后將圖片展示出來進行人工識別,再在控制台中輸入識別后的結果,最后李勇模擬瀏覽器將結果輸入到登錄頁面中進行登錄。
第二種:借助第三方打碼平台自動打碼,首先將驗證碼保存至本地,然后接入第三方打碼平台的接口進行機器打碼,最后將結果輸入登錄界面。
在這里我詳細說說第三方打碼的過程:
我是用的是“雲打碼”平台的接口(然后無意間發發現了他們平台一個錯別字,是登錄,不是登陸),首先注冊一個開發者賬號:
進去之后點擊我的軟件,新建一個自己的軟件(名字隨便填),然后會獲得一個軟件代碼(id),通訊密鑰(key),這兩個參數在調用接口時要用。
然后聯系官網上的客服,以開發者的身份向他索要測試分(雲打碼平台是收費的,沒有題分,無法識別驗證碼)
然后在官網上的開發文檔中選擇調用示例及最新DLL,點擊PythonHTTP示例下載,下載接口Demo
然后將Demo中的必要參數改一改(如username、password、id、Key等)最后在記得的代碼中調用一下即可。
在驗證碼全部處理完畢之后再進行模擬登錄就可以正常的訪問知乎中的內容了,最終我獲取了知乎首頁的文章標題
ps: 下邊這張圖片中的代碼是在模擬登錄之后將cookies持久化至本地,等下次調用時直接將cookies放到session中保持長連接進行請求,不需要再登錄
使用session.get()保持長連接重新請求時,一定要帶上header
ps: 在一切處理好之后我在模擬點擊登錄時又碰到了一個問題,切切都處理好了,在點擊登錄按鈕后並沒有進入登錄頁面,而是顯示 “Miss argument grant_type ” 查詢資料說是瀏覽器版本問題,當我將Chrome從70降到60后問題就解決了。
ps: 本次代碼我全部在我的github上: https://github.com/songsa1/Python_song (60版本的Chrome和對應的webdriver的百度雲鏈接在項目的readme中)
想了解更多Python關於爬蟲、數據分析的內容,歡迎大家關注我的微信公眾號:悟道Python