跟师傅学习的那点事儿--爬虫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&[email protected]aTEyMzBmMzhlNT[email protected]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) + "[email protected]"; 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拼接,拿回数据就行啦。