关于应对网站反爬虫和验证码识别的问题

2017-07-21 09:54:20 +08:00
 2ME

公司需求 所以开始写爬虫

第一次写 直接 curl 请求 web 端 折腾了一下午算是搞定了 可是速度很慢 而且频繁被验证码限制

第二天搞了台拨号的机器 每次验证码就直接断了宽带重新拨号(动态 ip ) 但是速度还是很慢

第三天刷了一下关于爬虫的乱七八糟的知识 开始重写

重写是利用 curl_multi 进行并发请求 这次是爬 H5 端 H5 端验证码的频率比 web 端要低很多

但是新的问题出现了 放到之前拨号的机器上基本上一个页面就弹一次验证码 换 IP 也一样

本地跑就不会这样 而且重拨后 curl_multi 就会报链接超时的错误 于是就放在本地跑

但是验证码的问题还是没有解决 于是就开始摸索网站验证码的规律

几天下来还是没有太大的发现 不管是降低访问频率 还是更改爬取顺序 基本上都没什么太大变化

于是考虑从过验证码下手 验证码是纯底色 没有干扰 只是字体会变形旋转

又折腾了下 Tesseract-OCR 识别率太低 达不到想要的效果

想问几个问题 :

  • 电商网站一般都是什么反爬虫策略? 被验证码限制最多的时候就是一个循环完成后 下一个循环第一个页面被限制,最近几天在其他时候被验证码限制的情况发生频率高了一些 有用 sleep()限制频率依然没什么用
  • 爬虫 dalao 们都是怎么对抗验证码的 除了代理 IP,以及对验证码识别有没有什么效率比较高的办法 看 Tesseract-OCR 是有深度学习?的特性 但是没搞太明白
  • 拨号的那台机器用爬 H5 端的爬虫为什么会这么频繁被限制本地却不会这样 每次重拨大概率 IP 都会换 应该不是黑名单的问题吧?本地基本都是输入验证码接着重新开一下爬虫就好了
  • 如果用 php-thread 真正独立线程编写爬虫 重拨 IP 会不会出现超时的 error
  • Tesseract-OCR 配置 tessedit_char_whitelist 后会报错 read_params_file: Can't open tessedit_char_whitelist; 白名单只是添加了 a-z

作为新手可能会问出比较蠢的问题 水平有限 希望见谅 = =

有需要提供更多详细信息的我会补充 爬虫工具是用的 V2dalao querylist 致谢

5237 次点击
所在节点    程序员
36 条回复
Le4fun
2017-07-21 09:57:05 +08:00
同新手占楼学习
mansur
2017-07-21 10:12:28 +08:00
代理可购买,如果采集对象是 https 的,建议自建代理池。简单验证码可接打码平台,复杂的只能靠代理池绕过了。
2ME
2017-07-21 10:21:17 +08:00
@mansur 代理还没看过怎么搞 验证码属于比较简单的了 没有什么干扰 不过只能靠自己解决 = = 不考虑接付费平台
hxndg
2017-07-21 10:53:02 +08:00
我只知道一种对抗爬虫的技术,正常情况下用户看不到隐藏的链接,谁爬到了就禁止谁访问。
soulmine
2017-07-21 10:55:16 +08:00
@2ME 验证码还是推荐人工 各种算法都有上限值 而且程序复杂度会翻几个数量级 还有那准确率就看天了 www 如果是登陆时候需要验证码的话 可以试试带带 cookies
soulmine
2017-07-21 10:57:35 +08:00
@hxndg 这基本没用吧 我用 jq 选择器不就行了 为什么我非要去爬这个链接呢 www
2ME
2017-07-21 10:59:03 +08:00
@soulmine 验证码是爬取一段时间的限制措施 验证码 纯色背景 没有干扰噪点 只是验证码形状会扭曲一些 4 位数字+字母 感觉比平时的站验证码都要简单一些
2ME
2017-07-21 11:00:05 +08:00
@hxndg 我遇到这种情况的概率感觉不大
wangxiaoer
2017-07-21 11:00:23 +08:00
@hxndg 这种对定向抓取没啥用吧
soulmine
2017-07-21 11:07:23 +08:00
@wangxiaoer 而且这样还有个问题 你怎么区分正常情况和爬虫情况 靠 header 头么 www
nullen
2017-07-21 11:08:52 +08:00
简单一些的验证码,MINST 手写数字识别就可以过掉了。
soulmine
2017-07-21 11:10:01 +08:00
@2ME 这个好办啊 你限个速不就行了 肯定是有阈值的 你别去摧残她网站 自然不会给你验证码了 www 追求速度就跑多进程好了 只不过你得搞代理 ip 了
2ME
2017-07-21 11:14:49 +08:00
@soulmine 我最近一个星期一直在找临界点 比较有趣的是不管我速度放的有多慢 基本上数据库 6000-12000 通常 1w 条数据就出验证码了 速度最慢的时候接近单线程单请求 现在是多并发请求
soulmine
2017-07-21 11:19:42 +08:00
@2ME 那估计是看个数而不是时间的 上代理好了 www
KgM4gLtF0shViDH3
2017-07-21 11:27:38 +08:00
为啥不上付费平台,又不贵,验证码自己搞很累的。要是我做反爬虫就直接针对那些访问多的爬虫返回没用的假数据。
2ME
2017-07-21 11:56:19 +08:00
话说被 V 站禁言系统误伤 半小时不能发言 @soulmine 如果只是看个数的话我也不会说有趣了= = 我帖子内容有讲我有另一台可以拨号上网的机器实现代理功能 每次重拨都会更换 ip 一样开始单线程就是用那台机器跑 可是我把新写好并发请求的爬虫放到那台机器去跑几乎每隔一两个页面就会被弹验证码 百思不得其解
niuoh
2017-07-21 12:07:12 +08:00
可以上爬虫代理 推荐个用着不错的 ip 池 ip-chi#net
misaka19000
2017-07-21 12:29:41 +08:00
验证码试试 KNN 算法
aaronzjw
2017-07-21 12:44:04 +08:00
验证码用 cnn 模型
MrMario
2017-07-21 12:59:55 +08:00
验证码用 svm 算法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/376888

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX