精选文章 聊聊 Python 调用 JS 的几种方式,你都知道吗?

聊聊 Python 调用 JS 的几种方式,你都知道吗?

作者:weixin_45820912 时间: 2020-07-28 11:38:54
weixin_45820912 2020-07-28 11:38:54

1. 前言

日常 Web 端爬虫过程中,经常会遇到参数被加密的场景,因此,我们需要分析网页源代码

通过调式,一层层剥离出关键的 JS 代码,使用 Python 去执行这段代码,得出参数加密前后的 Python 实现

本文将聊聊利用 Python 调用 JS 的4种方式

2. 准备

以一段简单的 JS 脚本为例,将代码写入到文件中

//norm.js//计算两个数的和function add(num1, num2) {    return num1 + num2;}

其中,定义了一个方法,计算两个数的和

3. 方式一:PyExecJS

PyExecJS 是使用最多的一种方式,底层实现方式是:在本地 JS 环境下运行 JS 代码

支持的 JS 环境包含:Node.js、PyV8、PhantomJS、Nashorn 等

首先,我们需要安装依赖包 PyExecJS

//py_exec_js_demo.py//安装依赖pip3 install PyExecJS

然后,从 JS 文件中读取源码

def js_from_file(file_name):    """    读取js文件    :return:    """    with open(file_name, 'r', encoding='UTF-8') as file:        result = file.read()    return result

最后,使用 execjs 类的compile()方法编译加载上面的 JS 字符串,返回一个上下文对象

import execjsfrom js_code import *# 编译加载js字符串context1 = execjs.compile(js_from_file('./norm.js'))

最后,调用上下文对象的call() 方法执行 JS 方法

其中,参数包含:JS 代码被调的方法名、对应方法的传入参数

# 调用js代码中的add()方法,参数为2和3# 方法名:add# 参数:2和3result1 = context1.call("add", 2, 3)print(result1)

需要注意的,由于 PyExecJS 运行在本地 JS 环境下,使用之前会启动 JS 环境,最终导致运行速度会偏慢

更多功能可以参考:

https:// github .com/doloopwhile/PyExecJS

4. 方式二:js2py

js2py作为一个纯 Python 实现的 JS 解释器,可以完全脱离 JS 环境,直接将 JS 代码转换为 Python 代码

 

首先,安装依赖库

 

# 安装依赖库pip3 install js2py

 

然后使用 js2py 中的EvalJs()方法生成一个上下文对象

 

# 使用获取上下js2py生成一个上下文环境context = js2py.EvalJs()

 

接着利用上下文对象执行 JS 脚本,转换为 Python 代码

 

# 执行整段JS代码context.execute(js_content)

 

最后,利用上下文调用 JS 中的方法,并制定输入参数即可

 

# 使用上下文context调用具体的函数# 函数名:add# 参数:1,2result = context.add(1, 2)print(result)

需要注意是,如果 JS 是很长的混淆代码,转换为 Python 的过程可能会报错

更多功能可以参考:

https://github.com/PiotrDabkowski/Js2Py

5. 方式三:Node.js

实际上是使用 Python 的os.popen执行 node 命令,执行 JS 脚本

首先,确保本地已经安装了 Node.js 环境

修改 JS 脚本,新增一个导出函数 init ,方便内部函数被调用

//计算两个数的和function add(num1, num2) {    return num1 + num2;}//新增一个导出函数(node方式)module.exports.init = function (arg1, arg2) {    //调用函数,并返回    console.log(add(arg1, arg2));};

然后,将调用 JS 方法的命令组成一个字符串

# 组成调用js的命令# node命令:node -ecmd = 'node -e "require(\\"%s\\").init(%s,%s)"' % ('./norm', 3, 5)

最后,通过 os.popen 执行命令即可

pipeline = os.popen(cmd)# 读取结果result = pipeline.read()print('结果是:', result)

6. 方式四:PyV8

PyV8 是 Google 将 Chrome V8 引擎用 Python 封装的依赖库

它不依赖本地 JS 环境,运行速度很快

import PyV8from js_code import js_from_filewith PyV8.JSContext() as ctx:    ctx.eval(js_from_file('./norm.js'))# 调用js函数,指定参数ctx.locals.add(1, 2)

但是经过反复测试发现,MAC 和 PC 在 Python3 环境下,使用 PyV8 会报各种奇怪的问题,所以不推荐使用!如果大家对Python感兴趣的话,可以加一下我的薇信哦:abb436574,免费领取一套学习资料和视频课程哟~

更多功能可以参考:

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

7. 最后

上面总结了 Python 调用 JS 的 4 种方式

实际爬虫项目中,一般会先使用 node 命令进行一次测试,确保没问题后,再使用前 3 种方式的任意一种进行 Python 改写

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:机器人“马杀鸡”来了,总感觉哪里怪怪的。。。

下一篇:Vue element-ui 组合开发时间选择器组件

您可能感兴趣

  • 字节跳动面经整理

    1. 操作系统: 进程和线程介绍; 进程或线程死锁介绍; 多进程,多线程的并发执行带来的问题-死锁 死锁是指多个进程(线程)在执行过程中,由于竞争资源或者彼此通信而造成的一种阻塞的现象(互相挂起等待),若无外力他们都将无法推进下去。 银行家算法 了解活锁吗?(没听过) 操作系统中的堆和栈; 栈(操作系统):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中栈,...

  • 浅谈微服务体系中的分层设计和领域划分

    引言 看标题感觉这个东西很理论,比起“高并发、多线程”、“分布式CAP、一致性、Paxos”、“高可用SLA”等具体的干货技术点,软件体系知识显得很“湿”,似乎人人都有自己的认识,但又很少有人能说完整,有一点可以确定的是,如果你未来需要独立设计一个复杂的系统中台,并使之未来能快速应对各种需求变化的话,科学合理的领域划分和边界界定需要我们“处女座级”的坚持下去,这对防止人力失控、减少项目烂尾很...

  • NL 学习资源

    https://github.com/fighting41love/funNLP 在入门到熟悉NLP的过程中,用到了很多github上的包,遂整理了一下,分享在这里。 很多包非常有趣,值得收藏,满足大家的收集癖! 如果觉得有用,请分享并star,谢谢! 长期不定时更新,欢迎watch和fork! 涉及内容包括但不限于:中英文敏感词、语言检测、中外手机/电话归属地/运营商查询、名字推断性别、手...

  • GitHub 上值得收藏的 100 个精选前端项目!

    点击上方“逆锋起笔”,公众号回复 PDF 领取大佬们推荐的学习资料 来 源:https://www.jianshu.com/p/72ca8192f7b8 引言 整理与收集的一些比较优秀github项目,方便自己阅读,顺便分享出来,大家一起学习,作者简书上文章会持续更新,版权归原作者所有。 最新更新 codepen 一个在线编辑前端项目的网站,其中有一些前端大神的作品,也有很多令人惊艳的前端效...

  • 还不懂这八大算法思想,刷再多题也白搭!

    各位朋友好久不见呢。最近由于刚入职,作为职场萌新,所以大部分时间都花在了工作上。因而也没有太多时间来写文章啦,这篇文章也是定题了许久,迟迟没有落笔。等之后工作慢慢稳定,业务熟练起来,文章更新频率就会高起来的!还请朋友们持续关注哦~ 算法和数据结构一直以来都是程序员的基本内功,可以说没有数据结构的基础建设和算法加持,也就没有这将近八十年的信息革命时代。数据结构可以看作是算法实现的容器,通过一系...

  • 提高社会的微生物素养:势在必行!

    写在前面 我思,故我们在! 微生物早已和人类及地球水乳交融,微生物及其功能正在得到铺天盖地的研究。毫不夸张的说,微生物是地球最早的也是最后一个客人,没有微生物,万物皆不复。然而微生物学,作为一门专业课而非通识课程,在大学课堂上才非闪亮登场(高中生物更多的是动植物)。今年的肺炎病毒疫情正在给全世界人民上课,倘若微生物学知识普及开来,何以会如此被动? 上至国家领导,下至村野匹夫,都应了解和学习一...

  • 电子专业毕业后,到底能做什么?

    在我大一刚入学的第一天晚上,班助把我们几个宿舍的男生叫到一起,大概说了些军训的注意事项以及班助是什么。说完以后班助说你们有什么想问的问题,现在可以问了。当时有个人问了一个大家最想问的问题:我们这电子信息专业以后是干嘛的? 转眼之间四年匆匆过去,当我大四要走的时候,坐上载满我行李的出租车,我心里想到,我这马上就该踏上工作岗位了,还不知道我们这专业以后要干嘛,当年刚上大三的班助是怎么忽悠我们的?...

  • (4.1.21.9)HTTPS 加密过程演变分析

    1、前言 可能有初学者会问,即时通讯应用的通信安全,不就是对Socket长连接进行SSL/TLS加密这些知识吗,干吗要理解HTTPS协议呢。 这其实是个误解:当今主流的移动端IM数据通信,总结下来无外乎就是长连接+短连接的方式,长连接就是众所周之的TCP、UDP、WebSocket(WebSocket的本质还是TCP),而短连接就是HTTP/HTTPS了。即时通讯IM应用中,短连接的安全跟长...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。