首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python中刮取由JS生成的登录令牌?

如何在Python中刮取由JS生成的登录令牌?
EN

Stack Overflow用户
提问于 2021-03-14 13:46:40
回答 3查看 491关注 0票数 2

我必须刮一个网站,这需要一个登录令牌。稍后将通过JS替换该值。

代码语言:javascript
复制
document.getElementById('token').value='aa5fedc5decbba3318deab92ffdfbd55d9a2c09ec81a464351ea449dc726ddd5';

以上代码出现在</html>标记之后的源代码中。就像这样:

代码语言:javascript
复制
</body>
</html>
<script>
    document.getElementById('token').value='aa5fedc5decbba3318deab92ffdfbd55d9a2c09ec81a464351ea449dc726ddd5';
</script>

我必须复制这个值并通过http请求将其发布到URL以获得请求的接受。

但我无法得到这个价值。当我通过python库发送请求时,</html>标记后的代码是不可见的。

我的python代码在这里:

代码语言:javascript
复制
import requests
from bs4 import BeautifulSoup

session_requests = requests.session()

html = session_requests.get("http://lms.uaf.edu.pk/login/index.php")
html = html.text
soup = BeautifulSoup(html, "lxml")
print(soup)

如何通过python获得登录令牌?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-14 15:06:52

以下代码成功地从您的网站获得登录令牌:

代码语言:javascript
复制
import requests
session_requests = requests.session()
html = session_requests.get("http://lms.uaf.edu.pk/login/index.php")
html = html.text
a = html.split("document.getElementById(\'token\').value=\'")[1]
b = a.split("'")[0]
票数 2
EN

Stack Overflow用户

发布于 2021-03-14 15:16:31

您的代码不能工作的原因是,BeautifulSoup在</html>之后跳过任何html代码(基本上关闭文档),因此它只解析<html>标记中的所有内容,并且由于替换登录令牌的<script>标记是在关闭的</html>标记之后出现的,所以BeautifulSoup不会解析它,因此无法得到它。在浏览器中(我在FireFox上测试了它),在将关闭的</html>标记移动到文档正文后,所有内容都会被移到文档正文中,这就是为什么在浏览器中查看站点时正确显示登录令牌的原因。为此,您应该将BeautifulSoup放在一边,只需使用普通Python (可读版本):

代码语言:javascript
复制
import requests
html = requests.get('http://lms.uaf.edu.pk/login/index.php').text # get the html
token_begin = html.find("document.getElementById('token').value='") + len("document.getElementById('token').value='") # find the start of the login token
token_end = html[token_begin:].find("'") # find the end of the login token
token = html[token_begin:token_end]
票数 3
EN

Stack Overflow用户

发布于 2021-03-14 21:02:14

我会直接从response.text中选择一个正则表达式,但是,值得知道的是,您可以通过包装一个外部的body标记来保存该内容,至少可以使用我遇到的所有html解析器。不提倡这种方法,尽管在某些语言中,它对于获取头部中的数据非常有用,否则,当输入DOM文档的body.innerHTML时,这些数据就会被剥离。

代码语言:javascript
复制
import requests
from bs4 import BeautifulSoup as bs

r = requests.get('http://lms.uaf.edu.pk/login/index.php')
soup = bs('<body>' + r.text + '</body>', 'lxml')
print(soup.select('script')[-1].string.split("'")[-2])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66625245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档