python requests模擬登陸帶驗證碼的網站

作爲之前專利爬蟲的續篇,本篇準備描述如何通過python的requests模塊登錄專利查詢網站

環境準備

  • python 3.6
  • requests

chrome嘗試

首先,我們使用chrome嘗試登錄專利網站,並通過network分析各個請求的相關信息。
這裏寫圖片描述

Network

通過分析network,我們可以看到,一次登錄操作,有以上相關請求。特別注意的是,以爲登錄成功後頁面會刷新,我們需要將Network工具欄上的Preserve log勾選上,才能保證network不被刷新掉。

由此我們可以發現,checkLoginTimes-check.shtml和wee_security_check這兩次請求像是發送登錄校驗請求。

經過比對後我們發現wee_security_check纔是想要的結果。

這裏寫圖片描述
注:以上圖片中,筆者賬號密碼是瞎填的,但是j_username和j_password顯示的內容和筆者寫的內容不一致,是因爲網站在前端使用了Base64進行加密,這一點筆者是從網站發送的請求中有base64.js這個文件發現的,於是嘗試過後確實是base64加密。

cookies

查看cookies

做過web的朋友可能知道,賬號密碼驗證碼登錄的時候,經常會使用cookie作爲同一用戶的標誌。於是我們查看一下剛纔請求的cookies。
這裏寫圖片描述

爲什麼要cookies

經驗較少的朋友可能乍一看會以爲IS_LOGIN是cookies的關鍵,其實不然。
我們先要簡單瞭解一下cookies是個啥東西,有經驗的朋友可以略過。

“Cookie”是小量信息,由網絡服務器發送出來以存儲在網絡瀏覽器上,從而下次這位獨一無二的訪客又回到該網絡服務器時,可從該瀏覽器讀回此信息。這是很有用的,讓瀏覽器記住這位訪客的特定信息,如上次訪問的位置、花費的時間或用戶首選項(如樣式表)。Cookie 是個存儲在瀏覽器目錄的文本文件,當瀏覽器運行時,存儲在 RAM 中。一旦你從該網站或網絡服務器退出,Cookie 也可存儲在計算機的硬驅上。當訪客結束其瀏覽器對話時,即終止的所有 Cookie。(百度百科)

我們知道登錄有個麻煩事就是驗證碼,這個對於後臺來說其實也是個小麻煩,請求大家都發,後臺怎麼知道哪個驗證碼對應哪個瀏覽器發的請求?答案就是通過cookies。前端請求驗證碼的時候後臺先用Set-Cookie的 response header將一個標識符帶個前端瀏覽器,瀏覽器儲存後下次發送登錄請求的時候帶上之前後臺發過來的cookies,後臺就知道是對應驗證碼的結果對不對了。

明確cookie

那麼哪個cookie是我們需要的呢,我可以說通過肉眼觀察得知嗎~WEE_SID就是我們想要的cookie。好吧,管他是哪個呢,不管三七二十一全部帶上就好了。。。。。

開發

requests發送管理cookie有兩種方式,一種是手動攜帶,放在get,post等請求的參數帶上去即可。另一種使用requests.Session()自動管理cookies,我們不需要操心。但是第二種筆者測試完之後發現好像只有一個cookie的情況下是正常的,當有多個cookie的情況。比如說這個網站,就不行了。不知道是什麼原因,如有知道的朋友請告知。
這裏我們就只介紹第一種方式。

登錄流程

  • 第一步獲取驗證碼和相應cookies,
    驗證碼的地址通過觀察network獲得,這裏不再贅述。
codeurl = 'http://www.pss-system.gov.cn/sipopublicsearch/portal/login-showPic.shtml'
valcode = requests.get(codeurl)

此處cookies已經保存在valcode.cookies中,接下來我們需要將valcode保存爲圖片。

    f = open('valcode.png', 'wb')
    # 將response的二進制內容寫入到文件中
    f.write(valcode.content)
    # 關閉文件流對象
    f.close()

保存圖片之後,鑑於技術問題暫時還沒有做機器識別,只能用人眼識別了。得知驗證碼結果後我們Input進來。

    code = input('請輸入驗證碼:')
    data["j_validation_code"] = str(code)
  • 第二步發送登錄請求
    通過觀察network我們發現登錄請求所帶的參數格式如下:
data = {
        "j_loginsuccess_url": "",
        "j_validation_code": "",
        "j_username": base64Name,
        "j_password": base64Pass
    }

這裏用戶名和密碼已經通過base64加密,python中有現成的base64解碼編碼模塊,直接import進來用就可以,筆者不再贅述。

checkUrl = 'http://www.pss-system.gov.cn/sipopublicsearch/wee/platform/wee_security_check'
resp = requests.post(checkUrl, headers = checkHeader, cookies = requests.utils.dict_from_cookiejar(valcode.cookies), data=data)

發送過後,我們可以從結果看到已經登錄成功。
這裏寫圖片描述

代碼資源:http://download.csdn.net/download/will4906/9930924

讚賞
微信支付 支付寶
微信 支付寶
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章