简单爬虫,突破IP访问限制和复杂验证码,小总结

摘要:
IP限制。该网站限制访问IP地址的次数。我编写了一个爬虫服务器和一个爬虫客户端。服务器充当分配计算的中央处理器,客户端爬虫用于获取数据。在这种情况下,每个客户端的执行速度都不同,请求响应有快有慢,验证代理是否有效也需要时间。因此,客户端爬虫完成任务的时间必须不同,所以我安排了一台计算机作为中央处理器,以分批和小剂量分发任务列表。

简单爬虫,突破复杂验证码和IP访问限制

         文章地址:http://www.cnblogs.com/likeli/p/4730709.html

     好吧,看题目就知道我是要写一个爬虫,这个爬虫的目标网站有一些反爬取意识,所以就有了本文了。

         我先说说场景吧:

         由于工作需要,平时有一大堆数据需要在网上查询,并归档存库。某次,这种任务也给我安排了一份。观察了一网站,我的第一反应就是用爬虫取抓取。这种机械的工作何必人工呢?

         由于这家网站有反爬虫的意识,做了些工作,给我的爬虫去爬取数据造成了某些麻烦。

先列举出问题所在:

  •  首当其冲,验证码,该网站采用了数字加中文的简单四则运算作为验证码。
  •  查询目标路径参数经过了加密,我并不能直接通过取路径加参数的方式来直接跳过某些页面。
  •  IP限制,该网站对访问的IP做了访问次数计数限制。经过我的测试,一个纯净IP访问该网站一小时内最多能爬取40个有效数据(这里针对我的抓取目标来说,HTTP请求次数差不多之多200次,但是若在30s内访问次数超过25次HTTP请求,那么这个IP就直接被封掉)

         好吧,主要的问题就是这些,一些爬取过程中的小问题,就不列举了。园子里面一大堆的解决方案。这里我主要说的是,验证码和IP限制 的问题。

         当然,我的解决方案并不是什么高超的技巧。应该都是老路子了。

1、  验证码

原图:

简单爬虫,突破IP访问限制和复杂验证码,小总结第1张 简单爬虫,突破IP访问限制和复杂验证码,小总结第2张 简单爬虫,突破IP访问限制和复杂验证码,小总结第3张

         这种的验证码难度在于字符粘连,字符随机旋转问题。这两种,我分别采用了投影直方图分割卡壳法来分别切割字符和校正角度。

   我首先写了一个工具来测试:

简单爬虫,突破IP访问限制和复杂验证码,小总结第4张

简单爬虫,突破IP访问限制和复杂验证码,小总结第5张

   从上面的效果图,各位看官应该能看出,我的方法还是比较简单和传统的,那就是做特征库,通过分割出来的字符去匹配特征库的相似度来判断图片中的文字到底是什么。这里没有使用 第三方的光学识别(OCR ),因为识别汉字感觉识别率还是比较差,而且验证码中的汉字其实并不多,就是几个特定的字符,加减乘除等。所以通过特征库来识别也是绰绰有余了。

    关于验证码,我来说说我的一些问题,对于灰度计算和二值化,园子里面有很多算法,但是对于降噪,也就是去干扰线,需要自己根据目标来写特定的算法。我这里是通过削皮的方式来去掉的,每次给所有阴影剥掉一层1px的范围,填充为白色。当然了,我这方法不具备通用性。不同的验证码需要根据观察来用不同的方式来去除。

  分割呢,也就是直方图了,其实我的验证码也是可以根据色彩来做单色的直方图,这样来一步完成分割字符和降噪(有这想法,但是没有实际去实现。不过看有些大牛的博客说这样的方法是可行的)。我所了解到的分割方法还有滴水分割,不过我拿了论文资料,可惜看得不是很懂。下面贴了一段简单绘制直方图的方法:

简单爬虫,突破IP访问限制和复杂验证码,小总结第6张简单爬虫,突破IP访问限制和复杂验证码,小总结第7张
 1 //绘制直方图
 2 var zftbit = new Bitmap(bit4.Width, bit4.Height);
 3 using (Graphics g = Graphics.FromImage(zftbit))
 4 {
 5     Pen pen = new Pen(Color.Blue);
 6     for (int i = 0; i < bit4.Width; i++)
 7     {
 8         g.DrawLine(pen, i, bit4.Height - YZhiFang[i] * 2, i, bit4.Height);
 9     }
10     //阀值
11     g.DrawLine(new Pen(Color.Red), 0, bit4.Height - 2, bit4.Width, bit4.Height - 2);
12 }
13 p_zft.Image = zftbit;
绘制直方图

  关于随机旋转的字符问题,我的做法是,将验证码中的字符分割成独立单位后,进行正负30度旋转,每旋转一次,计算一次投影宽度,由于我们的字体基本上都是‘方块字’,所以呢,在旋转的时候,最小宽度肯定是‘摆正’了的,不过,这里有个小问题,那就是若源字符旋转超过45°,我们将字横着放置的时候,其宽度也是最小的。不过我们让机器多学习几次,将四个方向摆放的图形都学习了,就可以了。这就是卡壳法了。

2、IP限制问题

  这里我用了最无赖也是最无解的方法来解决的。我直接通过切换访问的代理来突破,这里没有丝毫技术性含量。挂上代理后,去访问目标网站,根据返回的结果判断代理是否还有效。若是无效了,将当前查询目标回滚一次,并切换代理就行了。

3、爬虫

  主角爬虫来了,我最早设计的爬虫是不控制时间的连续访问的,这导致代理消耗的特别快。所以不得不想办法解决这个问题。另外由于没有专门的爬虫服务器,我只能通过办公室的电脑来完成这项任务。由此,我设计了一个总线式爬虫。

简单爬虫,突破IP访问限制和复杂验证码,小总结第8张

  我写了一个爬虫服务端和一个爬虫客户端,服务端当做中央处理器,来分配计算量,客户端爬虫用来抓取数据。这样的情况下,各个客户端执行的速度其实是不一样的,请求响应又快又慢,验证代理是否有效也需要时间,所有,客户端爬虫完成任务的时间肯定不一样,所以我安排了这样一台电脑做作为中央处理器,分批次,小剂量的去分发任务列表。并接收客户端回传的结果,等完成所有任务之后统一导出或者进行写入数据库等其他操作。

爬虫节点

简单爬虫,突破IP访问限制和复杂验证码,小总结第9张

简单爬虫,突破IP访问限制和复杂验证码,小总结第10张

  每个节点上的爬虫,给17个线程去跑,10个做代理IP的验证,7个爬数据。若是给10台办公室的笔记本安装软件,一起去爬数据,那么,就相当于 70人/秒 的速度在访问这个网站。至此,效率问题也解决了。

总线

简单爬虫,突破IP访问限制和复杂验证码,小总结第11张

  总线方面,将任务列表根据下面的节点数进行分配(上图是之前截的图,之前是均分出去,后来发现均分的客户端并不是同时完成,有的快有的慢,结果快的弄完了,就空闲了,慢的还在慢吞吞的跑,所以,之后进行了小剂量分配,变相的达到动态的安排任务量)。

后记

  文章到此就基本上结束了,代码不多,我主要数我的制作思路,因为我的的这个并不具备通用性,验证码家家基本都不一样(一些极度简单的规规矩矩的纯数字或字母验证码不算,这类验证码跟没有一样)。

2018年09月30日

  多年后来更新这篇文章:当年萌新的技术缺点

    1. 验证码识别的方式太辣鸡,算法复杂度O(n^2),辣鸡中的战斗鸡

    2. 采用分布式的思维来做,这点,我很肯定当年的萌新,毕竟是自己想出来的提速方法嘛。也想到了队列这个概念,现在可以对这里的队列重新定义一下,可以采用RabbitMQ等中间件来完成分发任务,更可靠也更高效。

    3. 感谢当年萌新的彻夜奋斗!

免责声明:文章转载自《简单爬虫,突破IP访问限制和复杂验证码,小总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇docker-compose .netcoreapi、mysql、nginx多容器部署DataTables warning : Requested unknown parameter '5' from the data source for row 0下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【史上最强】英数验证码通杀识别

英数验证码通杀识别 重新选用当前泛化能力最强的网络进行训练,不过样本还是差点意思,种类跟打码平台还是有一定差距。希望强悍的生成样本可以弥补样本多样性的缺憾。 测试地址:http://152.136.181.66:19197/preview 训练过程 集合了上百种验证码: 外加生成样本(精选600+种字体): 欢迎大家来测一下他的泛化能力 比如0,o,i,...

爬虫笔记之w3cschool注册页面滑块验证码破解(巨简单滑块位置识别,非鼠标模拟轨迹)

一、背景介绍 最开始接触验证码破解的时候就是破解的w3cschool的使用手机号找回密码页面的验证码,详见:验证码识别之w3cschool字符图片验证码(easy级别),这次破解一下他们注册页面的滑块验证码,有点忐忑,我这么跟人过不去不会被打吧... 阅读前请知悉:本篇文章只涉及到滑块验证码的滑块位置识别,主要知识集中在图像处理方面,并不涉及到模拟鼠标轨迹...

Flask学习之旅--用 Python + Flask 制作一个简单的验证码系统

一、写在前面   现在无论大大小小的网站,基本上都会使用验证码,登录的时候要验证,下载的时候要验证,而使用的验证码也从那些简简单单的字符图形验证码“进化”成了需要进行图文识别的验证码、需要拖动滑块的滑动验证码、甚至还有手机验证码。当你与之打交道的时候,有没有考虑过其背后的原理呢?当然了,对于那些复杂的验证码我们想要弄得一清二楚还是很难的,但是可以挑软柿子捏...

短信验证码、图形验证码、邮件验证的自动化测试

短信验证码、图形验证码、邮件验证问题在自动化测试中是一个很常见的问题,也是一个很棘手的问题。设计的初衷其实就是为了防自动化,防止一些人利用自动工具恶意攻击网站,而很不幸的是,我们所使用的一些自动化测试工具也包含在内。聊一聊最好用的接口方法。 接口法思路: 不管短信验证码、图形验证码还是邮件验证,都需要都auth中去认证。(auth与会员进行分离,auth只...

图形验证码的识别

OCR 技术: (1) 在爬虫过程中,难免会遇到各种各样的验证码,而大多数验证码还是罔形验证码,这时候我们可以直接用 OCR 来识别(2) OCR ,即 Optical Character Recognition ,光学字符识别, 是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程(3) tesserocr 是 Python 的一个OCR 识别库,但...

captcha-killer burp验证码识别插件初体验

0x01 使用背景 在渗透测试和src挖洞碰到验证码不可绕过时,就会需要对存在验证码的登录表单进行爆破,以前一直使用PKav HTTP Fuzzer和伏羲验证码识别来爆破,但是两者都有缺点PKav HTTP Fuzzer只能对简单的验证码进行识别,伏羲验证码识别需要自己制作验证码识别的模块需要耗费一定时间训练,而captcha-killer可以直接调用云打...