无法使用Python 3的请求登录

时间:2013-12-23 15:15:45

标签: python web-scraping python-requests python-3.3

我正在尝试使用请求尝试抓取此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)

(由于显而易见的原因,登录密码组合不是有效的)

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

请你帮我理解出了什么问题?

编辑: 我试图以下列方式发布参数:

payload = {'edUsername': 'atoto', 'edPassword': 'password'}
r = requests.get("https://v4.fitnessandlifestylecentre.com/WebAccess/login.aspx", data=payload)

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

3 个答案:

答案 0 :(得分:1)

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

可能有一些csrf保护字段。因此,请仔细检查表单和请求中的响应,以检查是否存在任何错误(显然不是http错误)

答案 1 :(得分:1)

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

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)

答案 2 :(得分:0)

可能是网站不支持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,以便模拟正常的浏览器登录,您应该在第二次请求中返回这些。

您的第一个请求是这样的:

>>> import requests
>>> url = "https://v4.fitnessandlifestylecentre.com/WebAccess/login.aspx"
>>> r1 = requests.get(url)

您可以使用响应对象cookies属性

访问Cookie
>>> 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)