如何“登录”到一个使用 Python 的请求模块的网站?

我正在尝试发布一个请求,以使用 Python 中的 Request 模块登录到一个网站,但它并没有真正起作用。我是新手... 所以我不知道我是否应该使我的用户名和密码 cookie 或某种类型的 HTTP 授权的东西,我发现(? ?).

from pyquery import PyQuery
import requests


url = 'http://www.locationary.com/home/index2.jsp'

所以现在,我想我应该使用“ post”和 cookies... 。

ck = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}


r = requests.post(url, cookies=ck)


content = r.text


q = PyQuery(content)


title = q("title").text()


print title

我觉得我做饼干的方法不对... 我不知道。

如果没有正确登录,主页的标题应该是“ Locationary.com”,如果没有,应该是“ Home Page”

如果你能向我解释一些关于请求和饼干的事情,并帮助我解决这个问题,我将不胜感激。校对: D

谢谢。

它还是没有真正工作。好吧... 这是你登录之前的主页 HTML 显示的内容:

</td><td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_email.gif">    </td>
<td><input class="Data_Entry_Field_Login" type="text" name="inUserName" id="inUserName"  size="25"></td>
<td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_password.gif"> </td>
<td><input  class="Data_Entry_Field_Login"  type="password" name="inUserPass"     id="inUserPass"></td>

所以我觉得我做得对但输出仍然是“ Locationary.com”

第二编辑:

我想能够保持登录很长一段时间,每当我请求该域名下的一个网页,我想要的内容显示,如同我已经登录。

339574 次浏览

如果您想要的信息是在网页上,您被指示后立即登录..。

让我们调用 ck变量 payload,就像在 巨蟒请求文档中那样:

payload = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}
url = 'http://www.locationary.com/home/index2.jsp'
requests.post(url, data=payload)

否则..。

见下面的 https://stackoverflow.com/a/17633072/111362

我知道你们已经找到了另一个解决方案,但是对于那些像我一样找到这个问题的人来说,寻找同样的东西,可以通过以下要求来实现:

首先,像 Marcus 所做的那样,检查登录表单的源代码以获得三条信息——表单发布到的 URL,以及用户名和密码字段的 name 属性。在他的示例中,它们是 inUserName 和 inUserPass。

一旦获得了这些信息,就可以使用 requests.Session()实例向登录 URL 发送一个 post 请求,并将登录细节作为一个有效负载。从会话实例发出请求本质上与正常使用请求相同,它只是增加了持久性,允许您存储和使用 cookie 等。

假设您的登录尝试成功,您可以简单地使用会话实例向站点发出进一步的请求。标识您的 cookie 将用于授权请求。

例子

import requests


# Fill in your details here to be posted to the login form.
payload = {
'inUserName': 'username',
'inUserPass': 'password'
}


# Use 'with' to ensure the session context is closed after use.
with requests.Session() as s:
p = s.post('LOGIN_URL', data=payload)
# print the html returned or something more intelligent to see if it's a successful login page.
print p.text


# An authorised request.
r = s.get('A protected web page url')
print r.text
# etc...

让我试着让它变得简单,假设网站的 URL 是 http://example.com/,假设你需要通过填写用户名和密码来注册,所以我们现在进入登录页面,比如说 http://example.com/login.php,查看它的源代码,然后搜索它将在表单标签中显示的动作 URL

 <form name="loginform" method="post" action="userinfo.php">

现在使用 userinfo.php 创建绝对 URL,它将是“ http://example.com/userinfo.php”,现在运行一个简单的 python 脚本

import requests
url = 'http://example.com/userinfo.php'
values = {'username': 'user',
'password': 'pass'}


r = requests.post(url, data=values)
print r.content

我希望有一天这能帮到某个人。

找出在网站表格上使用的用户名 <...name=username.../>和密码 <...name=password../>的输入名称,并在下面的脚本中替换它们。还要替换指向要登录的站点的 URL。

登录

#!/usr/bin/env python


import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
payload = { 'username': 'user@email.com', 'password': 'blahblahsecretpassw0rd' }
url = 'https://website.com/login.html'
requests.post(url, data=payload, verify=False)

当尝试使用未经验证的 SSL 证书登录站点时,使用 disable_warnings(InsecureRequestWarning)将使脚本的任何输出保持沉默。

附加说明:

要在基于 UNIX 的系统上从命令行运行此脚本,请将其放在一个目录中,即 home/scripts,并将此目录添加到 ~/.bash_profile或终端使用的类似文件中的路径中。

# Custom scripts
export CUSTOM_SCRIPTS=home/scripts
export PATH=$CUSTOM_SCRIPTS:$PATH

然后在 home/scripts/login.py中创建到这个 python 脚本的链接

ln -s ~/home/scripts/login.py ~/home/scripts/login

关闭您的终端,启动一个新的,运行 login

requests.Session()解决方案辅助使用 CSRF 保护登录到表单中(如 Flask-WTF 表单中使用的)。检查是否需要 csrf_token作为隐藏字段,并将其添加到用户名和密码的有效负载:

import requests
from bs4 import BeautifulSoup


payload = {
'email': 'email@example.com',
'password': 'passw0rd'
}


with requests.Session() as sess:
res = sess.get(server_name + '/signin')
signin = BeautifulSoup(res._content, 'html.parser')
payload['csrf_token'] = signin.find('input', id='csrf_token')['value']
res = sess.post(server_name + '/auth/login', data=payload)

有些网页可能需要更多的登录/通行证。甚至可能有隐藏的领域。最可靠的方法是使用检查工具并在登录时查看网络选项卡,以查看正在传递的数据。