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

对于爬虫来说,一种绕开验证码登录的好办法

  •  
  •   tikazyq ·
    tikazyq · 2020-02-08 12:33:16 +08:00 · 9744 次点击
    这是一个创建于 1511 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在爬虫开发过程中,经常会遇到验证码的情况,这是反爬过程中相当有门槛的措施,破解成本非常高,需要深度学习、JS 逆向等相关的经验,而且成功率还不一定很高。即使破解成功,如果目标网站换了验证码生成的方法或算法,那么费了九牛二虎之力才成功破解的工作将前功尽弃。因此,破解验证码这种反人类的事情,真的不适合新手。

    那么,用什么方法才能够避免验证码,从而完成登录呢?如果一个方法不行( Not working ),我们不要死磕( Stick to it ),我们可以尝试采用绕开的方式( Workaround )。而本文将介绍一种简单可行的绕开验证码的办法,并且实践证明是非常有效的。目前关于这种方法的网上资料并不多,本文将简单介绍一下,权当抛砖引玉。

    文章链接: 地址

    76 条回复    2020-02-09 22:38:35 +08:00
    rekulas
        1
    rekulas  
       2020-02-08 14:16:07 +08:00   ❤️ 43
    你抛出的问题:
    用什么方法才能够避免验证码,从而完成登录呢

    你提出的解决方案:
    输入验证码登录后,拿到登录后的 cookie,绕过登录验证

    大哥你真的不是在忽悠小白吗
    1018ji
        2
    1018ji  
       2020-02-08 14:22:47 +08:00 via Android
    这非常(没)有用
    tikazyq
        3
    tikazyq  
    OP
       2020-02-08 14:58:04 +08:00 via iPhone
    @rekulas 有啥问题?
    tikazyq
        4
    tikazyq  
    OP
       2020-02-08 14:59:03 +08:00 via iPhone
    @1018ji 到底是有用还是没用…
    also24
        5
    also24  
       2020-02-08 15:02:20 +08:00
    一脸懵逼的看完整篇文章…………
    finely
        6
    finely  
       2020-02-08 15:19:44 +08:00   ❤️ 48
    对于疫情,防止买不到口罩的好办法:

    提前买好口罩,届时拿出来用
    kidult
        7
    kidult  
       2020-02-08 15:42:15 +08:00   ❤️ 1
    对于避免每次回家都要拿出钥匙开门的好办法:

    提前让家里人把门开好,这样可以直接进,不用找半天钥匙
    mara1
        8
    mara1  
       2020-02-08 15:50:43 +08:00
    题主,我要是加密一下存 session 呢?
    okjb
        9
    okjb  
       2020-02-08 15:52:39 +08:00 via Android
    @finely 有楼主内味了😂真是鬼才
    lhx2008
        10
    lhx2008  
       2020-02-08 15:55:30 +08:00 via Android   ❤️ 1
    行了,就是人工输入验证码呗,讲的这么神秘
    iyaozhen
        11
    iyaozhen  
       2020-02-08 15:58:22 +08:00
    我破解验证码就是为了 cookie,你给我说可以先拿 cookie 就不用验证码了 这不是逗嘛
    qiushaox
        12
    qiushaox  
       2020-02-08 15:59:03 +08:00 via iPhone
    虽然大家都在笑楼主,但我之前做的一个爬虫系统,就是用的这种思想。对于没精力去搞破解验证码的同学还是挺有用的嘛
    idemaker
        13
    idemaker  
       2020-02-08 16:01:38 +08:00
    作者真是闲的,小白的东西,,这个只能帮助小白了解简单的爬虫流程,现在每个大型网站都有 token 认证,token 这个到期之后的问题呢!
    jugelizi
        14
    jugelizi  
       2020-02-08 16:02:47 +08:00
    .。。人工大妈了解下
    locoz
        15
    locoz  
       2020-02-08 16:15:00 +08:00 via Android   ❤️ 1
    @rekulas @1018ji @also24 @finely @kidult @lhx2008 @iyaozhen @idemaker

    😂其实说白了就是用插件取 cookie 给爬虫使用,虽然是个很简单粗暴的办法,但是楼上有些朋友可能没想到把这个办法扩展开的用途,比如说:

    有些网站 / app 的登录操作可能搞起来很麻烦 / 涉及到很复杂的风控 / 涉及到高难度验证码 / 需要高真人度的账号,并且 session 可能会要更新,更新时又会涉及到前面那一堆麻烦事,而你可能只需要少量账号就能做完你所要做的事情。

    那这种情况下完全可以直接忽略掉登录步骤,通过浏览器插件 / 写一个基于 xposed 之类的 hook 框架的 app,很自然地就把 session 给取了,并且不用担心账号的真人度太低而触发风控、出现验证码或假数据的问题。

    ---

    据我所知有些公司搞淘宝、美团之类的就是这么搞的,一点压力都没有。方法虽然简单,但并不是没用,甚至可以说非常有用。

    实际上确实挺多人并不会想到这种方法,我在爬虫群里看见过很多碰到我前面说的那种情况但只会硬怼的。
    godoway
        16
    godoway  
       2020-02-08 16:24:20 +08:00 via Android   ❤️ 1
    @locoz
    @qiushaox
    并不是在取笑这个手段,而是答非所问
    pcbl
        17
    pcbl  
       2020-02-08 16:26:14 +08:00 via Android   ❤️ 2
    登录验证码从来不是障碍,麻烦的风险请求导致的验证码
    axwz88
        18
    axwz88  
       2020-02-08 16:29:28 +08:00 via Android
    直接用 cookie 登陆只能针对某些网站和某些场景,的确是小白操作,不过有一说一也是最实用的姿势,只是能用这个方法的网站不多
    falcon05
        19
    falcon05  
       2020-02-08 16:31:25 +08:00 via iPhone
    v2ex 的每日签到我就是这样“绕过”的,的确没啥技术含量,而且还要处理 cookie 过期的问题。
    locoz
        20
    locoz  
       2020-02-08 16:34:06 +08:00 via Android
    @godoway 其实只是表述方式的问题,给问题加上标题里的“对于爬虫来说”这个前提就正常了。
    515576745
        21
    515576745  
       2020-02-08 16:36:24 +08:00 via Android
    小白都会的方法? cookie browser 就是这样的
    LevineChen
        22
    LevineChen  
       2020-02-08 17:24:28 +08:00
    早些年确实流行这种攻击方式, 现在不清楚有这种漏洞的网站还多不多了.
    matsuijurina
        23
    matsuijurina  
       2020-02-08 17:40:17 +08:00 via iPhone
    本来以为是某个打码公司的软文,没想到楼主竟如此可爱
    a852695
        24
    a852695  
       2020-02-08 17:45:19 +08:00
    楼主在无聊的在家时光给了我巨大的快乐。
    zhw2590582
        25
    zhw2590582  
       2020-02-08 17:46:29 +08:00 via iPhone
    不用点开文章看了,其实这个方法可以浓缩成 100 字以内,小白都能看懂。
    springGun
        26
    springGun  
       2020-02-08 17:59:32 +08:00
    @locoz 原来是知乎的爬虫大佬,通过 app 抓包获取的 session 不会被风控识别吗? 如果抓取到假数据你是怎么区分的? 人工筛选吗?
    locoz
        27
    locoz  
       2020-02-08 18:08:45 +08:00
    @springGun #26 不是大佬,菜鸡一个。

    我说的这种方式,取到的 session 是你手机上日常使用的帐号的 session,只要后续的请求参数啥的都没问题就不会有啥问题,毕竟你的日常操作已经把对方风控的真人度分值给拉高了。

    假数据一般可以先用随机抽出部分数据人工比对的方式判断是否正常,如果正常了的话后续就可以程序自己判断了。比如说商品价格之类的,有一种很常见的方式就是与之前价格的平均值做比较,如果大范围出现差异过大的情况就可以判定为被喂假数据了。
    locoz
        28
    locoz  
       2020-02-08 18:12:22 +08:00
    @zhw2590582 #25 缩到 100 字以内小白还真看不懂😂大部分小白由于知识面还没扩开的关系,会不知道具体该怎么做。
    tikazyq
        29
    tikazyq  
    OP
       2020-02-08 18:38:08 +08:00
    @finely 既然这种方式有效,你是不是后悔没提前备着呢
    kisshere
        30
    kisshere  
       2020-02-08 18:42:51 +08:00
    这项目我王多鱼投了!
    tikazyq
        31
    tikazyq  
    OP
       2020-02-08 18:49:36 +08:00   ❤️ 1
    一回来看到这么多评论,而且很多都是比较倾向于这种办法过于简单,不足挂齿的。这里我简单说明一下。

    我写这篇文章的目的,不是为了把一个很简单的东西说得有多么高大上,而是将一个我的实际的产品例子拿来分享。这里再安利一下用到了这个技术的 Github 项目 ArtiPub,用的人也不是非常多,现在也只有 1.6k Github Stars,但在实战中确实有效,方法非常简单,而且竞争对手 OpenWrite 也是用这种方式来绕开登录的。其中所有平台 掘金、SF、v2ex、CSDN、开源中国、博客园、知乎、今日头条,都被这种方法绕开了,都是用 Cookie 的方式!不知道有不有相关的大佬会看到这篇文章回去升级登录验证方式的,例如用 JWT。

    https://github.com/crawlab-team/artipub

    我看了一下数据,文章阅读量到目前只有 65 个,也就是说 1.3k 从 v2 点进来的人,有多少人是真正看了文章而评论的呢?如果只是为了娱乐,我可以当然一笑了之,如果是被没看懂的大佬们误导,就有点得不偿失了。
    tikazyq
        32
    tikazyq  
    OP
       2020-02-08 18:50:01 +08:00
    @godoway 为啥答非所问?
    tikazyq
        33
    tikazyq  
    OP
       2020-02-08 18:50:19 +08:00
    @zhw2590582 请尝试小学生写作试试
    tikazyq
        34
    tikazyq  
    OP
       2020-02-08 18:50:54 +08:00
    @matsuijurina 可爱在哪一点?;)
    t6attack
        35
    t6attack  
       2020-02-08 18:56:19 +08:00
    我自己攒的所有爬虫,凡是需要登录的,都是手动登录拿的 cookie。然后把拿到的 cookie 嵌入项目。这和验证码无关,只是觉得写“自动登录”多此一举。
    我也是第一次听说,这是绕过验证码的手段?!

    人家验证码是防这个的嘛?
    注册验证码 防的是 注册机、登录验证码 防的是 密码暴破,谁防你登录后采集啦?
    tikazyq
        36
    tikazyq  
    OP
       2020-02-08 19:08:03 +08:00 via iPhone
    @t6attack 哪里写了自动登录这几个字的?
    ipwx
        37
    ipwx  
       2020-02-08 19:11:19 +08:00
    @tikazyq 你也不要光顾着嘲笑楼下嘲笑你的列位。这里问题的核心在于,有没有维护爬虫运行“运营成本”。

    你如果一个公司,可以雇人专门手输验证码,Okay 这不是问题。但是楼下多少人是给公司做项目要输验证码的?很多个人项目之所以写爬虫,不就是为了付出一点开发成本(程序员个人的空闲时间),换取之后完全零运营成本么?所以绕过验证码对于这些场景是不可容忍的。

    至于你说验证码太难,没法攻破怎么办?很简单,不写程序了,退回人肉操作。连爬虫都不写了,反正是个人项目嘛。
    ipwx
        38
    ipwx  
       2020-02-08 19:12:11 +08:00
    @tikazyq 对了,其实不说个人项目,如果你接的是爬虫外包,金主爸爸不接受手输验证码,那也没辙啊~
    tikazyq
        39
    tikazyq  
    OP
       2020-02-08 19:16:06 +08:00 via iPhone
    @ipwx 这里的运营成本我理解的是管理爬虫的维护成本。如果是暴力破解验证码,算法一换立马凉凉。相反,如果是采用绕开的方式就可以有效绕开登录,何乐而不为呢,我觉得这是目前为止最简单花费最小的方式。咱们程序员都懒人,既然这样,为什么要亲自造火箭呢?
    ipwx
        40
    ipwx  
       2020-02-08 19:44:29 +08:00
    @tikazyq 算法换的慢啊~ 开发验证码的程序员也是懒人哟。
    locoz
        41
    locoz  
       2020-02-08 19:53:25 +08:00
    @ipwx #37 这种操作本质上是“人工登录”而不是“人工打码”,区别挺大的。“人工登录”其实也没有啥运营成本,日常使用时自然而然地就把 session 有效期给刷新了。而大部分网站 /APP 只处于登录状态,不很高频的操作的话是不会在后续出现验证码的。

    公司项目方面我在#15 举的例子可以看看;
    个人项目的话,使用这种操作实际上比写自动登录更省时省心,毕竟自动登录实际上还会碰到页面改版、更换验证码、添加校验参数、偷偷对使用低版本接口登录的帐号降权等各种问题。而登录一出岔子后面的操作很可能就全都报废了,跟着更新花的时间根据难度的不同,花个十几二十分钟甚至几天都有可能,但“人工登录”几十秒就能解决问题。
    locoz
        42
    locoz  
       2020-02-08 19:56:36 +08:00   ❤️ 1
    @ipwx #40 😂加密算法自更新和动态混淆了解一下,大厂和专业的验证码 /风控厂商已经逐渐开始玩这种操作了。
    kenvix
        43
    kenvix  
       2020-02-08 21:00:37 +08:00
    ?但凡写爬虫需要写登录处理验证码的,都是您老这种方法完全不能用的情况
    AX5N
        44
    AX5N  
       2020-02-08 21:03:17 +08:00
    这个技术极其简单,也许有用,但你写的废话太多。就不能抓住重点,几句话说完么。
    jziwenchen
        45
    jziwenchen  
       2020-02-08 21:05:09 +08:00
    没试试对接打码平台 API ?
    whoami9894
        46
    whoami9894  
       2020-02-08 21:09:00 +08:00 via Android
    @tikazyq #31

    > 不知道有不有相关的大佬会看到这篇文章回去升级登录验证方式的,例如用 JWT

    建议先搞清楚 jwt 是什么。
    而且,用这种方式绕过登录并不代表网站的验证方式有问题,和浏览器正常访问完全相同的 HTTP 报文服务器怎么区分? (不考虑请求频率

    你说的这种方式确实有用,比如我不想花时间破解验证码,只想用程序批量获取登录后数据时。但你煞有介事的发个帖,给我的感觉就是半瓶子晃荡
    tikazyq
        47
    tikazyq  
    OP
       2020-02-08 21:13:06 +08:00 via iPhone
    @whoami9894 对这种评论我也只有 no comment 😷
    tikazyq
        48
    tikazyq  
    OP
       2020-02-08 21:14:13 +08:00 via iPhone
    @AX5N 对于懂的人来说可能都不用说,不懂的人需要大量篇幅
    tikazyq
        49
    tikazyq  
    OP
       2020-02-08 21:19:15 +08:00 via iPhone
    @jziwenchen 确实打码平台是一种办法
    mengminggo
        50
    mengminggo  
       2020-02-08 21:35:44 +08:00 via Android
    薛定谔的 cookie
    i0error
        51
    i0error  
       2020-02-08 21:38:06 +08:00 via Android
    @tikazyq #31 非 wexin 打开似乎不计算阅读量
    tikazyq
        52
    tikazyq  
    OP
       2020-02-08 21:44:25 +08:00 via iPhone
    @i0error 即使如此,我估计看完文章的也没几个
    ooops
        53
    ooops  
       2020-02-08 21:44:59 +08:00   ❤️ 2
    教程发错地方了,这里不是你文章的受众。标题也起的确实不合适,我承认我是被骗进来的
    yoshiyuki
        54
    yoshiyuki  
       2020-02-08 21:45:30 +08:00   ❤️ 1
    确实可行,是一种半手动介入,降级完成爬虫的方法

    诸君嘲讽大可不必,楼主表述有一定不准确的地方,只表达“绕过”验证码,但是没有在标题、摘要等地方明确指出是人工操作、自动化程度降低的。
    tabris17
        55
    tabris17  
       2020-02-08 21:46:26 +08:00
    问:如何绕过“全自动区分计算机和人类的公开图灵测试”(CAPTCHA)?
    答:雇个人手动去验证嘛
    locoz
        56
    locoz  
       2020-02-08 21:52:15 +08:00   ❤️ 1
    @i0error #51
    @tikazyq #52
    非微信打开不记展示阅读量,但是后台在群发分析里可以看到有个“其他”渠道,那个是包含了外站打开的阅读量的。
    tikazyq
        57
    tikazyq  
    OP
       2020-02-08 21:55:10 +08:00 via iPhone
    @locoz 明天空了看看😁
    locoz
        58
    locoz  
       2020-02-08 21:55:47 +08:00
    @jziwenchen #45 打码平台只能解决验证码,对于加密参数难搞 / 风控严格的情况没用的。(实际上很多不会逆向或者逆向水平比较差的人碰到的主要问题不是验证码而是后两个
    tikazyq
        59
    tikazyq  
    OP
       2020-02-08 21:56:06 +08:00 via iPhone
    @ooops 确实,下次要在摘要中把思路也说了
    murmur
        60
    murmur  
       2020-02-08 21:56:54 +08:00
    cookie 也会出问题的,在大概不知道多少年前我们就用 cookie 抓新浪微博,然而每天都有无数的账号触发手机验证
    真当反扒是吃素的啊
    tikazyq
        61
    tikazyq  
    OP
       2020-02-08 21:57:55 +08:00 via iPhone
    @yoshiyuki 确实有表述问题,看来有些误导的意思,认为裤子都脱了,你就给我看这个的样子
    tikazyq
        62
    tikazyq  
    OP
       2020-02-08 21:59:58 +08:00 via iPhone
    @murmur 那是抓得太频繁被识别出来了,对于 ArtiPub 这种低频操作还是可以的
    yankebupt
        63
    yankebupt  
       2020-02-08 22:03:13 +08:00   ❤️ 1
    表示落伍太久了
    现在的 app 已经是新版一出旧版 cookie/session 寿命立刻削成渣,逼你换新 app 版本了,不玩爬虫的手动低频用户还不容易看出来,无止尽的怼版本真的有耐心么。
    locoz
        64
    locoz  
       2020-02-08 22:38:50 +08:00
    @murmur #60 你那估计是单账号分到的请求频率太高了,我前公司最开始买的那批帐号到我走的时候都是好好的😂
    areless
        65
    areless  
       2020-02-08 23:12:40 +08:00 via Android
    ~~~十几年前火车头采集啊论坛群发啊都抓验证码让你手动输入的。后来 rss 了,多如牛毛的新闻没啥用了,爬 rss 几天时间居然爬了 300 多 g,本来爬着做 seo~~~但搜索引擎也不傻。
    qqpkat2
        66
    qqpkat2  
       2020-02-09 00:17:07 +08:00
    你跟客户去说让他手动输入 cookie 看看
    mgoann
        67
    mgoann  
       2020-02-09 03:34:50 +08:00 via Android
    一个 httpOnly 你的实现就瘫了
    killerv
        68
    killerv  
       2020-02-09 12:08:11 +08:00
    楼主说的这个是有场景的,比如登录一个账号就能抓取所有信息,并不需要登录很多账号,比如我需要登录才能抓取链家的房产信息。可能描述有问题吧。
    -----------
    但是这本来就是一句话就说完的,还说那么多,放个链接……
    linvaux
        69
    linvaux  
       2020-02-09 12:55:38 +08:00
    对接打码平台不就好了
    Tompes
        70
    Tompes  
       2020-02-09 13:27:42 +08:00
    哈哈哈哈哈哈哈哈,不行了 我要笑死了
    tikazyq
        71
    tikazyq  
    OP
       2020-02-09 14:50:29 +08:00 via iPhone
    @killerv 这是项目的实践经验,一句话还真说不完,即使说完也不一定能实现
    tikazyq
        72
    tikazyq  
    OP
       2020-02-09 14:50:56 +08:00 via iPhone   ❤️ 1
    @qqpkat2 哪里说了是手动输入 cookie ??
    phobal
        73
    phobal  
       2020-02-09 15:18:06 +08:00   ❤️ 1
    做成浏览器插件,然后通过插件去取 cookie,还是存在人工操作的步骤,不够自动化,可以尝试使用 puppeteer 去做自动登录,登录成功以后将 cookie 拿到(有现成的 API ),再做后续的操作,这样做的好处有 2 点:

    1. 可以去除手动操作,全程自动化;
    2. 确保每次的 cookie 都是有效的。
    tikazyq
        74
    tikazyq  
    OP
       2020-02-09 17:58:40 +08:00 via iPhone
    @phobal 有些网站是有验证码的
    locoz
        75
    locoz  
       2020-02-09 18:23:22 +08:00 via Android
    @phobal #73 然后碰到了风控,卒。
    celeron533
        76
    celeron533  
       2020-02-09 22:38:35 +08:00
    标题有些误导。这不叫绕开验证码,只是一直在重用 cookies。早些年有的比价插件直接用用户的 cookies 来爬。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5433 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 08:44 · PVG 16:44 · LAX 01:44 · JFK 04:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.