Python 当用户名和密码元素ID不是常量时,使用请求登录到站点

Python 当用户名和密码元素ID不是常量时,使用请求登录到站点,python,web-scraping,beautifulsoup,python-requests,Python,Web Scraping,Beautifulsoup,Python Requests,我正试图抓取一个网络论坛,在访问登录后的页面时遇到问题。检查登录页面的元素时,我发现每次刷新页面时,用户名和密码输入元素的ID都会改变。我目前的策略是 创建并使用请求会话 对论坛登录页面发出GET请求 使用BeautifulSoup提取用户名和密码输入元素的ID 对于传递到登录页面的POST请求中的有效负载dict,使用提取的ID作为密钥,使用我的帐户用户名和密码作为值 提出获取论坛页面的请求 我在第4步遇到了一个问题:POST请求的状态代码是400,表示我做错了什么 这是一个MWE,其中变量K

我正试图抓取一个网络论坛,在访问登录后的页面时遇到问题。检查登录页面的元素时,我发现每次刷新页面时,用户名和密码输入元素的ID都会改变。我目前的策略是

  • 创建并使用请求会话
  • 对论坛登录页面发出GET请求
  • 使用BeautifulSoup提取用户名和密码输入元素的ID
  • 对于传递到登录页面的POST请求中的有效负载dict,使用提取的ID作为密钥,使用我的帐户用户名和密码作为值
  • 提出获取论坛页面的请求
  • 我在第4步遇到了一个问题:POST请求的状态代码是400,表示我做错了什么

    这是一个MWE,其中变量
    KIWIFARMS\u USERNAME
    KIWIFARMS\u PASSWORD
    已更改为不是我的实际帐户用户名和密码:

    import os
    
    import requests
    from bs4 import BeautifulSoup
    
    # login url for forum, and fake forum credentials (they're real in my script)
    LOGIN_URL = 'https://kiwifarms.net/login/'
    KIWIFARMS_USERNAME = 'username'
    KIWIFARMS_PASSWORD = 'password'
    
    with requests.Session( ) as session:
    
      # step 1
      r = session.get( LOGIN_URL )
    
      # step 2
      soup = BeautifulSoup( r.content, 'lxml' )
    
      # step 3
      username_id = soup.find( 'input', { 'autocomplete' : 'username' } )[ 'id' ]
      password_id = soup.find( 'input', { 'type' : 'password' } )[ 'id' ]
    
      payload = {
        username_id: KIWIFARMS_USERNAME,
        password_id : KIWIFARMS_PASSWORD }
    
      # step 4
      post = session.post( LOGIN_URL, data = payload )
    
      # failure of step 4 (prints 400)
      print( post.status_code )
    
    我查看了很多页面和链接,包括、、和,但我仍然不明白为什么我的post请求会出现400个错误请求


    我有一个在Selenium中工作的版本,但我真的很想知道我犯了什么错误,并通过请求使它工作。如果您有任何帮助,我们将不胜感激。

    网站在登录过程中生成了一个
    \xfToken
    ,您还错过了
    POST
    请求的一些
    表单数据

    在这里,我使用
    requests.session()
    维护
    会话
    ,然后在我的
    GET
    请求期间解析
    \u xfToken
    ,然后通过
    POST
    请求传递它

    导入请求
    从bs4导入BeautifulSoup
    def Main():
    将requests.Session()作为请求:
    r=req.get(“https://kiwifarms.net/login/login")
    soup=BeautifulSoup(r.text'html.parser')
    token=soup.find(“输入”{'name':'\uxftoken'}).get(“值”)
    数据={
    “用户名”:“测试”,
    “密码”:“测试”,
    ‘记住’:‘1’,
    “\xfu重定向”:“/”,
    “\xfu令牌”:令牌
    }
    r=要求职位(“https://kiwifarms.net/login/login“,数据=数据)
    印刷品(r)
    Main()
    
    输出:

    <Response [200]>
    

    这是确认我们做得正确,因为我没有通过有效的用户/通行证。

    网站在登录过程中生成了
    \xfToken
    ,并且您错过了
    POST
    请求的一些
    表单数据

    在这里,我使用
    requests.session()
    维护
    会话
    ,然后在我的
    GET
    请求期间解析
    \u xfToken
    ,然后通过
    POST
    请求传递它

    导入请求
    从bs4导入BeautifulSoup
    def Main():
    将requests.Session()作为请求:
    r=req.get(“https://kiwifarms.net/login/login")
    soup=BeautifulSoup(r.text'html.parser')
    token=soup.find(“输入”{'name':'\uxftoken'}).get(“值”)
    数据={
    “用户名”:“测试”,
    “密码”:“测试”,
    ‘记住’:‘1’,
    “\xfu重定向”:“/”,
    “\xfu令牌”:令牌
    }
    r=要求职位(“https://kiwifarms.net/login/login“,数据=数据)
    印刷品(r)
    Main()
    
    输出:

    <Response [200]>
    
    这是确认我们做得正确,因为我没有传递有效的用户/通行证。

    您正在尝试发布到,而登录表单操作是/login

    当url中有url/login/时,我遇到了相同的错误。当我简单地将其更改为url/登录时,它将状态代码传递到200。。。(基本上只是删除了最后一个多余的斜杠!)

    您正试图发布到,而登录表单操作是/login


    当url中有url/login/时,我遇到了相同的错误。当我简单地将其更改为url/登录时,它将状态代码传递到200。。。(基本上只是删除了最后一个多余的斜杠!)

    解决这类问题的一般方法是使用Telerik Fiddler之类的网络跟踪程序检查浏览器登录的工作方式,解决这类问题的一般方法是使用网络跟踪程序(如Telerik Fiddler)检查浏览器登录的工作方式,然后确保代码提供所需的标题和数据。