使用Python请求模块登录网站

使用Python请求模块登录网站,python,python-2.7,python-requests,Python,Python 2.7,Python Requests,我正在尝试使用“请求”模块登录网站。我不确定在html表单中引用什么来发布用户名和密码。这是我试图用来发布和登录的表单: <div class="login-box contents" id="login"> <!--<div class="login-instruction"> <label class="fl-label"> Enter your

我正在尝试使用“请求”模块登录网站。我不确定在html表单中引用什么来发布用户名和密码。这是我试图用来发布和登录的表单:

<div class="login-box contents" id="login">
                        <!--<div class="login-instruction">
                            <label class="fl-label"> Enter your information below to login. </label>
                        </div>-->
                        <div class="login-username">
                            <label for="username" class="fl-label">Username: </label>
                            <div class="clearboth"></div>


                            <input id="proxyUsername" name="proxyUsername" class="required" tabindex="1" maxLength="100" type="text" value="" onChange="remove_Error()" autocomplete="off"/>

                        </div>
                        <div class="float-right">
                            <b><input type="checkbox" id="proxyRememberUser" name="proxyRememberUser" tabindex="-1" value="checked">&nbsp;Remember Username</input></b>
                        </div>
                        <br/>
                        <div class="login-password">
                            <label for="password" class="fl-label">Password: </label>
                            <div class="clearboth"></div>

                            <input id="proxyPassword" name="proxyPassword" class="required" tabindex="2" maxLength="50" type="password" value="" onChange="remove_Error()" autocomplete="off" />
                        </div>

您需要将用户名和密码作为身份验证标头添加到请求中。您可以在此处找到更多详细信息:

您只需使用
s.auth=(用户名、密码)
。这是实现它最简单的方法。但是,如果您想自己将其添加到头中,则必须首先构建头。授权标头包含需要B64编码的用户名和密码。例如:

[在python3中]

from base64 import b64encode
import requests

username = input('Please enter your username: ')
password = input('Please enter your password: ')

authHandler = '{0}:{1}'.format(username, password).encode()
authHeader = {'Authorization' : 'Basic {0}'.format(b64encode(authHandler).decode("ascii"))}
with requests.Session() as s:
    con = s.post('somewebsite.com', headers=authHeader)
[在python2.7中]

from base64 import b64encode
import requests

username = raw_input('Please enter your username: ')
password = raw_input('Please enter your password: ')

authHandler = '{0}:{1}'.format(username, password)
authHeader = {'Authorization' : 'Basic {0}'.format(b64encode(authHandler))}
with requests.Session() as s:
    con = s.post('somewebsite.com', headers=authHeader)

正如@hlt所评论的,您必须将字段命名为表单中的名称

此外,服务器可能会验证“记住用户名”复选框,所以最好将其包含在您的请求中

payload_login = {
    'proxyUsername': username,
    'proxyPassword': password,
    'proxyRememberUser': true
}
如果这不适用于您,则意味着站点发送身份验证数据的方式不同。例如,一些JS脚本可能会在请求中添加隐藏数据,或者对一些字段进行编码


要找到它,您需要在浏览器或外部HTTP嗅探器(如)中搜索此HTTP请求。

您是否尝试过使用正确的字段名(
“proxyUsername”
“proxyPassword”
)而不是
“Username”
“Password”
),是的,它不起作用。您通常会引用这样一个属性的值吗?谢谢。我不清楚如何使用
s.auth=(用户名、密码)
登录。我是否声明了这一点,然后对登录URL发出get请求?@Ashwin您的解决方案使用HTTP Auth。为什么您认为目标站点实现了它并将解析HTTP Auth头?大多数现代网站都不这么做。@StevenWerner是的。定义sessions对象后,设置其标题。通过使用s.auth,您可以为该会话设置HTTP auth头。然后,如果需要,该会话中的每个请求都将使用该身份验证头。RFC定义身份验证通信的方式如下:1)将get请求设置为服务器2)服务器使用401响应,以及域和身份验证类型的详细信息3)如果存在为该类型定义的身份验证头(在本例中为其基本身份验证)然后使用身份验证标头重新发送请求。@UHBI19我同意还有其他身份验证模式,如摘要、宣誓、Oath2。但据我所知,Basic仍然是最常见的,因此我在示例中使用了它。@StevenWerner:对于其他类型的身份验证,您也可以从这里使用请求库@uhbi19我收回这一点,更多的研究告诉我,基于表单的帖子不使用http头。调查一下。ThanksIt仍然不起作用,所以我认为你是对的,这里正在进行其他类型的编码,这并不奇怪。谢谢你的帮助,我正在查看Chrome开发面板。问题是我不知道该找什么,也不知道该怎么办。关于这个问题,你有什么资源可以告诉我吗?在网络>标题选项卡下,我可以看到我的用户名和密码。完整的pw是可见的。在请求标题下,它显示:Content-Type:application/x-www-form-urlencoded。这是否相关?很抱歉提出了一个模糊/巨大的问题。在“网络”选项卡中,您可以看到在此页面上执行的所有请求的列表。然后选择授权请求,需要研究-HTTP方法、POST参数(以及根据请求查询HTTP有效负载上的参数)和头。它们可能包含一些密钥。您需要将请求中有价值的标题和数据添加到代码中。@StevenWerner请在PasteBin上共享此请求。要做到这一点,您需要右键单击必要的请求,然后选择“另存为HAR”(对于Google Chrome开发工具,FireBug也有类似的选项)。此JSON包含有关请求的所有信息。要了解PARM的重要性,可以使用以下工具。
payload_login = {
    'proxyUsername': username,
    'proxyPassword': password,
    'proxyRememberUser': true
}