Pyexecjs-使用python执行JavaScript

Pyexecjs的使用

一,下载

pip install pyexecjs

import execjs

二,使用

2.1,使用eval直接执行

import execjs
print(execjs.eval('"abc aaa bbb".split(" ")'))
['abc', 'aaa', 'bbb']

# 调用变量名
text = execjs.compile(open(r'text.js').read())
print(text.eval('d'))

2.2,compile加载js,call执行

# text.js 文件
var t 666;
function add(a, b) {
    return a+b
}

# python文件
import execjs
text = execjs.compile(open(r'text.js').read())
# 调用函数
print(text.call('add', 1, 2))
# 获取变量名
print(text.eval('t'))

2.3,更改Js引擎

  1. 获取 js 引擎的名字

    >>> execjs.get().name
    'JScript'
    
    # 默认的js引擎,但是对某一些js代码不支持,所以要换成 nodejs 引擎
    
  2. 在虚拟机中安装

    sudo apt-yum install nodejs
    
  3. Windows安装

    http://nodejs.cn/download/

三,百度翻译分析

  1. 找到发送翻译的请求,找到加密参数

    Pyexecjs-使用python执行JavaScript_第1张图片

当我们清空所有内容之后,每次点击翻译,该页面就会携带一些参数发送一个 POST 请求

  1. 分析请求参数

    如果我们要分析参数,要多请求几次,找出哪些是可变的,哪些参数不变

    Pyexecjs-使用python执行JavaScript_第2张图片

  2. 寻找参数

    一个请求参数的来源:

    1. 服务端在之前的请求返回的
    2. Js 生成的
  • token :服务端返回的,在源代码里面能找到

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bj2Ff7Vz-1592054335897)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

  1. 分析请求的js

切忌,要从请求的入口进入到 js 代码里面

Pyexecjs-使用python执行JavaScript_第3张图片

Pyexecjs-使用python执行JavaScript_第4张图片

  1. js 调试

    首先从入口进入以后,在代码处打上断点,在点击翻译按钮发送一次请求

    Pyexecjs-使用python执行JavaScript_第5张图片

    但是我们发现该请求不是我们需要的,因为翻译的时候就算输入一个字母,后台自己也会偷偷的发送请求,所以我们点击蓝色的按钮让他在运行

    Pyexecjs-使用python执行JavaScript_第6张图片

    此时我们发现调用堆栈发生改变,并且 ajax 请求发送的参数发生改变,并且找到了该js发送请求的过程,接下来就可以扣代码了

    Pyexecjs-使用python执行JavaScript_第7张图片

  2. 扣Js代码

    最关键的一步,找出生成 sign 参数的函数,并把 js 代码扣下来

    Pyexecjs-使用python执行JavaScript_第8张图片Pyexecjs-使用python执行JavaScript_第9张图片Pyexecjs-使用python执行JavaScript_第10张图片Pyexecjs-使用python执行JavaScript_第11张图片

四,拍js加密分析

  1. 首先,我们在点击观看视屏的时候,抓到的包是一个 get 请求,地址是视屏

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EB37sl16-1592054335918)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

  2. 其次,一个请求要么是js发起的,要么就是浏览器请求的(该情况属于后者)

    Pyexecjs-使用python执行JavaScript_第12张图片

  3. 所以我们去审查元素,并在网页源代码里面找这个播放视屏盒子的属性

    Pyexecjs-使用python执行JavaScript_第13张图片

  4. 我们发现播放视屏里的元素都是 js 生成的,所以通过 Fiddle 去抓包,把这些 js 生成的盒子的属性用全局搜索去查看,并且找到了我们需要的 js 文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hRLi2dPa-1592054335923)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

  5. sources 里面,我们通过在 Fiddler 里面找打的 js 文件,顺利进入内部

    Pyexecjs-使用python执行JavaScript_第14张图片

  6. 在此处断点,一步一步在调用堆栈里面查找我们需要的js代码

    Pyexecjs-使用python执行JavaScript_第15张图片

    Pyexecjs-使用python执行JavaScript_第16张图片

    但是我们往上看发现,传进来的 t 参数已经把视屏地址解压了,所以继续看调用堆栈

    Pyexecjs-使用python执行JavaScript_第17张图片

  7. 终于有了小发现(url 的解码方式,就差 url 的来源了),a.vcastr_file 这个参数就是来源,还得继续往上面找

    Pyexecjs-使用python执行JavaScript_第18张图片

    Pyexecjs-使用python执行JavaScript_第19张图片

    发现其实我们需要的参数是 this 这个参数

    Pyexecjs-使用python执行JavaScript_第20张图片

  8. 最终在堆栈中,我们找出了this生成的方式,也找到了url的的来源

    Pyexecjs-使用python执行JavaScript_第21张图片

  9. 剩下的就是扣代码 js 代码进行改造了

    python 代码

sourse_page = requests.get('https://www.meipai.com/media/1140316782').text
encrypt_mp4_url = re.findall(r'data-video="(.*?)"', sourse)[0]
print(mp4_url)	# 加密的地址

js = execjs.compile(open(r'美拍分析.js').read())
decrypt_mp4_url = js.call('decodeMp4.decode', mp4_url)
print(a)		# 解密后的地址

js 代码

var h = "substring",
    i = "split",
    j = "replace",
    k = "substr",
    g = 'base64'
decodeMp4 = {
        getHex: function(a) {
            return {
                str: a[h](4),
                hex: a[h](0, 4)[i]("").reverse().join("")
            }
        },
        getDec: function(a) {
            var b = parseInt(a, 16).toString();
            return {
                pre: b[h](0, 2)[i](""),
                tail: b[h](2)[i]("")
            }
        },
        substr: function(a, b) {
            var c = a[h](0, b[0])
              , d = a[k](b[0], b[1]);
            return c + a[h](b[0])[j](d, "")
        },
        getPos: function(a, b) {
            return b[0] = a.length - b[0] - b[1],
            b
        },
        decode: function(a) {
            var b = decodeMp4.getHex(a)
              , c = decodeMp4.getDec(b.hex)
              , d = decodeMp4[k](b.str, c.pre);
            return atob(decodeMp4[k](d, decodeMp4.getPos(d, c.tail)))
        }
    };

var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
atob = function(a) {
        if (a = a.replace(/=+$/, ""),
        a.length % 4 == 1)
            throw f;
        for (var b, c, d = 0, g = 0, h = ""; c = a.charAt(g++); ~c && (b = d % 4 ? 64 * b + c : c,
        d++ % 4) ? h += String.fromCharCode(255 & b >> (-2 * d & 6)) : 0)
            c = e.indexOf(c);
        return h
    }

你可能感兴趣的:(Python爬虫)