作爲之前專利爬蟲的續篇,本篇準備描述如何通過python的requests模塊登錄專利查詢網站。
環境準備
- python 3.6
- requests
chrome嘗試
首先,我們使用chrome嘗試登錄專利網站,並通過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
讚賞 | |
微信 | 支付寶 |