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

2024-09-30 03:22:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

document.getElementById('token').value='aa5fedc5decbba3318deab92ffdfbd55d9a2c09ec81a464351ea449dc726ddd5';

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

</body>
</html>
<script>
    document.getElementById('token').value='aa5fedc5decbba3318deab92ffdfbd55d9a2c09ec81a464351ea449dc726ddd5';
</script>

我必须复制这个值,并通过http请求将其发布到URL,以使请求被接受

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

我的python代码如下:

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获取登录令牌


Tags: 代码标记importtokenhttpvaluesessionhtml
3条回答

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

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])

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

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]

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

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]

相关问题 更多 >

    热门问题