各地工商网站(全称国家企业信用信息公示系统)因为包含大量企业真实信息,金融贷款征信等都用得到,天然吸引了很大部分来自爬虫的火力,因此反爬虫措施格外严格。一般的网站仅在登录注册等环节,或者访问频繁后才弹出验证码,而工商网站查询无需登录,每查一次关键字就需要一次验证码。同时各地工商网站由于各自独立开发,自主采用了各种不同的验证码机制,更是给全量爬取的爬虫增加了更多的障碍。因此,工商网站的验证码特别具有代表性。
首先,从最简单的分页角度入手。
分页的处理可以放在前端也可以放在后端,如果只放在后端,每次点击页码就需要发送一次查询请求,而一次验证码通常只能服务于一次请求,再次请求需要获取新的验证码,直接观察翻页操作是否弹出验证码输入框即可判断是否可以绕过。
如何判断分页处理放在前端还是后端的呢?很简单,F12 打开浏览器开发者工具,页面点下一页,有新的请求就说明放在后端,反之就是前端。
实践发现,四川和上海的工商网站翻页都放在后端,且翻页没有验证码输入框。说明这里的验证码可以绕过,但是绕过的原理却有些不同:
对比四川工商网站翻页前后请求的参数,除了页码参数外,多了一项:yzmYesOrNo=no。从变量名也猜得到,后端根据该参数的值判断是否需要检查验证码。
而上海工商网站的对比结果发现,除了页码参数外,少了验证码字段,因此我们可以大胆猜测:验证码的校验仅放在了前端,后端没有做二次校验,从页面上操作是绕不过的,但是不带验证码字段直接向后端发送请求,数据就拿到了。
严格来说,上海工商网站这种算是漏洞,对待这种这种漏洞,爬虫工程师应有的态度是:悄悄的进村,打枪的不要。不过也不要利用的太狠了,笔者实验时没加限制,爬了十万数据后,ip 被封了。很长时间后才解封,同时页面改版并修复了漏洞。

其次,观察目标网站是否有多套验证码。
有些网站不知道出于什么样的考虑,会在不同的页面使用不同的验证码。一旦遇到这种情况,我们可就要捡软柿子捏了--从简单的验证码入手,移花接木,将识别的结果作为参数来向后端发送请求,从而达到绕过复杂验证码的目的。
举例来说,湖北工商的查询页面验证码是类似下图的九宫格验证码:

而电子营业执照登陆界面的验证码是这样的:

即便要识别,也明显是后者的验证码要容易些,实例代码如下:

再者,可以考虑从数据的存储id入手
专门针对移动端开发的 wap 页面限制一般要少得多。以北京工商网站来说,wap 界面不带验证码参数直接发送请求就可以得到数据的,原理类似于上海工商网站,但是其对单个ip日访问次数做了严格限制,因此该方式可以用但不好用。
继续观察,以搜索“山水集团”为例,从搜索页到列表页时,需要输入验证码,而从列表页进入详情页的时候,是不需要验证码的。最终详情页如图:

通常没人记得住各地工商网站的网址,我们会去搜索引擎里搜。当搜北京企业信用信息时,发现两个有价值的结果,除了国家企业信用信息公示系统外,还有个北京市企业信用信息信息网。进后者再操作一番可以得到下面的详情页:

观察发现,企业 id 都是相同的,嘿嘿,这不是“两块牌子,一套班子”嘛!后者的访问量要小一些,虽有验证码,但是可以采用上海工商一样的方式绕过,只是返回的结果字段不太符合我们的要求。不过,我们可以去企业信息网获得企业id,再次采用移花接木的方式,去信息公示系统构造链接获得最终的详情页嘛!
用过数据库同学都晓得,数据库里的数据 id,默认是自增的。如果有个网站引用的数据是 xxx.com?id=1234567, 那我们很容易猜得到构造类似 1234568 这样的 id 去尝试!通常,使用这种 id 规律能够轻易猜出来的网站并不多,但不代表没有。比如甘肃省工商网站,结果页是拿企业注册号来查询的。
最后,谈谈滑动验证码。
目前,工商网站已经全面改版,全部采用了滑动验证码,上面绝大多数思路都失效了。对于滑动验证码,网上能搜到的解决方案基本都是下载图片,还原图片,算出滑动距离,然后模拟 js 来进行拖动解决,我们来看下能否不模拟拖动来解决这个问题。
以云南工商网站为例,首先抓包看过程。
1. http://yn.gsxt.gov.cn/notice/pc-geetest/register?t=147991678609,response:

2. 下载验证码图片

3. http://yn.gsxt.gov.cn/notice/pc-geetest/validate, post 如下数据:

4. http://yn.gsxt.gov.cn/notice/search/ent_info_list,post 如下数据:

仔细分析,我们发现两处疑点:
第一步并没有返回需要下载的图片地址,那么前端怎么知道要下载哪些图片?
第三步验证时,并没有告知后端下载了那些图片,后端是怎么验证 post 过去的数据是有效性的?
仔细阅读前端混淆的 js 代码,我们发现前端数据处理过程是这样的:

从 0 到 6(不含)中取随机整数,赋值给 d, d=5;
从 0 到 300(不含)中取随机整数,赋值给 e, e=293;
将d转化为字符串并作 MD5 加密,加密字符串取前 9 位赋值给 f, f='e4da3b7fb';
将 e 转化为字符串并作 MD5 加密,加密字符串从第 11 位开始取 9 位赋值给 g, g='43be4f209';
取 f 的偶数位和 g 的奇数位组成新的 9 位字符串给 h, h='e3de3f70b';
取 h 的后 4 位与 200 做 MOD 运算,其结果小于 40,则取 40,否则取其本身赋值给 x,x=51;
取 [x-3, x+3] 以内随机数赋值给 c,c=51;
分别取 c,d,e 跟 challenge 做 t 加密 (t(c,challenge), t(d, challenge), t(e,challenge)) 并用(_)拼接即为 geetest_validate, '9ccccc997288_999c9ccaa83_999cc9c9999990d'
这里 f, g 参数决定了下载图片地址:

而 x 为滑块拖动的横向偏移量,至此解答了疑问 1 中图片下载地址怎么来的问题。
前边提到的 t 加密过程是这样的:

t(a,b),此处以 a=51 演示
challenge 为 34 位 16 进制字符串,取前 32 位赋值给 prefix,后 2 位赋值给 suffix,prefix='34173cb38f07f89ddbebc2ac9128303f', suffix='a8'
prefix 去重并保持原顺序,得到列表  ['3', '4', '1', '7', 'c', 'b', '8', 'f', '0', '9', 'd', 'e', '2', 'a']
将 2 中列表循环顺序放入包含 5 个子列表的列表中,得到random_key_list:  [['3', 'b', 'd'], ['4', '8', 'e'], ['1', 'f', '2'], ['7', '0', 'a'], ['c', '9']]
将 suffix 字符串(16 进制)逐位转化为 10 进制,得到 [10, 8]
将 4 中列表逐位与 [36,0] 做乘法和运算并与 a 的四舍五入结果相加, n= 51 + 36*10 + 0*8=419
q=[1,2,5,10,50], 用 q 对 n 做分解(n=50*13+10*0+5*1+2*1+1*1),将其因数倒序赋值给 p,p=[0,2,1,1,8]
从 random_key_list 右侧开始随机取值,次数为 p 中数值,拼成字符串 sub_key,sub_key='9ccccc997288'
至此,我们完成了整个分析过程,我们又有了新发现:
按照前边的抓包过程,其实不需要真的下载图片,只需执行 1、3、4 步就可以得到目标数据了。步骤 1 也可以不要,只需 3、4 即可,但是少了步骤 1, 我们还需要额外请求一次 cookie,所以还是保留 1, 这样也伪装的像一点嘛。
相同的 challenge,每次运算都可以得出不同的 validate 和 seccode,那么问题来了:到底服务端是怎么根据 challenge 验证其他数据是否有效呢?
总结一下,对于验证码,本文只是提供了一种新的思路,利用了网站开发过程中的一点小疏漏,而最后的滑动验证码也只是分析了 offline 模式的验证方法。不要指望所有验证码都可以能绕过,没有阿登高地,二战德国就不打法国了么?只要觉得有价值,即使正面面对验证码,作为爬虫工程师建议也就一句话:不要怂,就是干!

爬虫技术之规避验证码相关推荐

  1. 【精】反爬虫技术研究

    一.背景 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用于互联网搜索引擎或其他类似网站, ...

  2. 反爬虫与反反爬虫技术

    1.反爬虫技术 首先我们来思考一下,为什么要反爬虫? 网络中充斥大量爬虫的情况下,会使得整个网络的数据不可靠. 网站在面对高并发爬虫的攻击时,很容易被击溃. 版权数据被爬取,对于网站来说是巨大的损失. ...

  3. 了解一下爬虫技术方方面面

        本文全面的介绍了爬虫的原理.技术现状.以及目前仍面临的问题.如果你没接触过爬虫,本文很适合你,如果你是一名资深的虫师,那么文末的彩蛋你可能感兴趣.     一.需求     万维网上有着无数的 ...

  4. 滥用网络爬虫技术,多家公司被查!互金行业风控外包时代终结

    记 者丨陈植 编 辑丨李伊琳 "城门失火,殃及池鱼."一位互联网消费金融平台风控总监李诚(化名)感慨. 随着近日多家通过爬虫技术开展大数据信贷风控的公司被查,他所在的平台迅速决定暂 ...

  5. 6种Python反反爬虫技术,看完后我的爬虫技术提升了

    在互联网上进行自动数据采集(抓取)这件事和互联网存在的时间差不多一样长.今天大众好像更倾向于用"网络数据采集",有时会把网络数据采集程序称为网络机器人(bots).最常用的方法是写 ...

  6. 【K哥爬虫普法】蓄意突破反爬虫技术,爬取牌照信息

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  7. java毕业设计——基于java+Jsoup+HttpClient的网络爬虫技术的网络新闻分析系统设计与实现(毕业论文+程序源码)——网络新闻分析系统

    基于java+Jsoup+HttpClient的网络爬虫技术的网络新闻分析系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Jsoup+HttpClient的网络爬虫技术的网络 ...

  8. 如何快速掌握Python数据采集与网络爬虫技术

    云栖君导读:本文详细讲解了python网络爬虫,并介绍抓包分析等技术,实战训练三个网络爬虫案例,并简单补充了常见的反爬策略与反爬攻克手段.通过本文的学习,可以快速掌握网络爬虫基础,结合实战练习,写出一 ...

  9. 【第1131期】对于网络爬虫技术的攻与防

    前言 2017.12.06,今日早读文章由百度@朱英达 投稿分享. @朱英达,百度高级软件研发工程师,关注Javascript技术栈,擅长web产品的性能优化与用户流量分析. 正文从这开始- web是 ...

最新文章

  1. nginx配置image_filter生成缩略图
  2. 模型压缩、模型剪枝、模型部署
  3. 关于STM32的延时问题
  4. 文本挖掘预处理流程总结(1)— 中文
  5. 一些Java面试技巧分享,你不能错过!
  6. 一文了解 ng-template, ng-content, ng-container, 和 *ngTemplateOutlet的区别
  7. c语言编译错误 原文,C语言常见错误与警告
  8. android wtf_WTF连接池
  9. Jquery实际应用,判断radio,selelct,checkbox是否选中及选中的值
  10. Linux启动管理:主引导目录(MBR)结构及作用详解
  11. 过磅系统_简讯:崇义商砼公司开展无人值守过磅系统业务培训等二则
  12. MVC-通过对象获取整个表单内容
  13. Android-Intent界面跳转
  14. Note that ‘/home/w/.local/share‘ is not in the search pathset by the XDG_DATA_HOME and XDG_DATA_DIRS
  15. 项目管理工具——Jira使用和配置
  16. python调用matlab绘图_python调用matlab绘图
  17. 关系型数据和文档型数据库到底有什么区别?
  18. mysql分析问卷_问卷调查相关表
  19. 北京强化养老行业诚信自律 从业者禁止侮辱、虐待老人
  20. Midjourney:一步一步教你如何使用 AI 绘画 MJ

热门文章

  1. Linux云计算之集群监控
  2. 【Android 屏幕适配】屏幕适配基础概念 ④ ( 屏幕适配限定符 | 手机/平板电脑设备屏幕适配 )
  3. Quantum Mechanic
  4. 高效能人士的七个习惯-第五章-阅读
  5. VMware 网络连接设置 解决Ubuntu,Fedora 不能上网的问题
  6. Freemarker实例教程
  7. 一年工作 3600 小时,被裁只要半小时
  8. 如何理解“特征提取(Detect)、特征描述(Descriptor)、特征匹配(Match)”
  9. UML类图--依赖关系
  10. 迅雷赚钱宝 红水晶矿机 WS1408 专用特制盒子 超级项目