热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制

( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上

( ̄▽ ̄)~*又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。

升级提示.png

升级后网站的层次结构并没有太多变化,表面上是国家企业信用信息公示系统 的验证码又升级了。之前是 点按后滑动拼图方式:
图片.png
现在的验证码主要是按顺序点击图片汉字验证码,但也不排除会出现以前的点按拖动验证码:
图片.png

验证码的破解这里就不详细介绍了,需要的可以私信我们一起讨论研究下,详细可参考极验验证码破解-源码+破解手册,极验二代和三代验证码破解的方式基本都是一个套路的东西。


爬虫的过程
  • 破解加速乐最新反爬虫机制获取COOKIE
  • 传入COOKIE获取 gt 和 challenge 参数 (破解验证码必须的参数)
  • 破解验证码
  • 带上COOKIE,提交参数跳转下一层
  • 抓取数据,这就非常简单了
破解加速乐获取COOKIE

    网站更新前是不需要这个步骤的,这次重构代码的时间主要就花在这了。一开始我用 get 方式直接访问 http://www.gsxt.gov.cn/SearchItemCaptcha ,获取 gt 和 challenge 参数 ,但是却返回错误521,于是我发现不仅仅是这个接口,但是发现根本连首页都进不去,返回错误页面403 forbidden,而且细心发现返回的并不是正常的乱码而是一串js代码。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
~{}][~~![]]][10].p(T-~~~![]-~~~![]+T),\'%\',[{}+[[], -~{}][~~![]]][10].p(([-~-~~~![]]+~~{}>>-~-~~~![])),\'V\',(+{}+[[], -~{}][~~![]]).p(15),\'L\',(15+[]+[[]][(+[])]),\'t\',([][~~{}]+[]+[]).p(y),\'v\',(-~[]/~~![]+[[], -~{}][~~![]]).p(J),\'%e\'];C(k 8=10;8

到这里取COOKIE只传递了一个__jsluid 的COOKIES值。

__jsluid=8d61794e23c2bff4a5c997b272729fba;

Google 了一下,发现这是 加速乐的一个爬虫防护机制)。浏览器第二次请求的时候会带上 __jsluid COOKIEs和JS解密计算出来的一个叫做__jsl_clearance的COOKIEs值,只有这两个COOKIEs验证匹配才认为是合法的访问身份。

这个确实花费了不少时间,知道了问题所在就简单多了,仔细分析上面的js代码就会发现我们要的东西就是这个方法:

eval(y.replace(/\b\w+\b/g,
function(y) {
    return x[f(y, z) - 1]
})

接下来就简单,用的是JAVA分析的 ,JAVA的js引擎还是挺好用的。稍微改造下js代码

        resHtml = "function getClearance(){" + resHtml+"};";
        resHtml = resHtml.replace("", "");
        resHtml = resHtml.replace("eval", "return");
        resHtml = resHtml.replace("", "");

改造后的代码js:

function getClearance() {
    var x = "__jsl_clearance@1515751840@w7ZgszEX@addEventListener@18@Fri@reverse@i@else@l@_phantom@if@captcha@3D@false@Jan@dc@catch@935@var@chips@Expires@Array@COOKIE@charAt@10@function@@D@__phantomas@vHA@while@GMT@4@attachEvent@setTimeout@cd@for@href@Path@challenge@replace@try@1500@6@length@86w@return@onreadystatechange@12@window@TAGGl@location@40@3@@B@document@0@join@DOMContentLoaded@11@e@2".replace(/@*$/, "").split("@"),
    y = "k a=r(){w(P.b||P.u){};k B,h=\'1=2.j|10|\';B=n(+[[(+!+[])]+[([-~-~~~![]]+~~{}>>-~-~~~![])]]);k l=[\'Q\',(!{}+[[], -~{}][~~![]]).p(-~[(-~{}<<-~{})]),\'3\',[{}+[[], -~{}][~~![]]][10].p(T-~~~![]-~~~![]+T),\'%\',[{}+[[], -~{}][~~![]]][10].p(([-~-~~~![]]+~~{}>>-~-~~~![])),\'V\',(+{}+[[], -~{}][~~![]]).p(15),\'L\',(15+[]+[[]][(+[])]),\'t\',([][~~{}]+[]+[]).p(y),\'v\',(-~[]/~~![]+[[], -~{}][~~![]]).p(J),\'%e\'];C(k 8=10;8

接下来用js引擎执行这段代码。

       ScriptEngineManager manager = new ScriptEngineManager();
         ScriptEngine engine = manager.getEngineByName("js");

        engine.eval(resHtml);

        Invocable invocable = (Invocable) engine;

        String resJs = (String) invocable.invokeFunction("getClearance");

这样就可以得到这段js原来的样子了,并把没用的东西去掉,得到下面的js,我们会发现dc就是我们需要的东西,具体没用的东西怎么去掉就不贴上来了,只要是有window的代码去掉,会报错;dc就是我们要的东西,模仿上个步骤加上 return dc;就可以了;

var l = function() {
    var cd, dc = \'__jsl_clearance=1515751840.935|0|\';
    cd = Array( + [[( + !+[])] + [([ - ~ - ~~~ ! []] + ~~ {} >> -~ - ~~~ ! [])]]);
    var chips = [\'TAGGl\', (!{} + [[], -~ {}][~~ ! []]).charAt( - ~ [( - ~ {} <<-~ {})]), \'w7ZgszEX\', [{} + [[], -~ {}][~~ ! []]][0].charAt(3 - ~~~ ! [] - ~~~ ! [] + 3), \'%\', [{} + [[], -~ {}][~~ ! []]][0].charAt(([ - ~ - ~~~ ! []] + ~~ {} >> -~ - ~~~ ! [])), \'B\', ( + {} + [[], -~ {}][~~ ! []]).charAt(2), \'86w\', (2 + [] + [[]][( + [])]), \'D\', ([][~~ {}] + [] + []).charAt(4), \'vHA\', ( - ~ [] / ~~ ! [] + [[], -~ {}][~~ ! []]).charAt(6), \'%3D\'];
    for (var i = 0; i 

直接执行就行了:

        engine.eval(resJs);

        String learance= (String) invocable.invokeFunction("l");

执行完就是我们要的东西啦:

__jsl_clearance=1515751840.935|0|TAGGltw7ZgszEXf%2BN86wcDOvHAs%3D

将两段COOKIE拼接起来就是最终的COOKIE了:

__jsluid=8d61794e23c2bff4a5c997b272729fba; 
__jsl_clearance=1515751840.935|0|TAGGltw7ZgszEXf%2BN86wcDOvHAs%3D;

接下来带上COOKIE访问刚刚的接口(http://www.gsxt.gov.cn/SearchItemCaptcha
),就返回200了,成功

{"challenge":"2f5ce96fd594370c49125a3264166df5","status":"ok","validate":"5be4f4ce721a7c7ad2469925800836a6"}

接下来就简单了。


注意
  • 首页返回的JS脚本里面有防止 PhantomJS 的机制:
while (window._phantom || window.__phantomas) {}; 

当发现是_phantom或者__phantomas后就直接进入死循环了。。

  • 最新发现,取上面步骤得到COOKIE访问的后续的页面会报302
    解决办法:用得到的COOKIE再次访问,并从response中取set-COOKIE,可以得到:
JSESSIOnID=AFDB40E58D5E6EC434E0584390629C03-n1:-1; 
Path=/; 
HttpOnlytlb_COOKIE=S172.16.12.67; path=/

再拼接起来才是最终的COOKIE:

__jsluid=8d61794e23c2bff4a5c997b272729fba; 
__jsl_clearance=1515751840.935|0|TAGGltw7ZgszEXf%2BN86wcDOvHAs%3D;HttpOnly;secure;
JSESSIOnID=AFDB40E58D5E6EC434E0584390629C03-n1:-1; Path=/; 
HttpOnlytlb_COOKIE=S172.16.12.67; path=/

建议将COOKIE缓存,2小时更新一次就可以了


推荐阅读
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • html和js代码互转,html转html5
    本文目录一览:1、html网页跳转javascript代码实现 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
author-avatar
手机用户40405729304
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有