仓库地址:https://github.com/kgepachong/crawler/
常见问题
JS 代码里引用了三个库,npm install 安装一下即可,如果安装了还提示找不到库,那就是路径问题,推荐在当前目录下执行命令安装,或者在 Python 代码里指定完整路径,具体方法可自行百度。
jsencrypt 这个库,本地运行可能会报错 window is not defined,在 \node_modules\jsencrypt\bin\jsencrypt.js 源码中加入 var window = global; 即可,这是实现 RSA 加密的库,当然还有很多其他实现方法或者库,都可以。
execjs 执行 JS 的时候,可能会报编码错误 “gbk” can’t decode byte…,
有两种解决方法,一是找到官方源码 subprocess.py,搜索 encoding=None 改成 encoding=‘utf-8’,
二是直接在 Python 代码里面加入以下代码即可
pyexecjs库
一、pyexecjs库是什么?
pyexecjs是一个用Python来执行JavaScript代码的工具库,该库支持多种JavaScript运行时环境,如Node.js、PhantomJS、SlimerJS等,允许开发者在Python中无缝地调用和执行JavaScript代码。
二、常见使用场景
在Web爬虫开发或者处理JavaScript加密内容的场景下,pyexecjs尤为有用,例如当网页中的数据是通过JavaScript动态加载或加密时,可以直接在Python程序中执行JavaScript函数来获取或解密这些数据。
二、pyexecjs库怎么用?
# 安装
pip install pyexecjs
(1)execjs必学方法eval
import execjs# 必须掌握的函数之一 eval(expression)
"""
功能:如果你没有特定的JavaScript文件,而是想直接执行给定的JavaScript表达式代码时使用(使用内置运行时)
参数:expression是要执行的JavaScript字符串表达式。
返回值:js执行结果。
"""
e = execjs.eval('a = new Array(1,2,3)')
print(e)
(2)execjs必学方法complie
import execjs# 必须掌握的函数之二 compile()
"""
功能:用于编译JavaScript代码,创建一个可执行的上下文。这个上下文可以用来执行预编译好的JavaScript表达式或函数
参数:source必填参数,类型为字符串,表示要编译的JavaScript代码。
返回值:返回一个execjs.Context对象实例,该实例拥有eval、call等方法,可以用来执行JavaScript代码并获取结果
"""# 可以直接编译一段js片段
js_code1 = """function add(a, b) {return a + b;
}
"""# 可以编译一个js文件
with open('test.js', 'r') as f:js_code2 = f.read()# 编译js代码
ctx1 = execjs.compile(js_code1)
result = ctx1.call("add", 1, 2)
print(result)ctx2 = execjs.compile(js_code2)
result = ctx2.call("add", 1, 2)
print(result)
(3)execjs必学方法call
import execjs# 必须掌握的函数之二 call(function_name, *args, **kwargs)
"""
功能:调用在JavaScript环境中定义的函数,并将Python变量作为参数传入给这个JavaScript函数。
参数:- function_name:字符串类型,表示要调用的JavaScript函数名。- *args:可变位置参数列表,这些参数会被转换并作为对应的JavaScript函数的参数传入。- **kwargs:可变关键字参数字典,这些参数同样会被转换后作为JavaScript函数的命名参数传入。
返回值:返回执行JavaScript函数后的结果。这个结果可以是任何JavaScript数据类型,在Python端通常会被转换为相应的Python类型(例如,JavaScript对象会被转换为Python字典等)。
"""
# js代码片段
js_code = """function add(a, b) {return a + b;
}
"""# 创建并编译js上下文
ctx = execjs.compile(js_code)# 使用call方法来调用js代码中的函数
result = ctx.call('add', 10, 2)
print(result)