无法使用Python 3的请求登录

2024-10-01 00:31:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用请求来获取有关此website的一些数据,但遇到了一些问题:

我的代码如下:

import requests
from requests.auth import HTTPBasicAuth
r = requests.get("https://v4.fitnessandlifestylecentre.com/WebAccess/login.aspx", auth=HTTPBasicAuth('atoto', 'password'))
print(r.text)

(登录密码组合因明显原因无效)

然而,当返回这个时,我没有得到一个成功登录后我会得到的页面,但我得到的登录页面略有不同(可能是因为网站认为这是一个不成功的登录尝试。在

你能帮我弄清楚出什么问题了吗?在

编辑: 我试图用以下方式发表论点:

^{pr2}$

但结果是一样的。我注意到表单中有一些隐藏的变量,我应该把它们也贴出来吗?在


Tags: 数据代码fromhttpsimportcomauthget
3条回答

我观察到,当登录时,会将以下数据发布到服务器:

enter image description here

因此,我认为您必须将这些字段包含到dict变量中,然后将它们发送到服务器,例如:

>>> payload = {'_VIEWSTATE': 'THE_LONG_STRING', '_EVENTVALIDATION': 'THE_LONG_STRING', 'edUsername': YOUR_USER_NAME, ...} # SOME OTHER DATA  
>>> res = requests.post(url, data=payload)

您应该检查表单中是否有隐藏的字段(其中有一些字段)

当然,csrf保护还有一定的领域。因此,请仔细检查表单和您从请求中得到的响应,以检查是否有任何错误(显然不是http错误)

可能是网站不支持HTTP基本身份验证。因此,您需要将登录表单上显示的字段的表单数据值提交给登录.aspx使用httppost请求的url。例如:

>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)

http://docs.python-requests.org/en/latest/user/quickstart/#more-complicated-post-requests

另外,可能登录表单页面正在用cookies响应。那样的话,你需要提出两个请求。一个用于检索登录表单页面(和cookies)…第二个请求提交表单数据和cookie数据。见http://docs.python-requests.org/en/latest/user/quickstart/#cookies

另外,请确保在第二个请求中提交的隐藏表单值与第一个响应中表单中的值匹配。在

更新:

登录表单正在设置cookies,以便模拟正常的浏览器登录,您应该在第二个请求中返回这些cookies。在

您的第一个请求如下:

^{pr2}$

您可以使用response objectscookies属性访问cookies

>>> r1.cookies
<<class 'requests.cookies.RequestsCookieJar'>[Cookie(version=0, name='ASP.NET_SessionId', value='plhmrq3syuqgcyab1g52nq55', port=None, port_specified=False, domain='v4.fitnessandlifestylecentre.com', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False), Cookie(version=0, name='SDAWA_culture', value='en-US', port=None, port_specified=False, domain='v4.fitnessandlifestylecentre.com', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=1392999422, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)]>

您的第二个请求应该像这样提交cookies(假设您的凭证/表单数据在一个名为payload的dict中)

r2 = requests.post(url, data=payload, cookies=r1.cookies)

相关问题 更多 >