无法使用Python 3的请求登录

无法使用Python 3的请求登录,python,web-scraping,python-requests,python-3.3,Python,Web Scraping,Python Requests,Python 3.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) (由于明显的原因,登录密码组合无效) 然而

我正试图使用请求来获取一些数据,但我遇到了一些问题:

我的代码如下:

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)

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

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

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

此外,登录表单页面可能正在响应cookies。在这种情况下,您需要发出两个请求。一个请求检索登录表单页面(和cookies)…第二个请求提交表单数据以及cookie数据。请参阅

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

更新:

登录表单正在设置cookies,因此要模拟正常的浏览器登录,您应该在第二个请求中返回cookies

您的第一个请求如下:

>>> 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)]>

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


可能有一些字段用于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)

打印(r.status\u代码、r.headers、r.request.headers)
我也尝试过这个方法,但我会修改我的问题。是的,服务器可能正在检查隐藏的表单变量,所以也要包括它。任何使用web浏览器的正常登录都会提交所有表单变量,包括隐藏的表单变量。由于某些原因,我无法想出一些有效的方法。我已扩展了我的答案。如果cookies n要跨请求维护eed,而不是使用上面的系统,您应该使用requests
Session
对象,这将为您完成繁重的工作。
>>> payload = {'_VIEWSTATE': 'THE_LONG_STRING', '_EVENTVALIDATION': 'THE_LONG_STRING', 'edUsername': YOUR_USER_NAME, ...} # SOME OTHER DATA  
>>> res = requests.post(url, data=payload)