嘗試用requests模擬登入CSDN
阿新 • • 發佈:2019-01-07
今天初學用requests庫登入CSDN,在這裡記錄一下心得,有問題請大家多指導。
,用F12開發者工具抓包,看看提交了哪些資料,記得把Preserve log勾選上,不然在結果裡不顯示了。
現在得到了登入地址和提交表單,注意表單裡紅箭頭指向的兩項,lt和execution,看起來是用於驗證的字串,不帶這兩個提交的話可是登入不上去的,那從哪裡獲取這兩個引數呢?
退出登入,重新訪問剛才的登入頁面,在網頁原始碼中查詢這兩個元素的名稱,找到了,見下圖中紅框。CSDN的前端工程師還貼心地寫了註釋,然後可以用正則表示式、BeautifulSoup、lxml等各種方法很容易獲取到這兩個值,我用了lxml。
現在要解決登入時圖片驗證碼的問題,這裡我先用了手動識別輸入的方式,也沒考慮輸入錯誤時的處理,等後面再來考慮這些問題。
同樣使用抓包得到了圖片驗證碼的地址,是一個帶有時間戳引數的地址,請求一次就重新整理一次驗證碼,那我們就可以獲取驗證碼圖片儲存到本地,然後開啟再識別輸入。
所以,要做的工作就是先訪問登入頁面,從頁面中提取登入引數lt和execution,然後請求圖片驗證碼,手動錄入,提交表單完成登陸過程。過程中記得儲存cookie,完整程式碼如下:
# coding:utf-8 __author__ = 'Administrator' import requests import lxml.etree import time from PIL import Image if __name__ == '__main__': user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36" #------準備工作----------- headers = {"User-Agent": user_agent, "Host": "passport.csdn.net"} #帶cookie訪問登入頁面,獲取頁面中的隱藏登入要素 resp = requests.get("https://passport.csdn.net/account/login", headers=headers) ck=resp.cookies #用lxml建立tree物件 tree = lxml.etree.HTML(resp.text) #用xpath取得lt,execution兩個隱藏登入要素 lt = tree.xpath('//form[@id="fm1"]/input[@name="lt"]')[0].get('value') execution = tree.xpath('//form[@id="fm1"]/input[@name="execution"]')[0].get('value') # ------登入時驗證碼的獲取並手工輸入----------- #驗證碼的獲取地址 url_verify = "https://passport.csdn.net/ajax/verifyhandler.ashx" #帶時間戳訪問 timer = "rand=" + str(round(time.time(), 2)) header = {"User-Agent": user_agent, "Referer": "https://passport.csdn.net/account/login?ref=toolbar", "Host": "passport.csdn.net", "Origin": "https://passport.csdn.net", "Connection": "keep-alive"} res_verify = requests.get(url_verify, params=timer, headers=header) #將驗證碼圖片儲存到本地並開啟 f = open("yanzheng.png", 'wb') f.write(res_verify.content) f.close() pic_verify = Image.open("yanzheng.png") pic_verify.show() # ------開始登入----------- #手動識別驗證碼並輸入 code=raw_input(u"輸入驗證碼:") login_url="https://passport.csdn.net/account/verify" # 登入的地址 # 將之前獲取的隱藏登入要素加入待提交的表單 login_data={"gps":"", "username":"", "password":"", "validateCode":code, "rememberMe":"true","lt":lt,"execution":execution,"_eventId":"submit"} #帶cookie登入 response=requests.post(login_url,data=login_data,headers=header,cookies=ck) #取得登入後的cookie,訪問個人中心 cookie=response.cookies headers_blog = {"User-Agent": user_agent,"Host": "my.csdn.net", "Connection": "keep-alive"} s=requests.get("https://my.csdn.net/",headers=headers_blog,cookies=cookie) print s.content