跟师傅学习的那点事儿--爬虫JS解密练习。

目标网站:

https://www.icgoo.net/search/?partno=AD620&qty=1&tdsourcetag=s_pcqq_aiomsg

要获取这个网页的信息。先来分析网页机构:

所需要的信息在:

拿出编译器,requests.get()发现没有这个信息。

怎么办?

打开fiddler,进行抓包。找到信息所在的请求。

发现类似的请求,特别多,而且所有的信息,全是这么一个框,怎么办?

点一下框上面的黄色框,也就是

进行解码,发现所有的信息全在这些请求中。

那么找出来着写请求,不就可以获取信息了?

任务又回到了原点,找请求。

从fiddler中,我们观察到所有的请求都是这个模样的:

GET /search/getdata/?sup=element14_sh&partno=AD620&qty=1&token=QZApqs?k666fgwcqsdfgMzhlVlMjQ3NDJzZD9rL2VtOTY4MzM4bGt@JnV3aTEyMzBmMzhlNTkyODgzZTYxNmE4MzQxNjQ4YWY0NmRlY2I1wcqsdfgMMzhlcmUyNTh3ZWk9QHwcq@sdfgQ=hmo28jc37qkelp1hjc0emewh HTTP/1.1

这个sup是什么鬼?token哪来的?

继续分析。

从我最开始的requests.get()中找到了这样一句url生成的方式。那么我们是不是只要找到sups[i],partno,qty,token就可以了

继续寻找。

token是由getToken生成的,目标转换,找getToken,

到了这里,我们的token就找完了。

模拟js执行,生成token,然后进行url的拼接就行了。

js代码:

var keyStr = "ABCDEFGHIJKLMNOP" + "QRSTUVWXYZabcdef" + "ghijklmnopqrstuv" + "=";
function getToken(chr0, q) {
    var output = "";
    var chr1, chr2, chr3, chr4 = "";
    var enc1, enc2, enc3, enc4 = "";
    var ecc5 = q.substr(8, 3);
    var i = 0;
    q = q.substring(0, 8) + q.substr(11);
    chr1 = q;
    chr2 = chr0;
    chr3 = chr2 / 100 << 2 + "sdfde";
    chr0 = "wcqsdfg" + (chr1 + "pqskfg");
    chr0 = "pqs?kfg" + chr0.substring(0, 11) + chr1.substring(18, chr1.length) + chr0.substring(0, 8) + chr1.substring(0, 18) + "wcq@sdfg";
    chr4 = "=hmo28jc37qk" + lq(chr2);
    do {
        chr1 = chr2.charCodeAt(i++);
        chr3 = chr2.charCodeAt(i++);
        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        if (isNaN(chr2)) {
            enc3 = enc4 = 64
        } else {
            if (isNaN(chr3)) {
                enc4 = 64
            }
        }
        output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);
        output = keyStr.charAt(enc2) + keyStr.charAt(enc1) + keyStr.charAt(chr0) + chr0 + keyStr.charAt(enc2) + chr4;
        chr1 = chr2 = chr3 = "";
        enc1 = enc2 = enc3 = enc4 = ""
    } while ( i < chr3 . length );
    output = output.substr(0, 8) + ecc5 + output.substr(8);
    return output
}
function lq(str) {
    var chr1, chr2, chr3, chr4 = "";
    var enc1, enc2, enc3, enc4 = "";
    chr1 = "p1";
    chr2 = "c0";
    chr3 = "hj";
    chr4 = "wh";
    enc1 = str.substring(0, 2);
    enc1 = enc1 + chr1;
    enc2 = str.substring(3, 2);
    enc2 = chr3 + chr2;
    enc3 = str.substring(5, 2);
    enc3 = enc1 + enc2 + enc3 + chr4;
    return enc3
};

执行代码:

supps = 'mouser,digikey,rochester,element14,hot,chip1stop,oem,future,element14_sh,online,arrow,verical,heilind,rs_china,rs_hk,avnet,questcomp,other,peigenesis,rutronik,tme,allied,corestaff,overstock,peigenesis_cn,excess,arrow_special,distrelec,rs_pro,microchip,icgoo_must_buy_parts,buerklin,epc,runic'
supp_list = supps.split(',')
token_list = []

for i in range(len(supp_list)):
    _JS = execjs.compile(open("./test.js", "r").read())  # 初始化JS
    token = _JS.call("getToken", supp_list[i], token_)
    token_list.append(token)
print(token_list)

最后进行url拼接,拿回数据就行啦。

猜你喜欢

转载自blog.csdn.net/qq_39138295/article/details/88557000