咸鱼灭 发表于 2021-5-14 13:17

[学习记录]记录下爬虫遇到的一个坑

昨天练习爬虫时遇到了个问题,在论坛老哥的指点下找到了视频信息的生成方式。百度了下发现pako是JS里用于解压与压缩的包。然后我就高高兴兴的用pyexecjs调用这句代码,如下:
const pako = require('pako')

function cs(pin) {
    return pako.ungzip(pin, {to: 'string'});
}
import requests
import execjs
from fake_useragent import UserAgent

url = 'https://v3.ddrk.me:9543/video?id=lKwK4yQuvITOqPfIV5uAXq%2F9fGucWarPlYhZA8P8a61vrP3SsDXhW8kAfLhTTVeCjSuZojJdGQ6oyQLvuB6WIaSx1Dp0iOGkYlfYmZBP7ujp2lU%2BPCMYU7KCuhVqIz3f&type=mix'
headers = {
    'user-agent': UserAgent().random,
}
res = requests.get(url, headers=headers)
pin = res.json()['pin']
print(pin)

with open('cs.js', 'r', encoding='utf-8') as f:
    x = f.read()
result = execjs.compile(x)
result = result.call('cs', pin)
运行后直接报错骑脸,搞了半天,终于在今天早上找到原因了,pako解压数据太(长)大时就会报错。知道原因就好办了,把数据分别解压拼接就行了。
const pako = require('pako')

function unzip(pin) {
    // 将二进制字符串转换为数字字符数组
    var charData = pin.split('').map(function (x) {
      return x.charCodeAt(0);
    });
    // 将数字数组转换为字节数组
    var binData = new Uint8Array(charData);
    // // 解压
    var data = pako.inflate(binData);
    array = new Uint16Array(data)
    var res = '';
    var chunk = 8 * 1024;
    var i;
    for (i = 0; i < array.length / chunk; i++) {
      res += String.fromCharCode.apply(null, array.slice(i * chunk, (i + 1) * chunk));
    }
    res += String.fromCharCode.apply(null, array.slice(i * chunk));

    strData = res
    return strData;
}

最后,再次感谢下昨天回帖的老哥们。

页: [1]
查看完整版本: [学习记录]记录下爬虫遇到的一个坑