Python 3.x 为什么此请求和登录脚本不起作用?

Python 3.x 为什么此请求和登录脚本不起作用?,python-3.x,beautifulsoup,python-requests,Python 3.x,Beautifulsoup,Python Requests,下面是我在Python3的请求和美化组库后面生成的一段代码 将请求作为rq导入 从bs4导入BeautifulSoup作为bs def get_data(): 返回{'email':str(输入('输入您的电子邮件'), “密码”:str(输入('输入您的密码')} def获取_数据(): 登录\u数据=获取\u数据() form_data={'csrf_token':登录_数据['email'], 'login':'1', “重定向”:“帐户/仪表板”, “查询”:无, “必需”:“电子邮件,

下面是我在Python3的
请求
美化组
库后面生成的一段代码

将请求作为rq导入
从bs4导入BeautifulSoup作为bs
def get_data():
返回{'email':str(输入('输入您的电子邮件'),
“密码”:str(输入('输入您的密码')}
def获取_数据():
登录\u数据=获取\u数据()
form_data={'csrf_token':登录_数据['email'],
'login':'1',
“重定向”:“帐户/仪表板”,
“查询”:无,
“必需”:“电子邮件,密码”,
“电子邮件”:登录数据[“电子邮件”],
“密码”:登录\u数据['password']}
headers={'user-agent':'Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/58.0.3029.110 Safari/537.36'}
使用rq.Session()作为s:
r=s.get('https://www.formstack.com/admin/user/login,headers=headers)
表单数据['csrf_-token']+=','+bs(r.content,'html.parser').find('input',attrs={'name':'csrf_-token'})['value']
r=s.post('https://www.formstack.com/admin/user/login,data=form_data,headers=headers)
assert('Collect'在bs中(r.content,'html.parser'))
获取_数据()
代码的目的是使用
get_data()
获得的登录凭据登录到名为的调查平台。为此,我们使用请求创建一个会话。从这里,我们向Formstack的登录页面发送get请求。我们使用BeautifulSoup组装响应此请求的解析树,因此使用
name='csrf\u token'
(再次使用BeautifulSoup)检索输入HTML标记的值,因为我们需要此值来完成登录表单。从这里,我们组装了一个表单,在上面的代码中表示为
form\u data
,并使用此表单提交post请求,再次提交到Formstack的登录页面。这应该让我登录到我的Formstack帐户,但由于某些原因,它没有。我通过在登录后看到的第一页内容上运行
assert()
行来检查它是否正确,并且,使用这种方法,我总是得到一个断言错误


我对Python中的web抓取不是很熟悉,因此我不确定如何解决这个问题。我尝试在get请求和post请求中都允许重定向,但在这两种情况下我都遇到了问题。非常感谢您的帮助。

您必须模仿浏览器的行为,就像请求是从浏览器发出的一样。有时这也需要标题,但在这里它们似乎不是必需的(如果需要,您仍然可以添加它们)

在“保留”打开的情况下查看浏览器的“网络”选项卡,可以看到请求的顺序。重要的部分是在实际POST请求(发送凭证)之前发出的GET请求。这里的秩序似乎很重要,所以它被保留了下来

注意1:我在这里使用regex来提取令牌,但是如果您需要在其他时间解析页面,则应该使用
BeautifulSoup

注2:页面似乎随着时间的推移而加载,JavaScript从动态后端接收数据。确保选中“网络”选项卡,查看为获得所需内容而发出的请求,并在代码中发出相同的请求

导入请求
进口稀土
email=“电子邮件”
password=“pwd”
将requests.Session()作为SES:
登录页面=sess.get(“https://www.formstack.com/admin/user/login")
#从页面源中提取令牌,您可以使用任何其他方法进行此操作
token=re.search(r'token=“(.*?”),login_page.text)。组(1)
#浏览器“网络”选项卡中显示的确切格式
数据={
“csrf_令牌”:令牌,
“登录”:“1”,
“重定向”:“帐户/仪表板”,
“查询”:“,
“必需”:“电子邮件、密码”,
“电子邮件”:电子邮件,
“密码”:密码
}
获取url=”https://www.formstack.com/admin/platform-sso/determineSsoStatus/“+电子邮件
POST_url=”https://www.formstack.com/admin/session/create"
#保持请求的顺序,如浏览器的“网络”选项卡中所示
sess.get(获取url)
final=sess.post(post\u url,data=data)
#检查最终重定向,并查看用户是否被带到仪表板或重定向回登录
#取消注释以查看重定向的结束位置:
#打印(final.url)
如果final.url中出现“重定向”:
打印(“不正确的信用”)
其他:
打印(“成功”)