execjs执行包含中文参数的JavaScript

举报
小小明-代码实体 发表于 2022/02/24 23:39:18 2022/02/24
【摘要】 抓取到了一段包含数据的JavaScript代码: import re import requests headers = { "user-agent": "Mozilla/5.0 (Windo...

抓取到了一段包含数据的JavaScript代码:

import re
import requests

headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
}
res = requests.get(
    "https://www.kuaikanmanhua.com/web/comic/100868/",
    headers=headers
)
script = re.findall(
    "<script>window.__NUXT__=([^<]+);</script>", res.text)[0].replace('\\u002F', "/")
script

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

结果:

image-20220223204934945

这段代码直接在游览器执行可以得到对应的JSON数据,那么我们如何使用python执行这段代码获取JS数据呢?答案是使用execjs

安装:

pip install PyExecJS 

  
 
  • 1

但是如果此时在安装过Nodejs的windows上直接执行代码:

import execjs

execjs.eval(script)

  
 
  • 1
  • 2
  • 3

会报出如下错误:

UnicodeDecodeError: 'gbk' codec can't decode byte 0xa4 in position 447: illegal multibyte sequence

此时我们需要重新指定execjs的环境为JScript

import os

os.environ["EXECJS_RUNTIME"] = "JScript"

  
 
  • 1
  • 2
  • 3

再次执行可以顺利得到结果。

如果我们确实需要使用本地nodejs的环境执行JavaScript则需要修改修改execjs的源码:

import os

os.environ["EXECJS_RUNTIME"] = "Node"
print(execjs.get().name)

  
 
  • 1
  • 2
  • 3
  • 4
Node.js (V8)

  
 
  • 1

找到execjs安装目录下的_external_runtime.py文件:

image-20220223204010168

重启程序再次执行即可得到结果:

image-20220223204725760

execjs的调用函数或读取变量示例:

import execjs

ctx = execjs.compile("""
       function add(x, y) {
               return x + y;
       }
       v = add(3, 4);
""")
print(ctx.call("add", 1, 2), ctx.eval("v"))

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
3 7

  
 
  • 1

Lib\site-packages\execjs\runtime_names.py文件可以看到execjs所支持的JavaScript环境:

PyV8           = "PyV8"
Node           = "Node"
JavaScriptCore = "JavaScriptCore"
SpiderMonkey   = "SpiderMonkey"
JScript        = "JScript"
PhantomJS      = "PhantomJS"
SlimerJS       = "SlimerJS"
Nashorn        = "Nashorn"

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

文章来源: xxmdmst.blog.csdn.net,作者:小小明-代码实体,版权归原作者所有,如需转载,请联系作者。

原文链接:xxmdmst.blog.csdn.net/article/details/123099139

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。