Python 执行 JS 代码 —— PyExecJS、PyV8、Js2Py

2024-09-07 17:58

本文主要是介绍Python 执行 JS 代码 —— PyExecJS、PyV8、Js2Py,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在使用爬虫中,经常会遇到网页请求数据是经过 JS 处理的,特别是模拟登录时可能有加密请求。而目前绝大部分前端 JS 代码都是经过混淆的,可读性极低,想理解代码逻辑需要花费大量时间。这时不要着急使用 Selenium 暴力解决,毕竟 Selenium 严重拖慢爬虫效率,我们可以尝试使用一些第三方库,来直接执行前端 JS 代码得到处理过后的结果。

1、PyExecJS

  PyExecJS的优点是您不需要照顾JavaScript环境。特别是,它可以在Windows环境中运行,而无需安装额外的库。PyExecJS缺点之一是性能PyExecJS通过文本传达JavaScript运行时,并且运行缓慢。另一个缺点是它不完全支持运行时特定的功能。对于某些用例,PyV8可能是更好的选择。安装之前先安装JS环境,Node.js安装好了,就可以安装接下来的库了。

安装:

pip3 install -i https://pypi.douban.com/simple PyExecJS

 

import execjsexecjs.get().name # 查看调用的环境 'Node.js (V8)'
ctx = execjs.compile("""function add(x, y) {return x + y;}""")
print(ctx.call("add", 1, 2)) #3with open("enc.js", "r", encoding="utf-8") as f:  #执行js文件js = execjs.compile(f.read())url = js.call("posturl")print(url) #http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2019115032868

 

enc.js:

 

function posturl() {var s = new Date;url = "http://www.renren.com/ajaxLogin/login?1=1" + "&uniqueTimestamp=" + s.getFullYear() + s.getMonth() + s.getDay() + s.getHours() + s.getSeconds() + s.getUTCMilliseconds();
return url
}

 

2、PyV8

  PyV8Google V8引擎的Python包装器,它充当PythonJavaScript之间的桥梁?对象,并支持使用python脚本托管Googlev8引擎。和 `PyExecJS` 相比,这个库很轻量,不需要额外装 JS环境,因为 V8 本身就是环境,同时也因为不需要启动外部环境,执行速度很快。Python3 安装不要使用pip,因为官方只支持 Python2,需要在这里下载对应系统的二进制文件, 然后解压后将 PyV8.py 与 _PyV8.so (如so不是这个名字需要改成这样) 两文件复制到 Python 的 site-packages目录下,如 /usr/local/lib/python3.6/site-packages

下载地址:

https://github.com/emmetio/pyv8-binaries

 

import PyV8  # 注意大小写
with PyV8.JSContext() as ctx:ctx.eval("""function add(x, y) {return x + y;}""")print(ctx.locals.add(1, 2)) #3

 

3、Js2Py

  将JavaScript转换为Python代码。Js2Py几乎可以翻译和执行任何JavaScript代码。Js2Py用纯python编写,没有任何依赖关系。基本上是纯PythonJavaScript核心的实现。这种方式可以摆脱调用 JS 环境的瓶颈,但遗憾的是如果用于很长的混淆 JS 代码,转译过来的大概率会报错… 所以只建议先尝试一下,如果报错及时更换上面的库。

安装:

pip3 install -i https://pypi.douban.com/simple js2py

 

import js2pyadd = js2py.eval_js("""function add(x, y) {return x + y;}""")
print(add)  # 可以看到大括号里已被转译  #'function add(x, y) { [python code] }'print(add(1, 2)) #3
import js2py
# 使用下边这个方法可以输出转译后的代码
# 可以保存到文件里,下次不需要再次转译
print(js2py.translate_js('var x = 1'))
#打印结果:
"""
from js2py.pyjs import *
# setting scope
var = Scope( JS_BUILTINS )
set_global_object(var)# Code follows:
var.registers(['x'])
var.put('x', Js(1.0))
"""

 

实战技巧:

  接下来就是定位目标网页需要调用的 JS 函数,每个网站的写法都大不相同。只要通过 Debug查看数据从请求,每一步都经过哪些 JS 函数,输出什么样的数据,就可以顺藤摸瓜找到一些可疑的函数,然后将这些方法逐一复制出来,层层去除多余代码,通过上面的库传入参数执行,看是否和目标网页处理后的数据一致,就可以找到目标函数。

这篇关于Python 执行 JS 代码 —— PyExecJS、PyV8、Js2Py的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145758

相关文章

python安装whl包并解决依赖关系的实现

《python安装whl包并解决依赖关系的实现》本文主要介绍了python安装whl包并解决依赖关系的实现,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、什么是whl文件?二、我们为什么需要使用whl文件来安装python库?三、我们应该去哪儿下

Python脚本实现图片文件批量命名

《Python脚本实现图片文件批量命名》这篇文章主要为大家详细介绍了一个用python第三方库pillow写的批量处理图片命名的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言源码批量处理图片尺寸脚本源码GUI界面源码打包成.exe可执行文件前言本文介绍一个用python第三方库pi

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

Python自动化Office文档处理全攻略

《Python自动化Office文档处理全攻略》在日常办公中,处理Word、Excel和PDF等Office文档是再常见不过的任务,手动操作这些文档不仅耗时耗力,还容易出错,幸运的是,Python提供... 目录一、自动化处理Word文档1. 安装python-docx库2. 读取Word文档内容3. 修改

Python重命名文件并移动到对应文件夹

《Python重命名文件并移动到对应文件夹》在日常的文件管理和处理过程中,我们可能会遇到需要将文件整理到不同文件夹中的需求,下面我们就来看看如何使用Python实现重命名文件并移动到对应文件夹吧... 目录检查并删除空文件夹1. 基本需求2. 实现代码解析3. 代码解释4. 代码执行结果5. 总结方法补充在

Python自动化办公之合并多个Excel

《Python自动化办公之合并多个Excel》在日常的办公自动化工作中,尤其是处理大量数据时,合并多个Excel表格是一个常见且繁琐的任务,下面小编就来为大家介绍一下如何使用Python轻松实现合... 目录为什么选择 python 自动化目标使用 Python 合并多个 Excel 文件安装所需库示例代码

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O