2019-10-18 14:36:49   295   4   

本文最后更新于天前,文中介绍内容及环境可能已不适用.请谨慎参考.

搞了快2个星期的爬虫了。

进展还可以,基本上企查查上可以拉的数据都能拉下来了,反正这些网站的数据大抵也是从某处爬的吧🤔

 

昨天需求有点变化,需要新增一些信息的爬取,

其中有企业经营异常数据,就是某某企业因为未及时公布该公布的信息,没有按照xxx规则执行等等。

 

本来以为企查查上不登陆没法查询所以就直接去国家企业信用信息公示系统爬取了。(ps: 昨天貌似点击过多导致企查查需要登陆才可见,导致判断错误~(。・`ω´・))

结果遇到了传说中的521错误返回。

返回了一堆JS。。。也是厉害,搜索了一番,发现些文章,挺有用的。

实践了一番,也算是整出来了,有些修改,记录如下:

 

主要目的为通过代码拉取指定企业的经营异常数据。

分析发现站点通过ajax拉取数据.

而且ajax的url每次都不同,是随页面加载变化的。

于是,有了下面的过程,先处理完521的问题,拿到页面,然后从页面拿ajaxurl,再请求.

一、第一次访问

比如

http://www.gsxt.gov.cn/{83E056B8EBC1F76A18F691BBC91D7526C834F684AE528664D2F8AB45B9801FF1966ABE5CEAC0029F1340DD5193F4361CC9A77608BD290B5DC9186E38AC366B7C4046404640576B6D57515751575157515751F8556F626F53FAFC4EB6DEE7BE0D7FABC31473205295AF959395167EE16DAAD8C1A2D0839FF768E467A538B4768AE290576D6B6D6B6D6B-1571365601573}

这个链接,正常访问应该是打开下面这个页面.,需要的就是列表中的数据

第一段JS

直接用代码访问,结果就是返回521错误,同时返回的body数据如下:

<script>var x="@0@challenge@1@C@substr@19@@@@02@GMT@@@36@toString@replace@Path@@return@1571363536@rOm9XFMtA3QKV7nYsPGT4lifyWwkq5vcjH2IdxUoCbhERLaz81DNB6@toLowerCase@@false@@@@eval@@@@@e@@new@document@@innerHTML@Fri@Expires@window@_p@for@@Array@@3@@@2@a@length@f@parseInt@createElement@@https@ZdZ@while@52@chars@pathname@div@18@Oct@var@if@charCodeAt@JgSe0upZ@hantom@@@cookie@@try@cu@fromCharCode@firstChild@function@@href@d@6@E@RegExp@8@@@1500@3D@match@addEventListener@search@145@@16@@8j@0xEDB88320@charAt@@else@@@@DOMContentLoaded@split@NMl@reverse@@join@0xFF@g@attachEvent@catch@location@9@bJ@String@setTimeout@@@captcha@@__jsl_clearance@onreadystatechange@".replace(/@*$/,"").split("@"),y="1e 8=1r(){2f('2b.1t=2b.1a+2b.1F.h(/[\\?|&]2i-3/,\\'\\')',1B);B.1l='2k=l.1G|2|'+(1r(){1e 25=[1r(8){k 8},1r(25){k 25},1r(8){k t('2e.1p('+8+')')},1r(8){I(1e 25=2;25<8.10;25++){8[25]=12(8[25]).g(f)};k 8.26('')}],8=&#x(1y+[])+[M]],'5',v]+[1v]],'16',(1y+[]),'23',[(-~-~!/!/+(-~[]+[~~''])/[-~~~!!G['H'+'1i']-~~~!!G['H'+'1i']]+[]+[])+((-~[]<<-~[])+[]+&#x]][2])],'1o',(-~{}+[]+&#x]][2]),'2d',[M],v]+[([P]+~~{}>>P)]],[(-~{}+[]+&#x]][2])+((-~[]<<-~[])+[]+&#x]][2])],'1K',v]+(2c+[]+[]),(-~-~!/!/+(-~[]+[~~''])/[-~~~!!G['H'+'1i']-~~~!!G['H'+'1i']]+[]+[])+(-~{}+[]+&#x]][2])],&#xM]+((-~[]<<-~[])+[]+&#x]][2])],[-~!/!//~~[]+[]][2].1M((+!/!/)),[(-~-~!/!/+(-~[]+[~~''])/[-~~~!!G['H'+'1i']-~~~!!G['H'+'1i']]+[]+[])+(~~{}+&#x]][2])],'1w'];I(1e e=2;e<8.10;e++){8[e]=25&#xP,4,P,4,2,4,P,4,2,4,2,P,M,4,P,M,2,P,4][e]](8[e])};k 8.26('')})()+';F=E, 1c-1d-7 b:18:1I c;i=/;'};1f((1r(){1n{k !!G.1E;}2a(y){k p;}})()){B.1E('21',8,p)}1O{B.29('2l',8)}",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>

或者

<script>var x="@@search@@setTimeout@_p@@eval@@8@GMT@@@@@@else@length@a@pathname@@21@07@@try@RegExp@@split@19@@d@DOMContentLoaded@@document@attachEvent@@catch@toString@0@JgSe0upZ@@while@@x@onreadystatechange@new@@vofSa9y@36@div@f@if@return@@1@join@@@innerHTML@4@hantom@@reverse@location@e@match@1500@challenge@@kT@@Expires@@@@3@createElement@for@Path@@g@charCodeAt@rOm9XFMtA3QKV7nYsPGT4lifyWwkq5vcjH2IdxUoCbhERLaz81DNB6@@href@@@0xEDB88320@2@9@@@parseInt@window@Array@1571361667@cookie@@chars@String@@function@captcha@@toLowerCase@__jsl_clearance@fromCharCode@0xFF@02@addEventListener@@https@substr@18@false@@var@475@kR1aX@Oct@@charAt@6@firstChild@Fri@replace@@".replace(/@*$/,"").split("@"),y="57 1l=4e(){5('2k.3j=2k.k+2k.3.5g(/[\\?|&]4f-32/,\\'\\')',31);1c.49='4i=48.58|1h|'+(4e(){57 7=[4e(1l){29 1l},4e(7){29 7},4e(1l){29 8('4c.4j('+1l+')')},4e(1l){3c(57 7=1h;7<1l.i;7++){1l[7]=45(1l[7]).1g(25)};29 1l.2c('')}],1l=['24',({}+&#x]][1h]).5c((-~{}<<(-~~~!!46['6'+'2h']+[(-~[]<<-~[])]>>(-~[]<<-~[]))))+(-~{}+[]+&#x]][1h]),'34',]]+(-~-~!/!/+(-~[]+[~~''])/[-~~~!!46['6'+'2h']-~~~!!46['6'+'2h']]+[]+[])],'59',[(-~{}+[]+&#x]][1h])+(((-~[]<<-~[])<<(+!-{}))+[]+&#x]][1h]),((-~[]<<-~[])+[]+&#x]][1h])+(~~{}+&#x]][1h])],[(-~-~!/!/+(-~[]+[~~''])/[-~~~!!46['6'+'2h']-~~~!!46['6'+'2h']]+[]+[])+[([41]+~~{}>>41)],[5d]+[([41]+~~{}>>41)]],'2g',[((-~[]<<-~[])+[]+&#x]][1h])+(-~{}+[]+&#x]][1h])],'20',]]+(42+[]+[])],(((-~[]<<-~[])<<(+!-{}))+[]+&#x]][1h]),'2g%',[3a],]]+(a+[])]];3c(57 1e=1h;1e<1l.i;1e++){1l[1e]=7+,1h,2b,41,2b,3a,41,2b,3a,2b,41,1h,2b,1h,41][1e]](1l[1e])};29 1l.2c('')})()+';36=5f, 54-5a-17 4l:10:11 b;3d=/;'};28((4e(){13{29 !!46.50;}1f(2l){29 55;}})()){1c.50('1a',1l,55)}h{1c.1d('21',1l)}",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>

反正都是一个<script></script>括起来的随机js数据.

整理下,大抵是这样的.

var x="Bi@Array@0@GMT@@1500@charAt@createElement@match@charCodeAt@0xFF@up@eval@length@@for@a@reverse@fromCharCode@false@1571296704@div@Oct@innerHTML@@@@@@@@catch@while@captcha@new@g@D@firstChild@@@substr@BZ@Thu@y@5@function@search@18@DOMContentLoaded@@f@@36@d@@@onreadystatechange@@@@@href@try@challenge@@rOm9XFMtA3QKV7nYsPGT4lifyWwkq5vcjH2IdxUoCbhERLaz81DNB6@@addEventListener@@return@@@JgSe0upZ@chars@pathname@2@window@@@@https@@e@cookie@@@else@@setTimeout@document@@split@if@@location@3@__jsl_clearance@parseInt@@var@475@join@@@24@replace@8@0xEDB88320@RegExp@19@5ct@@toLowerCase@s@Expires@08@@A@1@@toString@@Path@@attachEvent@17@@String".replace(/@*$/,"").split("@"),y="79 57=37(){6b('74.4a=74.5a+74.38.82(/[\\?|&]28-4c/,\\'\\')',6);6c.66='76=18.7a|3|'+(37(){79 70=[37(57){55 57},37(70){55 70},(37(){79 57=6c.8('19');57.1b='<14 4a=\\'/\\'>80</14>';57=57.2c.4a;79 70=57.9(/63?:\\/\\//)[3];57=57.32(70.11).89();55 37(70){13(79 80=3;80<70.11;80++){70[80]=57.7(70[80])};55 70.7b('')}})(),37(57){55 10('9b.16('+57+')')}],80=['1',(((+!!{})-~~~{}-~~~{})/~~{}+[]).7(~~[]),'87',&#x(-~-~{})*[-~-~{}]]],[((-~{}<<((+!!{})+[(-~![]<<-~![])]>>(-~![]<<-~![])))+[])+[(+!!{})+[(+[])]-((+!!{}))]],'35',&#x((+!!{})|5b)]+(-~[(-~[]+[(-~![]<<-~![])])/[(-~![]<<-~![])]]+&#x]][3])],(-~-~{}+[]+[]),'33',[(+!!{})+[(+[])]-((+!!{}))],&#x-~[]]+[-~[]]],(-~-~{}+[]+[]),'91',&#x-~[]]+[(-~-~{})*[-~-~{}]]],[((-~{}<<((+!!{})+[(-~![]<<-~![])]>>(-~![]<<-~![])))+[])+[36]],[-~~~{}/(+[])+[]+&#x]][3]][3].7((+!!{})+((+!!{})+[(-~![]<<-~![])]>>(-~![]<<-~![]))+((+!!{})+[(-~![]<<-~![])]>>(-~![]<<-~![]))),&#x-~[]]+[(+[])]+(-~[(-~[]+[(-~![]<<-~![])])/[(-~![]<<-~![])]]+&#x]][3])],'c',[((+!!{})-~~~{}-~~~{})/~~{}+[]][3].7(((+!!{})|5b)),'8a',[-~~~{}/(+[])+[]+&#x]][3]][3].7((+!!{})+((+!!{})+[(-~![]<<-~![])]>>(-~![]<<-~![]))+((+!!{})+[(-~![]<<-~![])]>>(-~![]<<-~![]))),'2b',[((+!!{})|5b)],&#x-~[]]+[((+!!{})|5b)]],'u',[(-~[]+(-~![]+[~~!/!/])/[(-~![]<<-~![])]+[]+&#x]][3])+((-~{}<<((+!!{})+[(-~![]<<-~![])]>>(-~![]<<-~![])))+[])]];13(79 57=3;57<80.11;57++){80[57]=70’,3,92,5b,75,92,75,3,92,3,5b,3,92,5b,75,3,75,92,3,92,3,92,3,5b,92,75][57]](80[57])};55 80.7b('')})()+';8b=34, 99-1a-86 8c:39:81 4;96=/;'};72((37(){4b{55 !!5c.53;}26(65){55 17;}})()){6c.53('3a',57,17)}69{6c.98('45',57)}",
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(_){}

关键在后面try catch里面 ,不管怎么变,最后都是会在浏览器运行得到第二段JS。

 

这里把第一段代码稍作修改复制到chorme-console里面直接执行,模拟得到第二段js.

var x="Bi@Array@0@GMT@@1500@charAt@createElement@match@charCodeAt@0xFF@up@eval@length@@for@a@reverse@fromCharCode@false@1571296704@div@Oct@innerHTML@@@@@@@@catch@while@captcha@new@g@D@firstChild@@@substr@BZ@Thu@y@5@function@search@18@DOMContentLoaded@@f@@36@d@@@onreadystatechange@@@@@href@try@challenge@@rOm9XFMtA3QKV7nYsPGT4lifyWwkq5vcjH2IdxUoCbhERLaz81DNB6@@addEventListener@@return@@@JgSe0upZ@chars@pathname@2@window@@@@https@@e@cookie@@@else@@setTimeout@document@@split@if@@location@3@__jsl_clearance@parseInt@@var@475@join@@@24@replace@8@0xEDB88320@RegExp@19@5ct@@toLowerCase@s@Expires@08@@A@1@@toString@@Path@@attachEvent@17@@String".replace(/@*$/,"").split("@"),y="79 57=37(){6b('74.4a=74.5a+74.38.82(/[\\?|&]28-4c/,\\'\\')',6);6c.66='76=18.7a|3|'+(37(){79 70=[37(57){55 57},37(70){55 70},(37(){79 57=6c.8('19');57.1b='<14 4a=\\'/\\'>80</14>';57=57.2c.4a;79 70=57.9(/63?:\\/\\//)[3];57=57.32(70.11).89();55 37(70){13(79 80=3;80<70.11;80++){70[80]=57.7(70[80])};55 70.7b('')}})(),37(57){55 10('9b.16('+57+')')}],80=['1',(((+!!{})-~~~{}-~~~{})/~~{}+[]).7(~~[]),'87',&#x(-~-~{})*[-~-~{}]]],[((-~{}<<((+!!{})+[(-~![]<<-~![])]>>(-~![]<<-~![])))+[])+[(+!!{})+[(+[])]-((+!!{}))]],'35',&#x((+!!{})|5b)]+(-~[(-~[]+[(-~![]<<-~![])])/[(-~![]<<-~![])]]+&#x]][3])],(-~-~{}+[]+[]),'33',[(+!!{})+[(+[])]-((+!!{}))],&#x-~[]]+[-~[]]],(-~-~{}+[]+[]),'91',&#x-~[]]+[(-~-~{})*[-~-~{}]]],[((-~{}<<((+!!{})+[(-~![]<<-~![])]>>(-~![]<<-~![])))+[])+[36]],[-~~~{}/(+[])+[]+&#x]][3]][3].7((+!!{})+((+!!{})+[(-~![]<<-~![])]>>(-~![]<<-~![]))+((+!!{})+[(-~![]<<-~![])]>>(-~![]<<-~![]))),&#x-~[]]+[(+[])]+(-~[(-~[]+[(-~![]<<-~![])])/[(-~![]<<-~![])]]+&#x]][3])],'c',[((+!!{})-~~~{}-~~~{})/~~{}+[]][3].7(((+!!{})|5b)),'8a',[-~~~{}/(+[])+[]+&#x]][3]][3].7((+!!{})+((+!!{})+[(-~![]<<-~![])]>>(-~![]<<-~![]))+((+!!{})+[(-~![]<<-~![])]>>(-~![]<<-~![]))),'2b',[((+!!{})|5b)],&#x-~[]]+[((+!!{})|5b)]],'u',[(-~[]+(-~![]+[~~!/!/])/[(-~![]<<-~![])]+[]+&#x]][3])+((-~{}<<((+!!{})+[(-~![]<<-~![])]>>(-~![]<<-~![])))+[])]];13(79 57=3;57<80.11;57++){80[57]=70’,3,92,5b,75,92,75,3,92,3,5b,3,92,5b,75,3,75,92,3,92,3,92,3,5b,92,75][57]](80[57])};55 80.7b('')})()+';8b=34, 99-1a-86 8c:39:81 4;96=/;'};72((37(){4b{55 !!5c.53;}26(65){55 17;}})()){6c.53('3a',57,17)}69{6c.98('45',57)}",
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{
    tp=y.replace(/\b\w+\b/g, function(y){return x[f(y,z)-1]||("_"+y)});
    tp;
    break
}catch(_){}

 

chorme console执行过程.第二段~

 

第二段JS:

 

var _57 = function () { 
    setTimeout('location.href=location.pathname+location.search.replace(/[\?|&]captcha-challenge/,\'\')', 1500);
 document.cookie = '__jsl_clearance=1571296704.475|0|' + 
 (function () { var _70 = [function (_57) { return _57 }, function (_70) { return _70 },
     (function () { 
         var _57 = document.createElement('div'); _57.innerHTML = '<a href=\'/\'>_80</a > ';
      _57 = _57.firstChild.href; var _70 = _57.match(/https?:\/\//)[0]; _57 = _57.substr(_70.length).toLowerCase(); 
      return function (_70) { for (var _80 = 0; _80 < _70.length; _80++) { _70[_80] = _57.charAt(_70[_80]) }; 
      return _70.join('') } })(), function (_57) { return eval('String.fromCharCode(' + _57 + ')') }],
       _80 = ['Bi', (((+!!{}) - ~~~{} - ~~~{}) / ~~{} + []).charAt(~~[]), '5ct', &#x(-~-~{}) * [-~-~{}]]], 
       [((-~{} << ((+!!{}) + [(-~![] << -~![])] >> (-~![] << -~![]))) + []) + [(+!!{}) + [(+[])] - ((+!!{}))]], 'y',
        &#x((+!!{}) | 2)] + (-~[(-~[] + [(-~![] << -~![])]) / [(-~![] << -~![])]] + &#x]][0])], (-~-~{} + [] + []), 
        'BZ', [(+!!{}) + [(+[])] - ((+!!{}))], &#x-~[]] + [-~[]]], (-~-~{} + [] + []), 'A', &#x-~[]] + [(-~-~{}) * [-~-~{}]]], [((-~{} << ((+!!{}) + [(-~![] << -~![])] >> (-~![] << -~![]))) + []) + [5]],
         [-~~~{} / (+[]) + [] + &#x]][0]][0].charAt((+!!{}) + ((+!!{}) + [(-~![] << -~![])] >> (-~![] << -~![])) + ((+!!{}) + [(-~![] << -~![])] >> (-~![] << -~![]))), &#x-~[]] + [(+[])] + (-~[(-~[] + [(-~![] << -~![])]) / [(-~![] << -~![])]] + &#x]][0])], 
         'up', [((+!!{}) - ~~~{} - ~~~{}) / ~~{} + []][0].charAt(((+!!{}) | 2)), 
         's', [-~~~{} / (+[]) + [] + &#x]][0]][0].charAt((+!!{}) + ((+!!{}) + [(-~![] << -~![])] >> (-~![] << -~![])) + ((+!!{}) + [(-~![] << -~![])] >> (-~![] << -~![]))), 
         'D', [((+!!{}) | 2)], &#x-~[]] + [((+!!{}) | 2)]], ' % 3',
          [(-~[] + (-~![] + [~~!/!/]) / [(-~![] << -~![])] + [] + &#x]][0]) + ((-~{} << ((+!!{}) + [(-~![] << -~![])] >> (-~![] << -~![]))) + [])]];
           for (var _57 = 0; _57 < _80.length; _57++) { _80[_57] = _70, 0, 1, 2, 3, 1, 3, 0, 1, 0, 2, 0, 1, 2, 3, 0, 3, 1, 0, 1, 0, 1, 0, 2, 1, 3][_57]](_80[_57]) }; 
           return _80.join('') })()
        
           + '; Expires = Thu, 17 - Oct - 19 08: 18: 24 GMT; Path = /;' 
        }; 
if ((function () { try { return !!window.addEventListener; } catch (e) { return false; } })()) { 
    document.addEventListener('DOMContentLoaded', _57, false) 
} else {
     document.attachEvent('onreadystatechange', _57) 

还是比较清楚的,就是一大段NB哄哄的计算,得到一个__jsl_clearance 的cookie值。

这里其实有多种可能,至少我测试的时候发现了好几种。

第二段JS中参数/内容也是随机的,可能有正常的,也可能有错误无法执行的。

正确的,比如:

var _1l=function(){setTimeout('location.href=location.pathname+location.search.replace(/[\?|&]captcha-challenge/,\'\')',1500);
document.cookie='__jsl_clearance=1571361667.475|0|'+
(function(){var _7=[function(_1l){return _1l},function(_7){return _7},
    function(_1l){return eval('String.fromCharCode('+_1l+')')},
    function(_1l){for(var _7=0;_7<_1l.length;_7++){_1l[_7]=parseInt(_1l[_7]).toString(36)};return _1l.join('')}],_1l=['vofSa9y',({}+&#x]][0]).charAt((-~{}<<(-~~~!!window['_p'+'hantom']+[(-~[]<<-~[])]>>(-~[]<<-~[]))))+(-~{}+[]+&#x]][0]),'kT',]+(-~-~!/!/+(-~[]+[~~''])/[-~~~!!window['_p'+'hantom']-~~~!!window['_p'+'hantom']]+[]+[])],'kR1aX',[(-~{}+[]+&#x]][0])+(((-~[]<<-~[])<<(+!-{}))+[]+&#x]][0]),((-~[]<<-~[])+[]+&#x]][0])+(~~{}+&#x]][0])],[(-~-~!/!/+(-~[]+[~~''])/[-~~~!!window['_p'+'hantom']-~~~!!window['_p'+'hantom']]+[]+[])+[([2]+~~{}>>2)],[6]+[([2]+~~{}>>2)]],'4',[((-~[]<<-~[])+[]+&#x]][0])+(-~{}+[]+&#x]][0])],'x',]+(9+[]+[])],(((-~[]<<-~[])<<(+!-{}))+[]+&#x]][0]),'4%',[3],]+(8+[])]];for(var _1e=0;_1e<_1l.length;_1e++){_1l[_1e]=_7,0,1,2,1,3,2,1,3,1,2,0,1,0,2][_1e]](_1l[_1e])}
    ;return _1l.join('')})()
    +';Expires=Fri, 18-Oct-19 02:21:07 GMT;Path=/;'};
    if((function(){try{return !!window.addEventListener;}catch(e){return false;}})())
{document.addEventListener('DOMContentLoaded',_1l,false)}else{document.attachEvent('onreadystatechange',_1l)}

错误的,比如:

_1h __jsl_clearance=_2j(){
    setTimeout('location.href=location._29+location.substr.replace(/[\?|&]cookie-toString/,\'\')',_1s);
    document._1K='for=1571367113.addEventListener|_1I|'+(_2j(){_1h charAt=[_2j(__jsl_clearance){return __jsl_clearance},_2j(charAt){return charAt},_2j(__jsl_clearance)
        {return eval('firstChild._25('+__jsl_clearance+')')},_2j(__jsl_clearance){innerHTML(_1h charAt=_1I;charAt<__jsl_clearance.length;charAt++){
            __jsl_clearance[charAt]=parseInt(__jsl_clearance[charAt]).catch(window)};return __jsl_clearance.join('')}],__jsl_clearance=[(-~[]+(-~![]+[~~!/!/])/[(-~![]<<-~![])]+[]+&#x]][_1I]),&#x-~[]]+[(-~-~{})*[-~-~{}]]],[(-~[(-~[]+[(-~![]<<-~![])])/[(-~![]<<-~![])]]+&#x]][_1I])+[-~[]]],'7',&#x((+!!{})|Expires)]+[5]],[(-~[(-~[]+[(-~![]<<-~![])])/[(-~![]<<-~![])]]+&#x]][_1I])+(-~[(-~[]+[(-~![]<<-~![])])/[(-~![]<<-~![])]]+&#x]][_1I]),((-~{}<<((+!!{})+[(-~![]<<-~![])]>>(-~![]<<-~![])))+[])+(-~[]+(-~![]+[~~!/!/])/[(-~![]<<-~![])]+[]+&#x]][_1I])],'RegExp',[(-~[]+(-~![]+[~~!/!/])/[(-~![]<<-~![])]+[]+&#x]][_1I])+[5]],'ct',&#x-~[]]+[(+[])]],&#x((+!!{})|Expires)]+(-~[(-~[]+[(-~![]<<-~![])])/[(-~![]<<-~![])]]+&#x]][_1I])],'53',[(-~[]+(-~![]+[~~!/!/])/[(-~![]<<-~![])]+[]+&#x]][_1I])+[(+!!{})+[(+[])]-((+!!{}))]],&#x-~[]]+[(-~-~{})*[-~-~{}]]],'_1B',[((+!!{})|Expires)],&#x-~[]]+(-~-~{}+[]+[])],[-~[]],'d9y',&#x(+!!{})+[(+[])]-((+!!{}))]+[(+[])]],&#x-~[]]+(-~-~{}+[]+[])],'%3',[(-~[]+(-~![]+[~~!/!/])/[(-~![]<<-~![])]+[]+&#x]][_1I])+((-~{}<<((+!!{})+[(-~![]<<-~![])]>>(-~![]<<-~![])))+[])]];innerHTML(_1h _3=_1I;_3<__jsl_clearance.length;_3++){__jsl_clearance[_3]=charAt&#x_1I,3,Expires,1,3,Expires,1,Expires,1,3,Expires,1,Expires,3,1,_1I,3,_1I,1,Expires,3,1,Expires][_3]](__jsl_clearance[_3])}
;return __jsl_clearance.join('')})()
+';_28=_1k, 18-Oct-19 captcha:51:String GMT;2=/;'};
if((_2j(){pathname{return !!_11.g;}div(_1D){return false;}})())
{document.g('_1n',__jsl_clearance,false)}else{document._2m('onreadystatechange',__jsl_clearance)}

,又或者:

Oct _8=firstChild(){bJ('attachEvent._1t=attachEvent.chars+attachEvent.addEventListener.replace(/[\?|&]_2i-challenge/,\'\')',_1B)
;document._1l='captcha=1571363536.search|0|'+(firstChild(){Oct NMl=[firstChild(_8){return _8},
    firstChild(NMl){return NMl},firstChild(_8){return eval('9.cu('+_8+')')},firstChild(_8){for(Oct NMl=0;NMl<_8.a;NMl++){_8[NMl]=f(_8[NMl]).toString(36)};
    return _8.reverse('')}],_8=&#x(RegExp+[])+[3]],'C',
]+[d]],'https',
    (RegExp+[]),'DOMContentLoaded',[(-~-~!/!/+(-~[]+[~~''])/[-~~~!!window['_p'+'JgSe0upZ']-~~~!!window['_p'+'JgSe0upZ']]+[]+[])+((-~[]<<-~[])+[]+&#x]][0])],'try',(-~{}+[]+&#x]][0]),'location',[3],
]+[([2]+~~{}>>2)]],[(-~{}+[]+&#x]][0])+((-~[]<<-~[])+[]+&#x]][0])],'_1K',
]+(catch+[]+[]),(-~-~!/!/+(-~[]+[~~''])/[-~~~!!window['_p'+'JgSe0upZ']-~~~!!window['_p'+'JgSe0upZ']]+[]+[])+(-~{}+[]+&#x]][0])],]+((-~[]<<-~[])+[]+&#x]][0])],[-~!/!//~~[]+[]][0].0xEDB88320((+!/!/)),[(-~-~!/!/+(-~[]+[~~''])/[-~~~!!window['_p'+'JgSe0upZ']-~~~!!window['_p'+'JgSe0upZ']]+[]+[])+(~~{}+&#x]][0])],'600'];for(Oct _e=0;_e<_8.a;_e++){_8[_e]=NMl,1,2,1,0,1,2,1,0,1,0,2,3,1,2,3,0,2,1][_e]](_8[_e])};return _8.reverse('')})()+';Expires=Fri, div-18-19 02:while:_1I GMT;Path=/;'};
    var((firstChild(){_1n{return !!window.match;}g(e){return false;}})()){document.match('_21',_8,false)}_1O{document.0xFF('_2l',_8)}

这些错误的JS不知道是故意的,还是程序错误,浏览器中总会少个(,{,}之类的符号。

好像官网上基本查好几次也才能出来一次正确的结果。(・ˍ・*)

 

错误的就算了,不管了,大不了多查几次咯。

说说正确的,基本思路就是使用chorme的 v8引擎解析js,获取cookie后面那一串的实际数据。

前面第一段也需要用到v8.

pom.xml如下:

<dependency>
	<groupId>com.eclipsesource.j2v8</groupId>
	<artifactId>j2v8_win32_x86_64</artifactId>
	<version>4.6.0</version>
</dependency>

 

v8解析简单使用下

jar自动解析加载so或者dll容易死锁,出现 no j2v8_win32_x86_64 in java.library.path 的问题.

所以这里可以手动解压jar包,先加载jar中的dll或者so 


	try {
			System.load("F:\\w3\\wmagicspider\\jni\\libj2v8_win32_x86_64.dll");
		} catch (Exception e) {
			System.err.println("libj2v8_win32_x86_64" + " load  failed!" + e.getMessage());
		}

		V8 runtime = V8.createV8Runtime();
		int result = runtime.executeIntegerScript(
				"" + "var hello = 'hello, ';\n" + "var world = 'world!';\n" + "hello.concat(world).length;\n");
		System.out.println("Test JS result = " + result);
		runtime.release();

 

然后这里有第二个坑.

第二段JS中会随机出来的 document.createElement / window[xxx]  等.

比如:这里用到 document对象,这些对象 V8中不支持.

然后研究这个代码,发现 _57返回的就是一个 当前网站的根目录....

说白了就是验证是否是从http://www.gsxt.gov.cn 访问的数据呗。。。

 var _57 = document.createElement('div'); _57.innerHTML = '<a href=\'/\'>_80</a > ';
      _57 = _57.firstChild.href; var _70 = _57.match(/https?:\/\//)[0]; _57 = _57.substr(_70.length).toLowerCase(); 

好吧,这里代码里面直接替换成固定串就OK~[]~( ̄▽ ̄)~*

 

另外一个坑是用到了window对象,然而这些都是undefined啊。。就是混淆代码,

简单,v8初始化的时候,给个window对象就是了

[-~~~!!window['_p'+'JgSe0upZ']-~~~!!window['_p'+'JgSe0upZ']

搞定! 

	V8 runtime = V8.createV8Runtime("window");

 

最后大抵就是这样的。

二、解析代码

如下:

//拿到第一次请求返回的JS
			else if(response.getStatusLine().getStatusCode()==521){
				
				
				
				
				
				HttpEntity entity = response.getEntity();
				String html=EntityUtils.toString(entity,"utf-8");
				System.out.println(html);
				//处理从服务器返回的JS,并执行
				String js=html.trim().replace("<script>", "").replace("</script>", "").replace("eval(y.replace(/\\b\\w+\\b/g, function(y){return x[f(y,z)-1]||(\"_\"+y)}));","tp=y.replace(/\\b\\w+\\b/g, function(y){return x[f(y,z)-1]||(\"_\"+y)});tp;");
				
				V8 runtime = V8.createV8Runtime("window");
				String result=runtime.executeStringScript(js);
				System.out.println(result);
				//第二次处理JS并执行
				result=result.substring(result.indexOf("document.cookie="),result.indexOf("+';Expires="))+" ;document.cookie;";
				result=result.replace("document.cookie", "tpcookie");
				System.out.println(result);
				
				
				String __jsl_clearance_cookie="";
				if(result.contains("document.createElement"))
				{
					//验证1
				int dvstart= result.indexOf("=document.createElement('div')");
				int dvend= result.indexOf("toLowerCase();")+"toLowerCase();".length();
				
				int paramstart=result.indexOf(" ",dvstart-10)+1;
				int paramend=result.indexOf("=",dvstart-10);
				String vname=result.substring(paramstart,paramend);
				String data="var "+vname+"="+"\"www.gsxt.gov.cn/\";";
				
				String lastrst=result.substring(0, dvstart-("var "+vname).length())+data+result.substring(dvend);
				System.out.println(lastrst);
//				var _1d=document.createElement('div');_1d.innerHTML='<a href=\'/\'>_1h</a>';_1d=_1d.firstChild.href;var _2o=_1d.match(/https?:\/\//)[0];_1d=_1d.substr(_2o.length).toLowerCase();
						
				String __jsl_clearance=runtime.executeStringScript(lastrst);
				__jsl_clearance_cookie=__jsl_clearance.split("=")[1];
				System.out.println(__jsl_clearance_cookie);
				}
				else
				{
					//验证2
					//int dvstart= result.indexOf("|0|'+")+"|0|'+".length();
					//int dvsend= result.indexOf("+';Expires=");
					String lastrst=result;//.substring(dvstart,dvsend);
					System.out.println(lastrst);
					String __jsl_clearance=runtime.executeStringScript(lastrst);
					__jsl_clearance_cookie=__jsl_clearance.split("=")[1];
					System.out.println(__jsl_clearance_cookie);
				}
				
				
				
				
				runtime.release();
				//__jsl_clearance

 

三、第二次访问

到这里内容里面返回的cookie拿到了,同时还有个坑,在response里面,还有个set-cookie头,会带第二个cookie数据。

拿到两个cookie即可再次请求页面.

这里返回页面数据。

从页面获取 entBusExcepUrl 数据,加上url头,第三次访问.

 

 

 

url参数是随着页面刷新自动变化,所以必须要前面两次请求拉取页面。

 

四、第三次访问

我们的目的是获取异常tab页面的数据

前两次,get请求,第三次post请求。

// 解析js cookie
			String responsedata = HttpSendPost.sendHttpJSONDataNoSSL(agent, isGet, "", true, url, commetdata, headers,
					cks);

			List<BasicClientCookie> cks2 = cks;

			// 页面-获取posturl
			responsedata = HttpSendPost.sendHttpJSONDataNoSSL(agent, isGet, "", true, url, commetdata, headers, cks);

			// url=urlpost;
			// isGet=false;
			// var entBusExcepUrl =
			int urlStart = responsedata.indexOf("var entBusExcepUrl = ") + "var entBusExcepUrl =  ".length();
			int urlEnd = responsedata.indexOf("\"", urlStart + 20);
			String entBusExcepUrl = responsedata.substring(urlStart, urlEnd);
			// url=urlpost;
			isGet = false;

			String realurl = "http://www.gsxt.gov.cn" + entBusExcepUrl;
			System.out.println(realurl);
			responsedata = HttpSendPost.sendHttpJSONDataNoSSL(agent, isGet, "", true, realurl, commetdata, headers,
					cks);

搞定收工.😁

 

最后好像也用不上。。白搞了,头大啊啊。。

还是老老实实爬企查查吧😀

~

 


 2019-10-18 15:58:44 
 0

  本文基于CC BY-NC-ND 4.0 许可协议发布,作者:野生的喵喵 固定链接: 【爬虫521状态】 转载请注明



发表新的评论
{{s_uid}}   , 欢迎回来.
您的称呼(*必填):
您的邮箱地址(*必填,您的邮箱地址不会公开,仅作为有回复后的消息通知手段):
您的站点地址(选填):
留言:

∑( ° △ °|||)︴

(๑•̀ㅂ•́)و✧
<( ̄) ̄)>
[]~( ̄▽ ̄)~*
( ̄ˇ ̄)
[]~( ̄▽ ̄)~*
( ̄ˇ ̄)
╮( ̄▽ ̄)╭
( ̄ε(# ̄)
(⊙ˍ⊙)
( ̄▽ ̄)~*
∑( ° △ °|||)︴

文章分类

可能喜欢 

KxのBook@Copyright 2017- All Rights Reserved
Designed and themed by 野生的喵喵   1344205   38288