无法使用Python请求登录网站

时间:2019-10-13 08:42:46

标签: python web-scraping python-requests

请帮助我登录该网站。 网站: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 请帮助

1 个答案:

答案 0 :(得分:1)

在处理ASP.NET网站/表单时,还需要提供强制性的隐藏回发输入,即:

  • __EVENTTARGET
  • __EVENTARGUMENT
  • __VIEWSTATE
  • __VIEWSTATEGENERATOR
  • __EVENTVALIDATION

可以在inputtype="hidden"中找到这些字符。我的建议是使用BeautifulSoup4模块(link)来捕获这些隐藏的变量,该模块提供了一种从网页获取元素的相对简单的方法。其他人会选择reRegular Expressions)方法,该方法比较简单,但是许多人喜欢它能够快速完成工作且无需添加外部依赖项的功能。

无论如何,一旦有了这些隐藏的值,便会将这些值与已经拥有的值一起包含在有效负载中。

要了解我是如何到达这里的,可以查看源代码,您会在类似的多个地方注意到__doPostBack函数:

function EnterEvent(e) { 
    if (e.keyCode == 13){ 
        __doPostBack('ctl00$ContentPlaceHolder1$btnLogin', "");
    }
}

这是什么意思?
这意味着在发送数据时,您需要根据执行的操作为函数提供适当的__EVENTTARGET__EVENTARGUMENT

如何找出这两个变量的适当值?
为此,我们看一下“登录”按钮的源代码:

<a id="lnkstlogin" href="javascript:__doPostBack(&#39;ctl00$lnkstlogin&#39;,&#39;&#39;)">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)