[英]Unable to log in using requests with Python 3
我正在尝试使用请求来尝试在此网站上抓取一些数据,但是遇到一些问题:
我的代码如下:
import requests
from requests.auth import HTTPBasicAuth
r = requests.get("https://v4.fitnessandlifestylecentre.com/WebAccess/login.aspx", auth=HTTPBasicAuth('atoto', 'password'))
print(r.text)
(出于明显的原因,登录密码组合无效)
但是,返回此页面时,我没有获得成功登录尝试后会看到的页面,但是却返回了登录页面,但略有不同(可能是因为该网站认为登录尝试没有成功)。
请您能帮我了解问题出在哪里吗?
编辑:我试图以以下方式发布参数:
payload = {'edUsername': 'atoto', 'edPassword': 'password'}
r = requests.get("https://v4.fitnessandlifestylecentre.com/WebAccess/login.aspx", data=payload)
但结果是一样的。 我注意到表单中有一些隐藏的变量,我也应该发布它们吗?
您应该检查表单中是否有任何隐藏的字段(那里有一些字段)
可能有一些CSRF保护领域。 因此,请仔细检查表单和您从请求中获得的响应,以检查是否存在任何错误(显然不是http错误)
我观察到登录时,以下数据已发布到服务器:
因此,我认为您必须将这些字段包含到dict变量中,然后将其发布到服务器,例如:
>>> payload = {'_VIEWSTATE': 'THE_LONG_STRING', '_EVENTVALIDATION': 'THE_LONG_STRING', 'edUsername': YOUR_USER_NAME, ...} # SOME OTHER DATA
>>> res = requests.post(url, data=payload)
该网站可能不支持HTTP基本身份验证。 因此,您需要使用HTTP Post请求将登录表单上显示的字段的表单数据值提交到login.aspx 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
另外,也许登录表单页面正在响应cookie。 在这种情况下,您需要提出两个请求。 一个用于检索登录表单页面(和cookie)。第二个请求将您的表单数据与cookie数据一起提交。 参见http://docs.python-requests.org/en/latest/user/quickstart/#cookies
另外,请确保您在第二个请求中提交的隐藏表单值与您在第一个响应中表单中的值匹配。
更新:
登录表单设置了cookie,因此要模拟正常的浏览器登录,应在第二个请求中返回这些cookie。
您的第一个请求将是这样的:
>>> import requests
>>> url = "https://v4.fitnessandlifestylecentre.com/WebAccess/login.aspx"
>>> r1 = requests.get(url)
您可以使用响应对象cookies
属性访问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)]>
您的第二个请求应该像这样提交cookie(假设您的凭据/表单数据位于称为payload
的字典中)
r2 = requests.post(url, data=payload, cookies=r1.cookies)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.