python使用js2py库运行js代码
作者:一秋闲谈 发布时间:2022-09-06 17:06:55
在日常使用Python做爬虫,一般会用到以下手段:
请求URL,返回HTML文本,然后通过xpath、css或者re,提取数据
有些网页的数据通过AJAX异步请求加载,此时找到对应的接口,调用并直接使用接口返回的数据
有时候如果网站反爬或安全机制比较高时,则会做一些验证或者加密,比如cookie内必须携带token等信息,而这些信息是通过混淆过的js代码计算得出的。
针对1,应该是爬取大多数没有任何安全机制并且是静态网页时,常用手段,而2是提取数据最为快速的,但是接口并不是总是返回我们最喜欢的json字符串,有可能是一段js代码定义的变量数据,针对3则更为头痛,如果在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直接调用
以上第一个string,便是作者在爬取天天基金的基金数据时,发现该网站接口返回的基本都是一个js语句,在该语句内定义了返回的数据,当然,如果不通过js2py,也可以将该string通过Python的eval或者exec最终解析成Python字典,但比较繁琐(大概思路即使用字符串方法,将无用的字符删除掉,然后将字符串变成一个Python字典的定义格式,最后运行eval或者exec函数即可)
以上第二个string,即一个字符串,该字符串内定义了一个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%的日常需要了。
来源:https://blog.csdn.net/yifengchaoran/article/details/114500579


猜你喜欢
- 支持Python的IDE有IPython、Aptana Studio(在Eclipse的基础上加插件集改的)、PyCharm(由 JetBr
- 一、百度百科1、MySQLMySQL声称自己是最流行的开源数据库。LAMP中的M指的就是MySQL。构建在LAMP上的应用都会使用MySQL
- np.random模块常用的一些方法介绍名称作用numpy.random.rand(d0, d1, …, dn)生成一
- 引言随着我被拉入一个新的群聊“生产环境死锁问题排查解决”,打破了午后的悠然惬意,点开群聊秒送了一个6
- 今天的问题是请问以下 alert 弹出值分别是什么?var f = function f2()&nb
- 利用GDAL库对tif影像进行读取 示例代码默认波段为[B、G、R、NIR的顺序,且为四个波段]import gdaldef readTif
- 本文实例讲述了python网络编程:socketserver的基本使用方法。分享给大家供大家参考,具体如下:本文内容:socketserve
- /** * Ajax分页功能 * 在需要分页的地方添加<ul class="pagination"><
- 关于with cube ,with rollup 和 grouping通过查看sql 2005的帮助文档找到了CUBE 和 ROLLUP 之
- 一、前言我们经常谈论的缓存一词,更多的类似于将硬盘中的数据存放到内存中以至于提高读取速度,比如常说的redis,就经常用来做数据的缓存。Py
- SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一
- MSSQL2000安全设置Sql server 2000建立独立帐号数据库方法首先我们启动Sql server 2000数据库,并打开企业管
- 一、is_numberic函数简介国内一部分CMS程序里面有用到过is_numberic函数,我们先看看这个函数的结构bool is_num
- 本文实例为大家分享了python画中国国旗的具体代码,供大家参考,具体内容如下# author : momoimport turtle#中国
- 一、Python 缓存① 缓存作用缓存是一种优化技术,可以在应用程序中使用它来将最近或经常使用的数据保存在内存中,通过这种方式来访问数据的速
- 1.理解mask()和setmask()一般是在pyqt绘图时常见,而且在显示不规则图形时更是常见。参考书籍上说:setMask()函数的作
- 本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下#!/usr/bin/env python# -*- c
- 在“循环”一节,我们已经讨论了Python基本的循环语法。这一节,我们将接触更加灵活的循环方式。range()在Python中,for循环后
- 拿到需求之后,发现这两个网站的MYSQL数据库都不能远程访问(安全第一吧)。于是想起了 平时使用的CSV文件批量录入数据。于是 尝试使用CS
- Oracle的系统要求企业版:CPU最低PENTIUM200M推荐PENTIUMIII1G以上 内存最低128M推荐512M 硬盘空间系统盘