Python 当用户名和密码元素ID不是常量时,使用请求登录到站点
我正试图抓取一个网络论坛,在访问登录后的页面时遇到问题。检查登录页面的元素时,我发现每次刷新页面时,用户名和密码输入元素的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
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)检查浏览器登录的工作方式,然后确保代码提供所需的标题和数据。