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

讚賞
微信支付 支付寶
微信支付寶