使用python requests module

时间:2016-08-17 11:14:52

标签: python-3.x python-requests

我尝试使用pythons请求模块登录网页。我在使用chrome提交Login表单时重新捕获了post请求,并重新检查了该表单的代码。 (网站以及参数在下面的代码片段中提到)

基于某人的帖子,我能够创建一个试图登录并访问受保护内容的python片段,但由于某种原因,这不能按预期工作。

这是我的python片段:

import requests

LOGIN = 'https://www.hackthis.co.uk/index.php'
PROTECTED_PAGE = 'https://www.hackthis.co.uk/news'
payload = {
    'username': 'VALIDUSERNAME',
    'password': 'VALIDPASSWORD'
}

with requests.session() as s:
    s.post(LOGIN, data=payload)
    response = s.get(PROTECTED_PAGE)
    print(response.text)

即使我发送带有所需有效负载的帖子请求,但我无法访问受保护的内容。 响应HTML代码包含登录表单以及在未登录的情况下不允许访问该内容的注释。

我在这里想念什么?

修改

感谢您提供非常有用的答案!犯了很愚蠢的错误。我忘记了URL的登录部分。 以下是有关该主题的后续问题的工作代码段(已测试,按预期工作):

import requests

    LOGIN = 'https://www.hackthis.co.uk/index.php?login'
    PROTECTED_PAGE = 'https://www.hackthis.co.uk/news'
    payload = {
        'username': 'VALIDUSERNAME',
        'password': 'VALIDPASSWORD'
    }

    with requests.session() as s:
        s.post(LOGIN, data=payload)
        response = s.get(PROTECTED_PAGE)
        print(response.text)

2 个答案:

答案 0 :(得分:1)

帖子是 https://www.hackthis.co.uk/index.php?login ,最后请注意 ?login

LOGIN = 'https://www.hackthis.co.uk/index.php?login'
PROTECTED_PAGE = 'https://www.hackthis.co.uk/news'
payload = {
    'username': 'uname',
    'password': 'pass'
}

with requests.session() as s:
    r = s.post(LOGIN, data=payload)
    response = s.get(PROTECTED_PAGE)
    print(response.text)

您可以在网络标签下的开发者工具/ firebug中看到帖子网址:

enter image description here

或者在html中,您可以在表单中看到action="?login"

<form id="login_form" action="?login" method="POST">

答案 1 :(得分:1)

关于Web身份验证

大多数网站都使用身份验证机制,以便只向提供有效凭据的用户提供他们想要的内容。为了让这更简单,想象一下你想要进入一个博物馆。你可以在没有人要求你的情况下进入售票亭,但是你需要买票才能看到内部。考虑到这一点,您可以将网站/服务器视为售票亭,凭证作为购买机票的钱,并且应该使用机票本身以便进入博物馆的不同部分。为了将此示例带回Web服务,我将尝试解释用于身份验证的两种技术

Cookie身份验证

Cookies是网站发送的小块(通常是加密的)数据,并在您浏览时存储到您的计算机中。 cookie身份验证过程如下:

  1. 用户将其凭据发送到网络服务器(例如用户名/密码)
  2. Web服务器验证这些凭据,然后创建并存储具有特定标识符(sessionID)的会话
  3. Web Server使用该sessionID在用户的浏览器上放置一个cookie
  4. 用户对网站的受保护部分发出的任何后续请求,服务器检查cookie中的sessionID,如果有效,则返回私人信息
  5. 一旦用户退出,会话就会被销毁,并且具有此会话ID的任何请求都将无效
  6. 虽然这项技术很棒但它有一些security issues

    令牌认证

    此技术类似于Cookie,但它更好地模拟了我们的博物馆门票示例。令牌是包含私人信息的加密数据。值得注意的是,令牌通常具有到期日期。身份验证过程如下:

    1. 用户将其凭据发送到网络服务器(例如用户名/密码)
    2. Web服务器验证这些凭据,然后创建包含有关用户信息的令牌。在我的应用程序中,我通常包括存储在我的数据库中的用户的ID。请注意,服务器不必存储令牌。
    3. Web Server将令牌返回给用户
    4. 用户发出的任何后续请求都应包含令牌
    5. 用户注销后,应该从浏览器中销毁令牌。重要的是要注意,当用户注销并且令牌在其到期日期之前处于活动状态时,服务器不必执行任何操作。
    6. 使用Postman或Curl等HTTP请求工具,您可以看到此网站使用cookie技术,登录URL为 index.php?login

      <强> TL; DR

      您的代码应该可以正常工作,唯一的问题是您用于登录的URL。

      import requests
      
      LOGIN = 'https://www.hackthis.co.uk/index.php?login'
      PROTECTED_PAGE = 'https://www.hackthis.co.uk/news'
      payload = {
          'username': 'VALIDUSERNAME',
          'password': 'VALIDPASSWORD'
      }
      
      with requests.session() as s:
          s.post(LOGIN, data=payload)
          response = s.get(PROTECTED_PAGE)
          print(response.text)