1. 程式人生 > >使用selenium模擬登錄知乎

使用selenium模擬登錄知乎

獲得 rom 教程 方法 mage 解析 進行 第三方 問題

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

獲取知乎內容的方法有兩種,一種是使用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: 在一切處理好之後我在模擬點擊登錄時又碰到了一個問題,切切都處理好了,在點擊登錄按鈕後並沒有進入登錄頁面,而是顯示 “Miss argument grant_type ” 查詢資料說是瀏覽器版本問題,當我將Chrome從70降到60後問題就解決了。

ps: 本次代碼我全部在我的github上: https://github.com/songsa1/Python_song (60版本的Chrome和對應的webdriver的百度雲鏈接在項目的readme中)

歡迎大家來關註我的個人公眾號:“進階的爬蟲” 我會定期在公眾號中分享爬蟲的教程、項目案例,還有互聯網圈中的一些新聞、趣事兒。

技術分享圖片

使用selenium模擬登錄知乎