在专研爬虫的时候 会凭空出现一些恶心的参数,原来的我可能会看一下js然后你想解析 ,但是这两天玩到了新的玩具execjs 安装还是比较简单的

pip install pyexecjs

import execjs
rFile = open("./static/js/test.js", ‘r’, encoding=‘UTF-8’)
testResult = execjs.compile(rFile.read()).call(‘test’)

(3)方法说明
eval() 输入参数:source(JS语句)、cwd(路径)
返回值:result(语句执行结果)
compile() 输入参数:source(JS语句)、cwd(路径)
返回值:编译后的对象
call() 输入参数:name(要调用的JS方法名称)、*args(方法所需要的参数,可多个)
返回值:result(运行方法的返回结果)

注意啊一定要js代码,文件那个位置可以用文字代替,但是一定要是js代码不然会报错

常见问题

指的是我遇到的问题…我觉得可能会常见一点

window is not defined

我js代码本身没有问题 ,但是jQuery是同步的网页的jQuery,他那个版本就调用window(所以我换了jQuery,但是这个问题已经解决了),解决方法是看了一个大佬的博客,使用了 jsdom ,这个库可以生成对应的环境
安装命令 :npm i jsdom -g 然后在你的js代码中的最上面添加如下代码即可

const jsdom = require(“jsdom”);
const { JSDOM } = jsdom;
const dom = new JSDOM(<!DOCTYPE html><p>Hello world</p>);
window = dom.window;
document = window.document;
XMLHttpRequest = window.XMLHttpRequest;

装载完了之后可能会出现
execjs._exceptions.ProgramError: Error: Cannot find module 'jsdom' 解决办法有两种
1.就是在python执行文件所在的运行目录下,使用npm安装jsdom
2. 使用cwd参数,指定模块的所在目录,比如,我们在全局安装的jsdom,在cmd里通过npm root -g 可以查看全局模块安装路径: C:\Users\w001\AppData\Roaming\npm\node_modules
我们使用时,代码可以按下面的写法写

import execjs
with open(r'要运行的.js','r',encoding='utf-8') as f:
    js = f.read()
ct = execjs.compile(js,cwd=r'C:\Users\w001\AppData\Roaming\npm\node_modules')
print(ct.call('Rohr_Opt.reload','1'))

附上大佬博客连接


UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xa0’ in position 75879: illegal multibyte sequence

编码问题我也纠结了好久,最快的几种方式,我下面列出来了

  1. replace替换,直接。replace(‘\ax0’,")省事高效
  2. 直接删,当初不知道js里有韩文,删掉了就好了
  3. 更改编码,将python的Lib库subprocess.py文件中的586初始化函数的参数:encoding=None改成:encoding=“utf-8”
execjs._exceptions.ProcessExitedWithNonZeroStatus: (1, '', '[stdin]:1\n(function(program, execJS)

这个问题就是你js的书写问题了,在'[stdin]:1\n 这个地方1就是代表你第几行出错了

$ is not defined

我没试过直接用execjs调用jQuery然后再调用我自己的js代码是否好使,试过的大佬可以跟我讲一下
我直接把jQuery复制到了我的代码最上面,但是不能说不好使,只是我自己又出了点小问题,所以在调用的前夕直接var $ = require('E:\\histoey\\hyundai\\2.js');引用就好了