V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
2ME
V2EX  ›  程序员

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

  •  
  •   2ME · 2017-07-21 09:54:20 +08:00 · 5210 次点击
    这是一个创建于 2681 天前的主题,其中的信息可能已经有所发展或是发生改变。

    公司需求 所以开始写爬虫

    第一次写 直接 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 致谢

    第 1 条附言  ·  2017-07-21 15:00:52 +08:00

    ip

    这是拨号的那台机器 换一次IP插入几条就会立刻被验证码限制

    下划线是分割 上面的是当前IP 下面的是重拨后的IP

    大部分情况下换了IP第一次访问就被验证码限制

    cookie是禁用的 user-agent是随机的移动设备user-agent

    用工作的机器跑大概能跑上万条数据才会被验证码限制

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


    反爬策略封 ip,加验证码,是不是还有个 ajax 异步加载数据??我记得另外爬了一个网站,访问结果就是一条链接🌚
    qsmy
        25
    qsmy  
       2017-07-21 14:20:15 +08:00   ❤️ 1
    如果验证码简单,只是轻微粘连和扭曲变形,可以尝试 Tesseract-OCR 的机器学习,学习个几百次就能明显提高识别率。
    2ME
        26
    2ME  
    OP
       2017-07-21 14:36:53 +08:00
    @qsmy 恩 现在正在找机器学习的办法 还没太搞懂 不过 Tesseract-OCR 配置 tessedit_char_whitelist 总是用不了 感觉白名单生效的话会提高很多 不会匹配一堆奇奇怪怪的字符
    qqpkat2
        27
    qqpkat2  
       2017-07-21 14:37:37 +08:00
    毫无压力,浏览器模拟一切爬虫~
    rswl
        28
    rswl  
       2017-07-21 15:03:01 +08:00
    程序员之间的较量
    DCjanus
        29
    DCjanus  
       2017-07-21 17:33:23 +08:00   ❤️ 1
    访问频率可能是根据访问时长来限制阈值的:正常人访问时间一般比较短,爬虫几乎必然是长时间、不间断访问。
    也就是说你连续请求时间越长,针对你的访问频率阈值就会越低。
    爬虫如果不限制频率,很短时间内就会触发短期阈值;即使限制了频率,长时间访问也会碰到长期阈值。
    这种基本上无解,只能靠大量代理来解决。
    当然,如果你能知道他们的具体函数的话那就美滋滋了,比如知道多久不请求就会重置阈值以及阈值和访问时长的联系。

    另外部分网站出现过的情况,页面里一堆只有爬虫才能看到的数据,给你的数据投毒 2333 还会用 csv 画出来的价格标签,真人看起来没什么区别,爬虫爬回来就是一堆 csv,你还得跟验证码识别一样去识别价格标签。

    另外有的网站随机请求间隔比固定间隔有更高的效率。
    2ME
        30
    2ME  
    OP
       2017-07-21 17:42:35 +08:00
    @DCjanus 感谢科普 下周尝试识别验证码 如果还是不行就再回来琢磨频率问题
    2ME
        31
    2ME  
    OP
       2017-07-22 08:37:09 +08:00 via Android
    感觉收藏的要比回复的多得多..
    2ME
        32
    2ME  
    OP
       2017-07-24 17:35:32 +08:00
    @qsmy 折腾了一天 弄了下 Tesseract-OCR 识别验证码 500 次学习 识别成功率一般 但是还算能用 已经放定时任务了 想问下还有没有其他提高识别率的办法 或者其他开源的图像识别~
    qsmy
        33
    qsmy  
       2017-07-25 11:24:59 +08:00 via iPad   ❤️ 1
    @2ME 你不会是直接拿验证码识别的吧?需要先对验证码图片进行处理,比如彩色转黑白、加粗、去噪等。把识别难度降低再去学习。
    2ME
        34
    2ME  
    OP
       2017-07-25 11:28:28 +08:00
    @qsmy - - 确实没处理 直接拿去学习了 暂时先用着 早上正在看图片怎么处理好一些 图片没噪点 只是扭曲和字体比较烦人 命令行识别度比训练的 GUI 降低很多不知道为什么 GUI 基本永远都是 4 个字符的验证 命令行识别出来的经常出现更多的字符..
    qsmy
        35
    qsmy  
       2017-07-25 11:37:33 +08:00 via iPad   ❤️ 1
    @2ME 一定要先处理再去识别,起码也得黑白、加粗,否则随机性太大,识别难度大大增加。验证码的粘连是最不好处理的,其他还好。Tesseract 可以设定字符个数的。还有白名单也必须设置。
    这样至少识别率有五成(只扭曲没粘连)。
    2ME
        36
    2ME  
    OP
       2017-07-25 11:50:14 +08:00
    @qsmy 我设置 whitelist 之后识别率也是低的可怕 - - 可能是图片没经处理的原因吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3163 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 10:44 · PVG 18:44 · LAX 02:44 · JFK 05:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.