有网友反馈说西部网盘不能解析了,确认了一下,该网盘现在限制抓取网页了,该网站目前访问不稳定,看情况,争取下个版本修复。
本来想拿西部网盘来写的,可是这个网盘打不开了,还是先拿彩虹云说说吧,都一样。
这篇文章不是教程,所以有些内容会忽略掉
0、前言
不管是网盘解析还是各种的网络爬虫,都是先取得网页源码然后从中取出自己感兴趣的内容的。但这无疑损害了某些网站的利益,于是就会有各种手段来限制非客户端的用户抓取网页,本文说的js加密cookie就是其中一种。
1、先看看直接抓取的页面源码是什么样的
<script>var x="hantom@@JgSe0upZ@@Path@02@GMT@f@@Sun@captcha@if@@@href@callP@@g@try@substr@DOMContentLoaded@as@@@Expires@@chars@@onreadystate change@__jsl_clearance@new@0xFF@search@34@@window@@while@document@36@@@false@split@19@innerHTML@e@3D@8@function@location@setTimeout@attachEvent @d@var@@0xEDB88320@length@2B@yF@addEventListener@@@charCodeAt@createElement@toLowerCase@@String@@cookie@1500@14@join@@@@__p@charAt@return@path name@1559453654@Array@eval@@4@Jun@0@@catch@TmT2@@replace@@fromCharCode@@else@firstChild@@a@@FcG@oP@match@@WU@div@@reverse@challenge@06@toS tring@RegExp@Oo4BUv@for@rOm9XFMtA3QKV7nYsPGT4lifyWwkq5vcjH2IdxUoCbhERLaz81DNB6@@@@https@1@2@@@@parseInt@FB@@932".replace(/@*$/,"").split("@"), y="2b 39=26(){28('27.f=27.3e+27.1b.44(/[\\?|&]b-4l/,\\'\\')',35);1h.34='18=3f.5i|3l|'+(26(){2b e=[26(39){3d 39},26(e){3d e}, 26(39){54(2b e=3l;e<39.2e;e++){39[e]=5f(39[e]).51(1i)};3d 39.37('')}],39=[[-~{}]+(-~[-~-~{}]+[]), ((((+!1e['g'+'1'])<<(+!1e['g'+'1'])))*[((+!1e['g'+'1'])<<(+!1e['g'+'1']))]+[[]][3l]),[-~{}]+[(+!!1e['3b'+'1'+'10'])], [-~{}-~{}+3j],(-~-~{}+[]),(-~[-~-~{}]+[]),(-~[-~~~![]+((+!1e['g'+'1'])<<(+!1e['g'+'1']))-~~~![]+((+!1e['g'+'1'])<<(+! 1e['g'+'1']))]+[]+[]),[-~{}]+[-~{}],((-~{}+[~~[]])/[-~-~{}]+[]+[]),[-~{}]+(-~-~{}+[]),[(+!!1e['3b'+'1'+'10'])],[-~{}], ((((+!1e['g'+'1'])<<(+!1e['g'+'1'])))*[3j]+[]+[]),([(-~!{}+[((+!1e['g'+'1'])<<(+!1e['g'+'1']))]>>((+!1e['g'+'1'])<<(+! 1e['g'+'1'])))]*((-~!{}+[((+!1e['g'+'1'])<<(+!1e['g'+'1']))]>>((+!1e['g'+'1'])<<(+!1e['g'+'1']))))+[[]][3l])]; 54(2b 4=3l;4<39.2e;4++){39[4]=e[[3l,5a,5b,5a,3l,5a,5b,5a,3l,5a,3l,5a,3l,5a][4]]([(-~-~{}+[]),'4d', (-~-~{}+[]),'5g','4e',(-~-~{}+[]),'42%2f%',[(-~-~{}+[])+[(+!!1e['3b'+'1'+'10'])]],[[-~-~{}]/(+!!1e['3b'+'1'+'10'])+[]+[]][3l].3c((+[])), '4h%24',[(-~-~{}+[])+[-~{}]],'2g','53%',[{}+[]+[]][3l].3c((((+!1e['g'+'1'])<<(+!1e['g'+'1'])))*[3j])][39[4]])};3d 39.37('')})()+'; 13=a, 6-3k-21 50:1c:36 7;5=/;'};c((26(){j{3d !!1e.2h;}41(23){3d 1l;}})()){1h.2h('l',39,1l)}48{1h.29('17',39)}", 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))+y*c;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(_){} </script>
就是上面这些代码,它的作用是啥,直接看是肯定看不出来的,因为是加密过的。
上述代码要想执行,离不开eval这个函数。这里说个技巧,可以将上述的eval替换为return或者console.log之类的函数将相关内容打印出来,就可以看出上述代码具体功能了。
2、我懒得改,直接说结果:上述代码是在你的浏览器生成一条cookie,当网页访问时,会先检查cookie是否存在,若不存在,则代表你不是通过浏览器打开的网页,你就会继续取得上述代码,存在则正常返回结果。这也是为什么各位直接通过浏览器打开网页时可以正常访问,但是却取不到网页源码的原因!
上图框出的代码即为js动态生成的,该条cookie的__jsl_clearance可以从上述的js代码中找到!
3、这种情况怎么解决?
既然明白是怎么回事,问题就容易解决了。
思路:既然取网页源码需要这条cookie,那么我们就自己构造这条cookie,然后带着cookie去获取源码就可以了。
4、问题的关键是怎么构造这条cookie?
一般这类问题的处理方法是:
(1)修改抓取到的js代码(主要是替换eval函数为return,此处不详细描述),让这段代码不执行eval,而是通过后台执行,返回解密后的代码片段
(2)后台再次执行解密后的js代码,得到cookie
(3)携带此cookie去获取网页源码
彩虹云网盘就是因为经常更改cookie的加密方式,导致早期版本的《网赚网盘下载辅助工具》经常解析失败的。现在西部网盘貌似也要来这一套了,不过问题不大!
已有 4075 位网友参与,快来吐槽:
发表评论