热门标签 | 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小时更新一次就可以了


推荐阅读
  • 本文介绍了如何利用Java中的URLConnection类来实现基本的网络爬虫功能,包括向目标网站发送请求、接收HTML响应、解析HTML以提取所需信息,并处理可能存在的递归爬取需求。 ... [详细]
  • 在寻找轻量级Ruby Web框架的过程中,您可能会遇到Sinatra和Ramaze。两者都以简洁、轻便著称,但它们之间存在一些关键区别。本文将探讨这些差异,并提供详细的分析,帮助您做出最佳选择。 ... [详细]
  • 探讨GET与POST请求数据传输的最大容量
    在Web开发领域,GET和POST是最常见的两种数据传输方法。本文将深入探讨这两种请求方式在不同环境下的数据传输能力及其限制。 ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • SpringMVC RestTemplate的几种请求调用(转)
    SpringMVCRestTemplate的几种请求调用(转),Go语言社区,Golang程序员人脉社 ... [详细]
  • 配置PHPStudy环境并使用DVWA进行Web安全测试
    本文详细介绍了如何在PHPStudy环境下配置DVWA( Damn Vulnerable Web Application ),并利用该平台进行SQL注入和XSS攻击的练习。通过此过程,读者可以熟悉常见的Web漏洞及其利用方法。 ... [详细]
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • 优化后的摘要:本文详细分析了当前面临的挑战和机遇,结合具体实例探讨了如何通过创新和改革来推动长期可持续发展。文中还介绍了多种可行的解决方案,并强调了在不同阶段实施这些方案的重要性。 ... [详细]
  • Django Token 认证详解与 HTTP 401、403 状态码的区别
    本文详细介绍了如何在 Django 中配置和使用 Token 认证,并解释了 HTTP 401 和 HTTP 403 状态码的区别。通过具体的代码示例,帮助开发者理解认证机制及权限控制。 ... [详细]
  • 深入探讨Web页面中的锚点交互设计
    本文旨在分享Web前端开发中关于网页锚点效果的实现与优化技巧。随着Web技术的发展,越来越多的企业开始重视前端开发的质量和用户体验,而锚点功能作为提升用户浏览体验的重要手段之一,值得深入研究。 ... [详细]
  • HDU 2871 内存管理问题(线段树优化)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871。本题涉及内存管理操作,包括重置、申请、释放和查询内存块。通过使用线段树进行高效管理和维护。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 本文将介绍如何利用Python爬虫技术抓取国内主流在线学习平台的数据,并以51CTO学院为例,进行详细的技术解析和实践操作。 ... [详细]
  • 深入分析十大PHP开发框架
    随着PHP技术的发展,各类开发框架层出不穷,成为了开发者们热议的话题。本文将详细介绍并对比十款主流的PHP开发框架,旨在帮助开发者根据自身需求选择最合适的工具。 ... [详细]
  • Scrapy:强大的Python爬虫框架
    Scrapy是一个基于Python的高效网页爬取框架,利用Twisted异步网络库实现高效的网络通信。其架构设计精巧,包括核心组件如引擎、调度器、下载器等,旨在简化大规模数据抓取过程。 ... [详细]
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社区 版权所有