使用selenium模擬登陸知乎

網上流傳着許多抓取知乎數據的代碼,抓取它的數據有一個問題必定繞不過去,那就是模擬登陸,今天咱們就來聊聊知乎的模擬登陸。git

獲取知乎內容的方法有兩種,一種是使用request,想辦法攜帶cookies等必要參數去請求數據,可是使用requests的話,不只要解析Cookies,還要獲取XSRF,比較麻煩,因此我想到了selenium。github

我直接控制Chrome請求知乎,而後模擬輸入用戶名和密碼,這樣不也能夠嗎,嘿嘿web

接下來講一下大致流程:瀏覽器

  首先控制selenium模擬請求知乎登陸界面:https://www.zhihu.com/signup?next=%2F微信

  

  可是默認爲註冊,因此須要控制鼠標來點擊上邊那個登陸按鈕,就變成這樣了。cookie

  

  而後咱們在控制瀏覽器找到輸入用戶名、密碼的這兩個input標籤,使用send_keys()來將用戶名密碼輸入進去便可,部分代碼以下:session

  

  但就在我正要點擊登陸按鈕時問題出現了:驗證碼測試

  通過測試,知乎的驗證碼分爲兩種,並且兩種驗證碼所對應的代碼是不同的:編碼

    第一種:4位英文數字組成的圖片,用戶輸入對應的英文數字便可。spa

    第二種:純中文組成的圖片,用戶使用鼠標來點擊圖片中倒立的漢字進行驗證。

  可是我發現驗證碼也不是次次都出現的,並且若是驗證碼要出現,當用戶輸入完密碼以後就能夠看見了。

  並且即便驗證碼沒有在頁面中顯示出來,卻並不表明沒有驗證碼,驗證碼那一部分代碼仍是存在的,只是在存放驗證碼圖片的<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

  

相關文章
相關標籤/搜索