python - 學習模擬登錄,卡在發送POST請求之后?
問題描述
學習模擬登錄,發送了post請求之后頁面還是登錄頁面啊,不知道原因
import reimport requestsurl=’http://cer.imufe.edu.cn/authserver/login?service=http%3A%2F%2Fmy.imufe.edu.cn%2Findex.portal’html=requests.get(url).textlt_value=re.compile(r’name='lt' value='(.*?)'’).search(html).group(1)execution_value=re.compile(r’name='execution' value='(.*?)'’).search(html).group(1)dt={}dt[’username’]=’帳號’dt[’password’]=’密碼’dt[’signIn’]=’’dt[’lt’]=lt_valuedt[’execution’]=execution_valuedt[’_eventId’]=’submit’hd={}hd[’User-Agent’]=’Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36’hd[’Referer’]=urlurl2=’http://my.imufe.edu.cn/detach.portal?.pmn=view&action=bulletinBrowser&.ia=false&.pen=pe1253&bulletinId=cf2509cf-9a54-11e6-86e2-7347af9c723b’se=requests.session()se.post(url,data=dt,headers=hd)print(se.get(url2).text)
以下是抓取的數據,是不是我的哪里找錯了?
問題解答
回答1:你可以直接使用Session的上下文,然后全都的請求都通過一個session實例來完成,session對象會自動幫你處理Cookie,當然header里的內容在第一次請求的時候要自己定義。代碼結構大致如下:
import requestsurl = ''headers = {}with requests.Session() as s: s.headers.update(headers) s.get(url) s.post(login_url)回答2:
再去看requests文檔吧 ,a b c d變量名辣眼睛回答3:
沒有 cookie
f = requests.session() // 此時相當于打開了瀏覽器會話,接下來的操作都應該在這個會話里面執行,就不會有 cookie 問題了
requests.get 換成 f.get
回答4:首先你要弄懂服務端對你的登錄之后的信任原理
服務端在你登錄的時候會保存一個session值作為憑證,并且會向你返回的響應頭中帶有Set-Cookie字段,作為憑證,所以你需要帶著cookie發送get請求作為你登錄過的憑證
就好比你網上買了張電子票,人家確實知道你買了,但是在入場的時候怎么樣證明你是你呢,就是要拿著購買之后人家給你的實體票憑票入場
回到現在的場景,服務端知道你登錄了,并且保存了session(相當于保存了買票的訂單數據),此時當你發送get請求的時候,你需要證明你是剛才登錄的那個你(相當于需要實體票),此時你就需要發送在登陸時服務端向你返回的Set-Cookie字段的數據(掏出你的實體票證明你買過票),然后服務端才能確認你的身份給你相應的數據(相當于憑票入場)
說回到代碼的具體實現,你需要去查詢requests庫如何在發送請求的時候把登錄后的cookie帶上,這樣你就能夠登錄成功了
