当前位置: 首页 > news >正文

爬虫如何解决验证码的问题

今天要聊的就是在爬虫遇到验证码,如何去解决。

 

  1.前言:关于验证码,我觉得是很low逼的技术,但是很多面试官都会问到如何解决验证码,好像是能识别验证的就代表了爬虫工程师的技术很牛逼,相反,爬虫工程师就是菜鸟。我觉得以此来评价爬虫工程师的水平高低,是非常不合理的。

  2. 网站为何要用验证码?

    网站担心别人暴力破解刷票、论坛灌水、刷页,防止爬虫爬取数据,防止别人利用短信验证码做短信炸弹等原因。

    有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试,实际上使用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,百度社区),我们利用比较简易的方式实现了这个功能。虽然登录麻烦一点,但是对网友的密码安全来说这个功能还是很有必要,也很重要。但我们还是 提醒大家要保护好自己的密码 ,尽量使用混杂了数字、字母、符号在内的6位以上密码,不要使用诸如1234之类的简单密码或者与用户名相同、类似的密码 ,免得你的账号被人盗用给自己带来不必要的麻烦。

  3.识别验证码的技术有哪些?

    3.1  Tesseract-OCR

      这个只能识别简单的验证码,也就是要求数字和字母必须规则,弯曲变形,遇到不规则的验证码,识别率并不是很高,不过可以自己去训练模型。

    3.2   人工打码   

        这个需要花费一定的费用,但是识别率还是很高的,有很多打码平台,识别一个验证码的代价仅仅是0.01分钱,如果要爬取的网站很多的时候,遇到验证码又是各不相同,最好的方式是去花费一些金钱来做这件事情。为什么呢?因为随便照片一个爬虫工程师的工资都是15k左右吧,按照一天的工资计算800元计算。识别一个验证码按照一分钱计算。程序员一天的工资可以识别8万个验证码,所以人工打码是最好的选择。一个企业的能否生存下去,并不是因为技术的好才存活下去的。而是需要各种环境,机遇。一些大的公司也会借用小的公司的技术,比如支付宝人脸识别是自己开发的吗?所以,合理的借力也是成功的必要条件。

    3.3   机器学习

      使用机器学习去识别验证码,识别率比人的都高,缺点是需要大量的训练数据,这些数据小手工标记。开发周期长,耗时。

    3.4   绕过验证码

      为何这个在最后说呢?因为我觉得这个更重要,我在爬虫的时候遇到各种需要登录网址,也有验证码。就会手工的吧cookie信息复制下来,加到请求头上就可以了。如此简单的技术,我们为何不用呢??

    3.5  万能识别库

      这个在网上还是可以找到,别人已经训练好了。

    3.6  软件定制

      在淘宝上或者一些验证码识别群,有一些人专门从事验证码的识别工作,收费费用合理,大概100--1000元钱,普通的验证码也就两三百块钱。也可以去找他们学习这项技术,并且也不难

 

    3.7  ADSL动态IP服务器原理

      

      ADSL动态IP服务器,并不是什么高大上的方式,也不是什么特别高端的服务器,相反,使用起来,我们一般是用配置非常低的那一类,因为这个时候重要的是数量而不是质量。

      原理很简单,在家庭网络中宽带上网只要断开再拨号一次,链接成功就会更换一次外网ip。并且链接建立后网速比较稳定。这就是动态ip了,一般这个ip池很大,一个城市一般会有5W-30W的ip。基本属于用不完。so,只要有一台接入了宽带的电脑,都可以叫做ADSL动态IP服务器。但是,你要明白这样以来时间将会有部分消耗在网络建立的时间上大约十秒。

例如我们现在要攻克的R项目。他的页面每两次访问就会被强制跳转到验证码页面,,so,为了跳过验证码就得每两次访问就换一次ip。而且,最严重的就是要是面对这样高限制ip的,那么就不能在一台机器上通过多开爬虫客户端从而实现单机器的分布式爬虫。效率低很多。要想提高效率要么是ip限制次数比较高的。比如1000/ip这种,。要么就是多机器每机器单个爬虫的分布式了

 

 

 

结束语:

  不管是黑猫还是白猫,逮着老鼠都是好猫。识别验证的方式千千万万,总会有一个适合自己的。

 

 

    

 

相关文章:

  • PostgreSQL 时序数据案例 - 时间流逝, 自动压缩, 同比\环比
  • 使用 HttpClient 4 进行文件上传
  • 深入解析Spring Cloud内置的Zuul过滤器
  • exe4j打包jar文件成exe .
  • 使用 VisualVM 进行性能分析及调优
  • BZOJ1901:Zju2112 Dynamic Rankings——题解
  • Android交互
  • 第 15 章 Admonition 警告与提示
  • Android OkHttp简易使用
  • 怎么让div内容超出后自动显示滚动条
  • .NET使用存储过程实现对数据库的增删改查
  • extends继承
  • 《SqlServer 系列》 - 函数
  • Android 100+行实现本地跳一跳辅助(不需要连接电脑)
  • MyBatis DAO层传递参数到mapping.xml
  • C++入门教程(10):for 语句
  • canvas 五子棋游戏
  • es的写入过程
  • JDK 6和JDK 7中的substring()方法
  • js对象的深浅拷贝
  • Laravel 中的一个后期静态绑定
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • WebSocket使用
  • 对象管理器(defineProperty)学习笔记
  • 关于使用markdown的方法(引自CSDN教程)
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 警报:线上事故之CountDownLatch的威力
  • 如何在 Tornado 中实现 Middleware
  • 软件开发学习的5大技巧,你知道吗?
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 以太坊客户端Geth命令参数详解
  • 自动记录MySQL慢查询快照脚本
  • 最简单的无缝轮播
  • 你对linux中grep命令知道多少?
  • ionic入门之数据绑定显示-1
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (3)llvm ir转换过程
  • (9)目标检测_SSD的原理
  • (c语言)strcpy函数用法
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (JS基础)String 类型
  • (Matlab)使用竞争神经网络实现数据聚类
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (三)模仿学习-Action数据的模仿
  • (十)c52学习之旅-定时器实验
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (转)Google的Objective-C编码规范
  • (转)Sublime Text3配置Lua运行环境
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .net和jar包windows服务部署
  • .NET建议使用的大小写命名原则