如何使用Python的Requests模块"登录"网站?

Mar*_*son 82 python pyquery python-requests

我试图使用Python中的Requests模块发布登录网站的请求,但它并没有真正起作用.我是新手...所以我无法弄清楚我是否应该创建我的用户名和密码cookie或我找到的某种类型的HTTP授权(??).

from pyquery import PyQuery
import requests

url = 'http://www.locationary.com/home/index2.jsp'
Run Code Online (Sandbox Code Playgroud)

所以现在,我想我应该使用"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
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,我做饼干的事情错了......我不知道.

如果它没有正确登录,主页的标题应该出现在"Locationary.com",如果是,它应该是"主页".

如果您可以向我解释有关请求和cookie的一些事情并帮助我解决这个问题,我将非常感激.: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>
Run Code Online (Sandbox Code Playgroud)

所以我认为我做得对,但输出仍然是"Locationary.com"

第二次编辑:

我希望能够保持登录状态很长时间,每当我要求域名下的网页,我希望要显示的内容,就好像我在被记录.

tig*_*nch 207

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

首先,正如Marcus所做的那样,检查登录表单的来源以获取三条信息 - 表单发布到的URL,以及用户名和密码字段的名称属性.在他的示例中,它们是inUserName和inUserPass.

完成后,您可以使用requests.Session()实例向登录URL发送请求,并将您的登录详细信息作为有效负载.从会话实例发出请求与通常使用请求基本相同,它只是添加持久性,允许您存储和使用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...
Run Code Online (Sandbox Code Playgroud)

  • 但问题是,如何获取POST登录表单?如何知道它是否被调用inUserName而不是username,USERNAME等? (8认同)
  • 如果您想了解成功登录到底需要什么:打开您最喜欢的浏览器(对我来说是 Chrome),转到登录页面,打开开发人员控制台,转到网络选项卡并清除日志,最后使用您的凭据登录。浏览 HTTP 请求,其中之一必须是要发送凭据的所需登录 URL。现在您可以查看其标头并找到包含表单数据(= 有效负载)的部分。我认为这比仅仅查看页面源代码更好,因为可能有一些 JavaScript 影响最终的有效负载。 (5认同)
  • @Twinkle查看表单的HTML源代码,以了解它们在此处的名称。 (3认同)
  • s.text似乎不起作用,但我仍然给你一些投票的爱,让我看到这个可爱的请求...语法 (3认同)
  • @HalcyonAbrahamRamirez我认为这不是您寻求帮助的正确位置。我建议阅读有关您挑战的问题,例如:http://stackoverflow.com/questions/21928368/login-to-facebook-using-python-requests,如果不能解决,请打开您自己的问题。 (2认同)

kat*_*lee 39

如果您想要的信息在页面上,您将在登录后立即前往...

让我们调用你的ck变量payload,就像在python-requests文档中一样:

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

除此以外...

请参阅下面的/sf/answers/1234315071/.

  • 可悲的是,我不能删除它,因为它是公认的答案.当我发布这个问题时(我之后澄清了),我认为我不明白这个问题,所以不确定为什么它被接受了.我的回答仅在您需要的数据位于登录后重定向到的页面上时才有效.@tigerFinch有一个更好的答案. (15认同)

Tar*_*air 32

让我试着简单一点,假设网站的网址是http://example.com/,让我们假设您需要通过填写用户名和密码来注册,所以我们转到登录页面说http:// example. com/login.php现在查看它的源代码并搜索它将在表单标签中的操作URL

 <form name="loginform" method="post" action="userinfo.php">
Run Code Online (Sandbox Code Playgroud)

现在用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
Run Code Online (Sandbox Code Playgroud)

我希望有一天能帮到某个地方.

  • 如果您使用的是 chrome,请打开网络选项卡上的 devtools,在发出请求后,您可以检查实际值、使用哪些键以及它们发送到哪里,这对于不使用传统机制的表单非常有用,而是使用 javascript/ajax 处理表单。 (3认同)

naa*_*man 9

requests.Session()解决方案有助于登录带有 CSRF 保护的表单(如在 Flask-WTF 表单中使用)。检查 acsrf_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)
Run Code Online (Sandbox Code Playgroud)


Dav*_*vid 7

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

登录.py

#!/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)
Run Code Online (Sandbox Code Playgroud)

指某东西的用途 disable_warnings(InsecureRequestWarning)当尝试使用未经验证的 SSL 证书登录站点时将使脚本的任何输出静音。

额外的:

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

# Custom scripts
export CUSTOM_SCRIPTS=home/scripts
export PATH=$CUSTOM_SCRIPTS:$PATH
Run Code Online (Sandbox Code Playgroud)

然后在里面创建一个指向这个python脚本的链接 home/scripts/login.py

ln -s ~/home/scripts/login.py ~/home/scripts/login
Run Code Online (Sandbox Code Playgroud)

关闭你的终端,开始一个新的,运行 login


LoM*_*aPh 6

有些页面可能需要的不仅仅是登录/密码。甚至可能存在隐藏字段。最可靠的方法是使用检查工具并在登录时查看网络选项卡,以查看正在传递哪些数据。