Python使用js2py库运行JS代码:爬虫数据提取实战

Ada
Ada
发布时间:2026-10-15 | 3人浏览过
原创

本文介绍如何在Python中使用js2py库直接运行JavaScript代码。针对爬虫中常见的JS加密、混淆及动态接口返回JS变量等场景,详细讲解eval_js和EvalJs两种核心用法。通过提取JS对象属性和调用函数,实现从复杂JS代码中高效获取数据,解决传统正则或字符串解析的繁琐问题,满足90%日常爬虫需求。

在日常使用Python进行网络爬虫开发时,通常采用以下几种技术手段:

  • 首先,请求目标URL获取HTML文本,随后利用xpath、css选择器或正则表达式(re)提取所需数据。
  • 其次,部分网页数据通过AJAX异步请求加载,此时需定位对应接口,直接调用该接口并获取返回的数据。
  • 最后,当网站反爬或安全机制较强时,常涉及验证或加密逻辑。例如,Cookie内必须携带token等信息,而这些信息是通过经过混淆处理的JavaScript代码计算得出的。

针对第一种情况,这是爬取大多数无安全机制的静态网页时的常用手段;第二种方式提取数据最为快速,但接口返回的未必总是理想的JSON字符串,有时是一段由JS代码定义的变量数据。针对第三种情况则更为棘手,如果能在Python中直接运行JS代码,便能解决大部分此类烦恼。本文旨在讲解一个Python包,用于直接在Python代码中运行JS代码,从而获取感兴趣的函数、数据或JS代码运行后的结果。

一、js2py库概述

js2py是众多可在Python中运行JS代码的优秀库之一。

安装js2py的方法如下:

pip install js2py

js2py中包含两个比较关键的方法:

方法解释示意
js2py.eval_js(js_string)直接运行含有js代码的字符串(或js文件),并得出结果

js_string='var a=10'

js2py.eval_js(js_string) #输出10

js2py.EvalJs()

生成一个EvalJs对象

可通过该对象的execute方法来运行一段js代码(或js文件),并得到对应的变量和对象(即抑制输出,得到变量和对象,便于后续直接使用)

可通过该对象的eval()方法来运行一段js代码,并得到结果

js_string='var a=10'

js_obj=js2py.EvalJs()

js_obj.execute(js_string)

js_obj.a #输出为10

二、抽取JS代码运行结果

import js2py
string='var db={chars:["a","b","c","d","f","g","h","j","k","m","n","p","q","r","s","t","w","x","y","z"],datas:[["005970","国泰消费优选股票","GTXFYXGP","1.9082","1.9082","1.8657","1.8657","0.0425","2.28","开放申购","开放赎回","","1","0","1","","1","0.15%","0.15%","1","1.50%"],["004069","南方中证全指证券公司ETF联接A","NFZZQZZQGSETFLJA","1.1438","1.1438","1.1212","1.1212","0.0226","2.02","开放申购","开放赎回","","1","0","2","","1","0.12%","0.12%","1","1.20%"]],count:["9981","3745","1653","4583"],record:"10481",pages:"5241",curpage:"1",indexsy:[-0.04,-0.34,-0.03,],showday:["2021-03-05","2021-03-04"]}'
 
mydict=js2py.eval_js(string) #最后会将string内定义的对象,变为Python字典并赋值给mydict
 
string='''
function add(a, b) {
    return a + b
}
'''
myadd=js2py.eval_js(string) #会得到一个add函数并赋值给myadd,后续可通过myadd直接调用
  • 上述第一个示例字符串,是作者在爬取天天基金的基金数据时发现,该网站接口返回的基本都是一个JS语句。在该语句内定义了返回的数据。当然,如果不通过js2py,也可以将该字符串通过Python的eval或者exec最终解析成Python字典,但过程比较繁琐(大概思路即使用字符串方法,将无用的字符删除掉,然后将字符串变成一个Python字典的定义格式,最后运行eval或者exec函数即可)。
  • 上述第二个示例字符串,即一个包含JS函数定义的字符串。此时可以得到该函数并赋值给Python变量,后续便可以通过该变量调用该函数,并且感觉上该函数像是在Python内部定义的一样。

三、提取JS语句内变量和对象等

import js2py
js_obj=js2py.EvalJs()
string='''
var a=10
function func(a,b){
    return a*b
}
'''
 
js_obj.execute(string)
js_obj.a #输出为10
js_obj.func #为func函数
js_obj.func(3,4) #输出为12

上述示意变得更有意思,可以通过execute方法,运行JS代码,先不输出结果,而是得到这里面定义的变量、函数等,然后把这些作为属性附加给js_obj对象,后续便可以通过该对象访问到这些属性,这样会更加直观和灵活,好像是直接在Python中写JS代码一样。

四、其他

当然,Python还有其他运行JS代码的库,但是作者感觉js2py整体是最契合Python的,甚至语法都基本没什么变化,故推荐使用该库。

该库还有其他很多方法和用途,不过以上是最为常用的场景,读者如果需要或感兴趣,可以进一步研究学习,如果不顾如果能掌握好以上方法,基本可以满足90%的日常需要了。

到此这篇关于python使用js2py库运行js代码的文章就介绍到这了,更多相关python 运行js代码内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表