二.爬虫高级--破解网站通过js加密生成cookie(二)

1. 引言

上一篇,我分析了中国土地市场网如何通过js加密获得cookie.进而得到网站的正确响应内容.这一次,接着再分析一个网站是如何通过js加密获得cookie的.会更复杂一些.

2. 分析过程

目标网站:中国医采网
采集信息如下图在这里插入图片描述
直接使用chrome浏览器抓包:
在这里插入图片描述
可以看到浏览器发送了两次请求,第一次响应码是521,第二次才是200,如果我们对比两次请求的请求参数,第二次的cookie比第一次多了一串__jsl_clearance.所以,我们的重点就是获得这串__jsl_clearance.

3.实现

  1. 先发送一次请求,看看结果是什么
url = "http://www.cyicai.com/information/applyForSubscription"
session = requests.session()
response = session.get(url)
content = response.content
print content

打印一下结果

var x=“pathname@d@1552636855@@@3@div@@new@0xFF@7@@f@fromCharCode@else@challenge@attachEvent@@@3D@document@window@search@@@if@JgSe0upZ@@Mar@Fri@return@try@__jsl_clearance@@00@e@toLowerCase@@substr@@Yxs@@@@@@false@@@@while@t@reverse@@SdYflm@@@@charAt@@1@@String@length@36@@@https@rOm9XFMtA3QKV7nYsPGT4lifyWwkq5vcjH2IdxUoCbhERLaz81DNB6@@@55@replace@19@chars@S@for@@2@15@setTimeout@@@@@@function@captcha@join@g@09@RUZO@8@Array@@var@match@fK@toString@0@@parseInt@split@onreadystatechange@534@location@m@cookie@RegExp@firstChild@Path@href@eval@0xEDB88320@@catch@charCodeAt@a@createElement@addEventListener@innerHTML@GMT@@@DOMContentLoaded@1500@Expires@”.replace(/@$/,"").split("@"),y="2g 23=27(){21(‘2q.2w=2q.1+2q.n.1x(/[\?|&]28-g/,\’\’)’,36);l.2s=‘x=3.2p|2k|’+(27(){2g 10=[27(23){v 23},27(10){v 10},27(23){1B(2g 10=2k;10<23.1o;10++){23[10]=2m(23[10]).2j(1p)};v 23.29(’’)}],23=[[-~{}],((-!/!/<<-!/!/)+[]),[-~{}]+((-!/!/<<-!/!/)+[]),[~~!/!/],(6+[]),[[(-!/!/<<-!/!/)]((-[]+[(-!/!/<<-!/!/)]>>(-!/!/<<-!/!/)))],[-{}]+[-~{}],[-~{}]+(6+[]),[-~{}]+[!/!/],[b],(-{}+((-!/!/<<-!/!/)^-[])+(-~{}+[[]])/[-~{}-~{}]+[]),((-~{}-~{})*[-~{}-~~~{}]+[]+[]),((1D)[(-(+!-[])<<-[])]+[[]][2k]),(-~(+!-[])+6+[]+[[]][2k])];1B(2g 26=2k;26<23.1o;26++){23[26]=10[1D,1l,1D,1l,2k,1l,1D,1l,1D,1l,2k,1l,1D,1l][26]};v 23.29(’’)})()+’;37=u, 20-t-1y 2b:z:1w 32;2v=/;’};q((27(){w{v !!m.30;}2A(A){v 17;}})()){l.30(‘35’,23,17)}f{l.h(‘2o’,23)}",f=function(x,y){var a=0,b=0,c=0;x=x.split("");y=y||99;while((a=x.shift())&&(b=a.charCodeAt(0)-77.5))c=(Math.abs(b)<13?(b+48.5):parseInt(a,36))+yc;return c},z=f(y.match(/\w/g).sort(function(x,y){return f(x)-f(y)}).pop());while(z++)try{eval(y.replace(/\b\w+\b/g, function(y){return x[f(y,z)-1]||(""+y)}));break}catch(){}

同样,是一大串云里雾里的js代码,不过呢,看不懂也没有关系.
这次,我们不再把他翻译成python了,因为这太费劲了.python有一大利器pyexecjs就是专门来解决python和js代码交互的.
2. 利用pyexecjs获得js的结果值:


首先需要改造一下js代码.

js_html = js_html.strip().replace("<script>", "").replace("</script>", "").replace("eval", "return ").replace("\x00","")
js_1 = '''function clearance(){''' + js_html + ''';}'''

利用execjs获得结果

ctx = execjs.compile(js_1)
js_2 = ctx.call("clearance")
print js_2

var _18=function(){setTimeout(‘location.href=location.pathname+location.search.replace(/[?|&]captcha-challenge/,’’)’,1500);document.cookie=’__jsl_clearance=1552639483.537|0|’+(function(){var _24=[function(_18){return _18},function(_24){return _24},function(_18){for(var _24=0;_24<_18.length;_24++){_18[_24]=parseInt(_18[_24]).toString(36)};return _18.join(’’)}],_18=[[-~{}]+[!/!/],((-!/!/<<-!/!/)+[]),(3+[]),[-~{}]+((-!/!/<<-!/!/)+[]),[[(-!/!/<<-!/!/)]*((-[]+[(-!/!/<<-!/!/)]>>(-!/!/<<-!/!/)))],[7],((2)*[(-(+!-[])<<-[])]+[[]][0]),[-{}]+[-~{}],(-{}+((-!/!/<<-!/!/)^-[])+(-~{}+[[]])/[-~{}-~{}]+[]),[-~{}]+(3+[]),((-~{}-~{})*[-~{}-~{}]+[]+[]),[-~{}],[!/!/],(-~(+!-[])+3+[]+[[]][0])];for(var _2g=0;_2g<_18.length;_2g++){_18[_2g]=_24[0,1,2,1,2,1,2,1,2,1,2,1,0,1][_2g]};return _18.join(’’)})()+’;Expires=Fri, 15-Mar-19 09:44:43 GMT;Path=/;’};if((function(){try{return !!window.addEventListener;}catch(e){return false;}})()){document.addEventListener(‘DOMContentLoaded’,_18,false)}else{document.attachEvent(‘onreadystatechange’,_18)}

打印发现又是一段js.不过发现了document.cookie关键字,这时应该有眉目了.我们就硬刚到底吧,接着往下执行:

js_2 = "function clearance2(){ var a" + js_2.split("document.cookie")[1].split("Path=/;'")[
    0] + "Path=/;';return a;};".replace("window.headless", "''")
print js_2
ctx_2 = execjs.compile(js_2)
clearance2 = ctx_2.call("clearance2")
print clearance2

打印结果:

__jsl_clearance=1552644677.614|0|ycBH4pF%2FFpX%2Fw%2BOWB1rwY6UglXs%3D;Expires=Fri, 15-Mar-19 11:11:17 GMT;Path=/;

扫描二维码关注公众号,回复: 5598018 查看本文章

当把这个结果打印出来以后,终于可以长出一口气了,哈哈,这不就是我们需要的cookie的__jsl_clearance值吗?


  1. 携带上一不获得cookie访问需要采集的页面.
    通过抓包可以发现,我们需要的页面信息是post请求.注意箭头处.在这里插入图片描述
    直接构造请求即可:
cookie = {"__jsl_clearance": clearance2.split("__jsl_clearance=")[1]}

post_url = "http://www.cyicai.com/information/applyForSubscriptionList"
payloadData = {"currentPage": 1,
               "filter": {"title": "", "number": "", "province": "", "pid": "", "buyer": "", "agency": ""},
               "str": "无,无,近一周"}
response = session.post(post_url, json=payloadData, cookies=cookie)
print response.status_code
print response.content

可以看到正是我们需要的结果.
好了,到此,我们成功拿到js生成的cookie并获得我们要采集的信息了.代码后续上传github上

猜你喜欢

转载自blog.csdn.net/weixin_35762183/article/details/88576379