python - 学习模拟登录,卡在发送POST请求之后?
阿神
阿神 2017-04-18 10:21:50
0
4
880

学习模拟登录,发送了post请求之后页面还是登录页面啊,不知道原因

import re
import requests
url='http://cer.imufe.edu.cn/authserver/login?service=http%3A%2F%2Fmy.imufe.edu.cn%2Findex.portal'
html=requests.get(url).text
lt_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_value
dt['execution']=execution_value
dt['_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']=url
url2='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)

以下是抓取的数据,是不是我的哪里找错了?

阿神
阿神

闭关修行中......

全部回覆(4)
Ty80

你可以直接使用Session的上下文,然後全都的請求都透過一個session實例來完成,session物件會自動幫你處理Cookie,當然header裡的內容在第一次請求的時候要自己定義。程式碼結構大致如下:

import requests

url = ""
headers = {}
with requests.Session() as s:
    s.headers.update(headers)
    s.get(url)
    s.post(login_url)
PHPzhong

再去看requests文檔吧 ,a b c d變數名辣眼睛

Peter_Zhu

沒有 cookie

f = requests.session() // 此时相当于打开了浏览器会话,接下来的操作都应该在这个会话里面执行,就不会有 cookie 问题了

requests.get 换成 f.get

洪涛

首先你要弄清楚服務端對你的登入之後的信任原理

服務端在你登入的時候會保存一個session值作為憑證,並且會向你返回的回應頭中帶有Set-Cookie欄位,作為憑證,所以你需要帶著cookie發送get請求作為你登入過的憑證

就好比你網上買了張電子票,人家確實知道你買了,但是在入場的時候怎麼樣證明你是你呢,就是要拿著購買之後人家給你的實體票憑票入場

回到現在的場景,服務端知道你登入了,並且保存了session(相當於保存了買票的訂單資料),此時當你發送get請求的時候,你需要證明你是剛才登入的那個你(相當於需要實體票),此時你就需要發送在登陸時服務端向你返回的Set-Cookie字段的數據(掏出你的實體票證明你買過票),然後服務端才能確認你的身分給你對應的資料(相當於憑票入場)

說回到程式碼的具體實作,你需要去查詢requests函式庫如何在發送請求的時候把登入後的cookie帶上,這樣你就能夠登入成功了

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!