Python爬取360指数

好吧,其实由于能力有限,未能爬取到指数。下面把我的思路记录下来,也期待大神多多指教。

可以看到指数已经加密了的,于是就找js加密函数。

经过好几天的奋战,终于在zhishu.js找到了加密函数

function decode(str, map) {
    var result = [];
    var resultCur = '';
    for (var i = 0, l = str.length; i < l; i++) {

        if (map.includes(str[i])) {
            resultCur += str[i];
        } else if (resultCur) {

            result.push(resultCur);
            resultCur = '';
        }
    }    
    if (resultCur) {
        result.push(resultCur);
    }    
    return result;
}



function decodeMap(str) {
    var result = [];
    for (var i = 0, l = str.length; i < l; i++) {
        if (result.indexOf(str[i]) === -1) {
        result.push(str[i]);
        }
    }
        return result;
    }



function transfer(arr, map) {
    var result = [];
    var len = map.length;

    for (var i = 0, l = arr.length; i < l; i++) {
        var num = 0;
        var bit = 0;        
        for (var j = arr[i].length; j--;) {
            // console.log(Math.pow(len, bit++))
            // console.log('len: ' + len) //41
            console.log('arr: ' + arr[i][j])
            console.log('map:' + map.indexOf(arr[i][j]))
            console.log('bit:' + bit)
            console.log('pow:' + Math.pow(len, bit))
            num += map.indexOf(arr[i][j]) * Math.pow(len, bit++);
            console.log(num)
        }    
        result.push(num);
    }
    return result;
}

function unzip(arr, len) {    
    var result = [];    
    if (parseInt(len, 10)) {
        result.length = parseInt(len, 10);
    }
    for (var i = 0, l = arr.length; i < l; i += 2) {

        result[arr[i]] = arr[i + 1];
    }

    result = result.join('|').split('|').map(function (n) {
        return parseInt(n, 10) || 0;
    });
    return result;
}
_bn = 'OBSO{xSnBwO$/VKwQBFK<>Kt$R3{qLx,+{UpF.Rd.(woqXS)4/T1DRztg,}nYG$@JB?dMf{^0V|0slte#<Ax8nZ<W2Es9us%Hrsk8_XcQyG'

avg = 'OanT@a'
index = 'OmwmB!3!S&q&{mQmxPFPn!{!whxh$6x6/h>hVb<bK*<*QaqaFPQP<bxb>b/btPtPRhFh3m$mq5Q5LaQa,P{P+b{bUm<mp&Q&.hKhd!V!(6V6omxmX6{6)jFj'
map = (0, decodeMap)(_bn)
console.log(map)


average = (0, transfer)((0, decode)(avg, map), map);
index = (0, transfer)((0, decode)(index, map), map);


u = unzip(average, 0)
i = unzip(index, 0)
console.log(u)
console.log(i)

[23865]
[6, 17, 18, 11, 12, 3, 4, 4, 14, 13, 13, 18, 11, 4, 8, 15, 12, 7, 11, 11, 3, 3, 13, 11, 10, 9, 9, 4, 3, 12]

返回的结果可以看出,指数平均值是对的,但是指数的值是错误的。

但是以为指数又加密了,继续查看zhishu.js后才发现,这组数据是和渲染图形的y坐标有关。

后来发现指数是由好几张图片拼接而成的,而图片又是加密的字符串

至此,再也没思路了。爬取360指数宣告失败!

 

posted @ 2022-07-05 21:00  PY_Haynes  阅读(157)  评论(0)    收藏  举报