python - 學(xué)習(xí)模擬登錄,卡在發(fā)送POST請(qǐng)求之后?
問(wèn)題描述
學(xué)習(xí)模擬登錄,發(fā)送了post請(qǐng)求之后頁(yè)面還是登錄頁(yè)面啊,不知道原因
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’]=’帳號(hào)’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)
以下是抓取的數(shù)據(jù),是不是我的哪里找錯(cuò)了?
問(wèn)題解答
回答1:你可以直接使用Session的上下文,然后全都的請(qǐng)求都通過(guò)一個(gè)session實(shí)例來(lái)完成,session對(duì)象會(huì)自動(dòng)幫你處理Cookie,當(dāng)然header里的內(nèi)容在第一次請(qǐng)求的時(shí)候要自己定義。代碼結(jié)構(gòu)大致如下:
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:
沒(méi)有 cookie
f = requests.session() // 此時(shí)相當(dāng)于打開(kāi)了瀏覽器會(huì)話,接下來(lái)的操作都應(yīng)該在這個(gè)會(huì)話里面執(zhí)行,就不會(huì)有 cookie 問(wèn)題了
requests.get 換成 f.get
回答4:首先你要弄懂服務(wù)端對(duì)你的登錄之后的信任原理
服務(wù)端在你登錄的時(shí)候會(huì)保存一個(gè)session值作為憑證,并且會(huì)向你返回的響應(yīng)頭中帶有Set-Cookie字段,作為憑證,所以你需要帶著cookie發(fā)送get請(qǐng)求作為你登錄過(guò)的憑證
就好比你網(wǎng)上買(mǎi)了張電子票,人家確實(shí)知道你買(mǎi)了,但是在入場(chǎng)的時(shí)候怎么樣證明你是你呢,就是要拿著購(gòu)買(mǎi)之后人家給你的實(shí)體票憑票入場(chǎng)
回到現(xiàn)在的場(chǎng)景,服務(wù)端知道你登錄了,并且保存了session(相當(dāng)于保存了買(mǎi)票的訂單數(shù)據(jù)),此時(shí)當(dāng)你發(fā)送get請(qǐng)求的時(shí)候,你需要證明你是剛才登錄的那個(gè)你(相當(dāng)于需要實(shí)體票),此時(shí)你就需要發(fā)送在登陸時(shí)服務(wù)端向你返回的Set-Cookie字段的數(shù)據(jù)(掏出你的實(shí)體票證明你買(mǎi)過(guò)票),然后服務(wù)端才能確認(rèn)你的身份給你相應(yīng)的數(shù)據(jù)(相當(dāng)于憑票入場(chǎng))
說(shuō)回到代碼的具體實(shí)現(xiàn),你需要去查詢(xún)r(jià)equests庫(kù)如何在發(fā)送請(qǐng)求的時(shí)候把登錄后的cookie帶上,這樣你就能夠登錄成功了
