a.JS逆向库

Python 执行 JS 代码

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

PyExecJS

1、安装PyExecJS

pip install PyExecJS

2、 PyExecJS 示例

    import execjs
    
    jsstr = '''
    function add() {
        let a = 1;
        let b = 2;
        return a+b;
    }'''
    # 将js加载进execjs
    js = execjs.compile(jsstr)
    # call 里面的参数第一个是js函数名称, 如果要执行的js有参数, 后面跟上参数就可以
    # 如js.call('add', 2, 3)这样
    result = js.call('add')
    
    print(result)

使用execjs的难点并不是在execjs这个库, 而是解析JS的过程, 因为没有浏览器的环境, 没有加密源码的依赖。从成千上万行的JS中择出想要的内容,可能是一段孤零零的JS函数,也可能是从几个JS文件去找出各自找出一段JS代码, 并可以通过execjs顺利执行, 这并非易事。 需要慢慢积累经验。 一旦掌握, 便可以提高爬虫的效率, 以及代码的健壮性, 节省资源!

2、js2py 方法

js2py是一个js的翻译工具,也是一个通过纯python实现的js解释器

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

1、安装js2py

pip install js2py

2、 js2py 示例

    import js2py
    
    jsstr = '''
    function add() {
        let a = 1;
        let b = 2;
        return a+b;
    }'''
    content = js2py.EvalJs()  # 实例化解析js对象
    content.execute(jsstr)  # js转python代码
    result = content.add()
    print(result)    

3、PyV8 方法

1、安装PyV8

    # 安装Pyv8,下砸对应的二进制版本
    # https://github.com/emmetio/pyv8-binaries
    # PyV8 是V8引擎的Python语言封装697以上star

2、PyV8 示例

    import PyV8
    
    ctxt = PyV8.JSContext()
    # ctxt.__enter__()
    ctxt.enter()
    jsstr = '''
    function add() {
        let a = 1;
        let b = 2;
        return a+b;
    }'''
    result = ctxt.eval(jsstr)
    print(result) 

4、selenium 方法

1、安装selenium

pip install selenium

2、selenium 示例

    from selenium import webdriver
    
    jsstr = '''
    function add() {
        let a = 1;
        let b = 2;
        return a+b;
    }'''
    # 调用js
    driver = webdriver.chrome()
    # driver.execute_async_script(js)
    result = driver.execute_script(jsstr)
    print(result)    
posted @   昵称已经被使用  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示