请帮助我登录该网站。 网站:http://www.staloysiuspuc.in/student_login.aspx 我尝试使用python中的请求登录
<form method="post" action="./student_login.aspx"
id="form1">
这是表格
我的代码是:
import requests
url = "http://www.staloysiuspuc.in/student_login.aspx"
payload = {
'ctl00$ContentPlaceHolder1$txtusername' : '*****',
'ctl00$ContentPlaceHolder1$txtpass_1' : '*****',
'ctl00$ContentPlaceHolder1$txtpass_2' : '*****',
'ctl00$ContentPlaceHolder1$txtpass_3' : '*****'
}
s = requests.Session()
r = s.post(url, data=payload)
print(r.url)
我一次又一次得到相同的网址。它应该重定向到www.st .... com / student_profile 请帮助
答案 0 :(得分:1)
在处理ASP.NET网站/表单时,还需要提供强制性的隐藏回发输入,即:
__EVENTTARGET
__EVENTARGUMENT
__VIEWSTATE
__VIEWSTATEGENERATOR
__EVENTVALIDATION
可以在input
个type="hidden"
中找到这些字符。我的建议是使用BeautifulSoup4
模块(link)来捕获这些隐藏的变量,该模块提供了一种从网页获取元素的相对简单的方法。其他人会选择re
(Regular Expressions)方法,该方法比较简单,但是许多人喜欢它能够快速完成工作且无需添加外部依赖项的功能。
无论如何,一旦有了这些隐藏的值,便会将这些值与已经拥有的值一起包含在有效负载中。
要了解我是如何到达这里的,可以查看源代码,您会在类似的多个地方注意到__doPostBack
函数:
function EnterEvent(e) {
if (e.keyCode == 13){
__doPostBack('ctl00$ContentPlaceHolder1$btnLogin', "");
}
}
这是什么意思?
这意味着在发送数据时,您需要根据执行的操作为函数提供适当的__EVENTTARGET
和__EVENTARGUMENT
。
如何找出这两个变量的适当值?
为此,我们看一下“登录”按钮的源代码:
<a id="lnkstlogin" href="javascript:__doPostBack('ctl00$lnkstlogin','')">Login</a>
在这里,您将看到需要传递的两个变量的适当值,以使登录成功。
__EVENTTARGET = ctl00$lnkstlogin # and if that fails you can try the default value ctl00$ContentPlaceHolder1$btnLogin
__EVENTARGUMENT = '' # Empty String`
# python3.7
# pip install requests BeautifulSoup4
from bs4 import BeautifulSoup
import requests
page = 'http://www.staloysiuspuc.in/student_login.aspx'
sess = requests.Session()
params = {
'ctl00$ContentPlaceHolder1$txtusername' : '***',
'ctl00$ContentPlaceHolder1$txtpass_1' : '***',
'ctl00$ContentPlaceHolder1$txtpass_2' : '***',
'ctl00$ContentPlaceHolder1$txtpass_3' : '***'
}
"""
Step 1: GET page, so Session stores cookies & so we can grab the needed values to postback
"""
resp = sess.get(page)
soup = BeautifulSoup(resp.text, 'html.parser')
# Step 2: Add the discussed parameters
params['__EVENTTARGET'] = 'ctl00$ContentPlaceHolder1$btnLogin'
params['__EVENTARGUMENT'] = ''
params['__VIEWSTATE'] = soup.find('input', id='__VIEWSTATE')['value']
params['__VIEWSTATEGENERATOR'] = soup.find('input', id='__VIEWSTATEGENERATOR')['value']
params['__EVENTVALIDATION'] = soup.find('input', id='__EVENTVALIDATION')['value']
# Step 3: Make the POST request
resp = sess.post(page, data=params)
# resp.url should be the url you said we'd be redirected to
print(resp.url)