隐私起见,本文不会提及任何具体的事例。如有提及,一定会强脱敏。或者说都是我编的,请当故事看。
反爬虫不能拆解
业界普遍认为, 拆解能力是一个 Leader 的必备技能。实际上这是个误解。Leader 真正的技能是化简,拆解只是化简的一种方式,就像多项式展开一样。但是有时候,合并同类项也是一种化简,砍分支也是化简,不一定非拆解。
不信我们拆解一下反爬虫试试。反爬虫从前到后,一共有如下步骤:获取请求,识别爬虫,过滤请求,处理请求,误伤检测。这几个步骤我们看下来,识别爬虫是最难的,那我们继续拆解。还能拆吗?拆不了了,识别不出就是识别不出,怎么拆解也识别不出。拆解只是把庞大的问题变成多个小问题各个击破,如果单个问题没什么复杂度但是难度极高,再拆解也没用。这个就像你证明一个数学难题,做不出就是做不出,再分治也没用。要注意难度和复杂度的区别。
下面我们逐个谈谈这些其余的难以拆解的反爬难题。
招聘问题
现在反爬虫与五六年前已经不一样了。现在反爬虫最大的困难是:招不到人。而招不到人的核心难点是:没候选人,以及 JD 不好写。
现在关注反爬虫的公司越来越多。一般一个公司打算做反爬虫的时候,其实已经晚了。这就相当于已经有小偷天天在你这里偷东西了,你才想起来要请个保安。
招聘工作通常由下列人员负责:技术负责人,HR。招人面临的第一个问题就是:JD 怎么写?通常其他方向的 JD,技术负责人可能随便写写就行了,实在懒得写,HR 去网上搜一个现成的也没问题。但是如果是反爬虫,问题就严重了,别人的 JD 不仅不好抄,甚至光是找到合适的 JD 就需要好长时间。有的公司管这个叫反爬虫,有的叫反抓取,还有反作弊,隐晦一点的安全策略,什么叫法都有,都不知道抄谁比较合适。这里为了避免歧义,我们本文统一叫做反爬虫。为什么 JD 会各不相同呢?这是因为各个公司面对的爬虫天生就不同,想要达到的目标也不同。而爬虫又在暗处, 其实你了解到的爬虫也只是冰山一角。
我们回到小偷的比喻,你家里被偷了,你说找个保安,然后面试问,你有抓小偷的经验吗?保安反问你一句:是怎样的小偷呢?这时候有多少业主能描述出来我遇到的是什么小偷呢?恐怕基本都不能,大部分业主的心态应该是:我要是知道是啥小偷我还找你干啥。不过这样的业主还好一点,毕竟不知道就说不知道,坦诚清晰,好办事。你不懂,那保安自己看着办,你只要最后东西没丢就行。最可怕的是业主早年也干过一点偷鸡摸狗的事情,大概还稍稍知道一点,虽然自己技术已经跟不上时代了,还要去试探保安的水平如何。
举个例子, 关于我所听到过的一次面试。隐私起见,用 A 和 B 替代。A 是面试官,B 是求职者。
A:请讲一讲你对反爬虫的理解。
B:我遇到的爬虫是这样的, 我是这样解决的。balabala
A:那如果是 xxx 的爬虫, 你如何处理?
B:(内心:还有这种弱智的爬虫,开什么玩笑),这种应该可以如何如何处理......
A:(内心:这人是个大忽悠吧,这么简单的爬虫他都没见过,而且给的这些方案我都用过了啊, 根本没用)
半小时后。
A:好的,今天就到这里了。再见。
面试结束后:
A:xx 猎头你太不专业了, 给我推荐这都什么破候选人,啥都不懂就知道忽悠。
B:xx 猎头你太不专业了,给我推荐这啥破公司,一顿套我方案套完就让我走了,浪费我时间。
猎头:???我要找个人吐槽,这都什么事。喂, xxx(就是我,日常知心大姐)问你个事...... (题外话, 之前这个猎头还碰到过一个读不懂的反爬虫 JD, 想有偿让我去面试一下看看他们到底要啥。结果我帮他分析了一圈,直接告诉他:这个 JD 抄错了)
以上的场景为什么会出现?我们打听了一下 A 和 B 的经历。
A 真的经历过爬虫,苦不堪言。他试着去找了一些网上的办法,读了几篇文章就试着自己动手。但是爬虫不断和他打游击,最终两个人达到了一个平衡,就是爬虫爬的也不爽,他防御的也不爽。他想找一个专业的人帮自己把这个事情搞定。然后他套用了自己的经验来检测对方水平如何,最终发现和他预期的差很大。预期差别大,在很多人眼里,等于技术不好。
B 也真的做过反爬虫,而且打的很艰辛,爬虫与他一起进化到了一个很强的水平。他去面试的时候听到 A 的描述,感觉这不就是好几年前的爬虫水平么,现在怎么可能有这么弱智的爬虫。于是就给了个简单的解决方案,大道至简,越简单的方案越不容易出错。但是 A 刚好试过这个方案,觉得这根本不行啊。
其实这在其他领域也很常见,面试官水平不足以考核面试者的时候,经常会误以为面试者不行。面试者已经进入看山还是山的境界了,面试官还停留在看山不是山的程度上时,就会误以为对面比自己低一层级。
而五六年前则不是这个样子, 那个时候谁也不懂, 也不会互相鄙视。
此外就是,有一个无解的问题:大部分做过反爬虫的人,不愿意再找相关的工作,而是选择转行去做别的。我所认识的五六年前做反爬的人,目前几乎没有从事相关行业的了。也就是高端人才几乎没有,低端人才遍地都是,这些人还成了面试官, 更锁住了人才的流动。
事实上,敢在简历里写反爬虫的,大部分是有两把刷子的。完全可以放进来试试,同时也内部培养,两条路一起走。
投毒的风险
五六年前投毒是无风险的, 现在则风险极高。
理想上我们希望天下爬虫都有相同的面孔,可以用通用方案来解决他们。实际上每个爬虫都不一样。他们有相同的撬锁技能(网络知识),面对不同的防御系统,学会了不同的翻墙方式(反反爬虫),因此要用不同的方式来处理他们。这一点来看,反爬虫不再像一个保安,而是更像一个:私家侦探。
为什么这么说呢?扪心自问想一下, 你们为什么害怕爬虫?
公司害怕爬虫有以下几个阶段:
- 公司小,没钱。爬虫一来, 服务器就挂了。(前文的 A)
- 公司有钱了,爬不挂。但是竞争对手拿了我的数据,就能比我做得好。(大部分大厂现状)
- 竞争对手拿了我的数据我也不怕,我有其他的护城河,他山寨不了我。但是我不爽。我想坑他,我要让他拿到我的数据之后,生意做的更差。这样可以把竞对消灭在萌芽中。(前文的 B)
大部分公司会止步于阶段 2,因为大部分公司还是白热化竞争阶段。成熟公司会有阶段 3 的困扰。这时候你会发现,爬虫和考试作弊没什么区别,别人抄你的卷子,就会比你分数高。那么你会如何坑害这些人呢?
- 有意把题目做错, 等对方交卷前, 迅速把题目全改了。这样对方拿的答案是错的, 老师批卷子拿的答案是对的。
- 举报给老师, 说有人作弊。
第一点就是常见的反爬虫投毒,让对方拿到假的数据。如果是真实用户来看,就给真实数据。这已经不是什么秘密了。这样做最大的风险是,由于误差的存在,总有一些普通用户会被误认为爬虫,拿到假数据。五六年前,这么做是没问题的,最差情况就是你价格没有优势,用户不下单。但是现在,你就要思考这样一个问题:如果用户投诉你大数据杀熟怎么办?
用户投诉大数据杀熟,通常不是拿到了什么实锤,只是感觉自己被杀了。假设你的反爬虫策略提高了价格,那么被误伤的用户就会来投诉。反之,你的策略如果是降低价格,那么没降价的用户就会来投诉。
我们可以看到无论怎么做都有人投诉,而你需要用大量的时间来处理这种问题。文字类信息投毒的麻烦之处则在于,不要不小心生成一些不和谐的言论,这个又很难控制。
没处理过大数据杀熟的反爬虫工程师,下手就会比较大胆。如果遇到的面试官是个对大数据杀熟非常敏感的业务方,他会觉得:这人是不是傻啊,他到底有没有做过反爬虫啊,这么搞还不把公司搞死啊。
反过来, 当这个面试官去求职的时候,他就会非常谨慎,任何事情都会和杀熟扯到一起。他的面试官可能反过来想:这个人是不是只知道忽悠啊, 这也不行那也不行的。
至于第二点, 告诉老师他作弊。这个就是法务问题, 我们稍后再讲。
爬虫的识别:引言
说了这么大一圈,终于到大家关心的地方了:我们如何识别爬虫?
我们平时很强调“用户视角”。反爬虫这个问题也是,我们需要关注一件事:爬虫是如何看待这个问题的?首先你要清楚一件事:你们的竞争对手是大公司还是小公司?或者说,你想针对谁?假设你的竞争对手是大公司。一般大公司是有专业爬虫团队的,虽然他们不太愿意承认。不信你出去问问,几乎每个公司都不承认自己有爬虫团队。但是讽刺的是,他们都会在招聘网站挂出爬虫工程师的招聘信息。他们招来这么多爬虫工程师难道是陪老板斗地主的吗?
大公司爬虫团队是用什么方式来考虑问题的呢?大公司最擅长的是拆解问题,把问题拆成子问题去解决。这样做副作用也非常明显,那就是响应速度变慢了,沟通成本大幅增加。所以你的对手如果能快速响应你的变化,你不要纠结对方为什么效率这么高。工作就像体育比赛一样,如果对方响应很快,只有一种可能:他预判了你的后续操作,提前做好了准备。
为什么会预判准呢?因为你的反爬虫措施可能是网上搜的。他只要人数比你多经验比你丰富,提前就可以搜好准备着。网上的反爬虫文章并不多,而且大部分做反爬的人都不愿意分享。毕竟欺骗技巧就像魔术一样,一旦戳破了,就毫无技术含量可言。
假设你的竞争对手是小公司, 那么参见下面社工部分。
由此可见,团队里最懂反爬虫的,往往反倒是爬虫团队。所以我一直建议,做反爬的团队,一定要和做爬虫的团队紧密结合。甚至,有可能的话,两个团队合并。这个操作私下做就行了,毕竟好多人是不承认自己有爬虫团队的。
爬虫的识别:规则引擎
反爬虫的做法有很多,但是实际上大部分就是做了个规则引擎。这个引擎的核心在于:高效, 复杂难懂(外部看起来),响应快,熔断迅速。
早年的 Web 时代,这个引擎其实就是个 Node.js 站点,Node.js 的 engine 可以生成动态的文本,以动态 JS 的形式注入到页面。JS 不但能做数据采集,还可以在服务端做校验,通过配置规则来实现动态变更。引擎做好之后,每天的任务就是不断变更策略,和爬虫斗智斗勇闹着玩。注意不一定非要把爬虫全封杀,这是一个非常严重的策略错误,全部封杀是风控的事情。
针对爬虫,如果你服务器顶得住,或者说加点机器就能顶得住,最好是引导着爬虫往自己想要的方向走。一个好的反爬系统不是没有爬虫来,而是想让爬虫怎么走, 爬虫就得怎么走,可以引导他,而不是拦截他。这个世界最可怕的不是难开的锁,而是没有终点的黑洞。
现在的 App 时代, 基本上所有的引擎都不再是 Node.js 了。因为前后端不再统一,Node.js 的优势荡然无存。加上国家对隐私的管控越来越严,App 反爬虫基本上也走向了死路。现在还能在 App 上做好反爬虫的,只能说你的对手太不给力了。或者你的对手出现了断层,稍稍成长起来一点的爬虫,就死了。
此外 App 时代大部分时间是在玩 mock,大部分反爬其实就是在 App 层在做 mock 和反 mock 和反反 mock。我的建议是,如果你们招不到反爬虫的人,你们试试招一下游戏行业做反外挂的人, 原理其实是一样的。而且这些人更加专业, 可能超出你的想象。
如果你是个技术负责人,你需要仔细思考一下:你对反爬虫的考核到底是什么?如果是拦截率,那这个指标太听天由命了,完全取决于有多少低水平爬虫来撞。线上指标全线不可信的情况下,你们有线下的考核方式和校验方式吗?线下校验通常不用技术手段,意味着大量的人力成本。但是这个是必须要出的。
变换赛道的爬虫道路
很多人并不清楚,爬虫工程师也很苦逼。我很了解爬虫的苦。不要问我为什么,问就是我有个朋友......
爬虫并不想大家想的那样,你设置了反爬,他拼命来破解。就像古装剧打仗一样,你固守城池,他攻城。现实没那么枯燥。爬虫工程师的智力也是有天花板的,他们也不想做太多的处理,他们只想完成老板的任务,拿年终奖。
因此他们遇到爬不下来的站点, 通常不是死磕, 而是考虑下面几条道路:
- 换个地址是不是好一点?
- 换个平台呢?
- 我换个设备?
- 要不...... 试试社工?
没有人是只考虑技术的,爬虫工程师也是人。做反爬一定要时刻记住一点:你的竞争对手是人,不是机器。
换个地址
这个做法是针对大公司的,因为小公司就一个站点,换不换地址都一样。但是对于大公司就不一样了。各位大公司的研发,你们仔细想想,换个 url,是不是因为 slb 的原因,有可能直接换个部门?他们有没有可能没接反爬?版本有没有可能过老?有没有可能一些细致的地方忘记了防范?如果他们没接,你去推动他们接,需要过多少人审批,排队多久 pk 优先级?此外,万一他们做了改版,比如框架升级,会不会因为反爬系统的兼容性问题临时下掉了反爬, 然后,升级完了,庆功会一开,就没人记得反爬了?
此外就是,即使接了反爬,也可能接的不彻底。举个例子,一个商品有四个供应商,提供了四个价格,你都做了提价,提价概率 session 内随机。假设某次针对一个请求提了 12%,那么,会不会某个页面的底价字段忘记反爬了?如果没做,是不是取个最低价和底价做下比较就可以直接拿到提价比例?那还绕什么反爬,直接往爬虫策略上撞呗,直接声称:我就是爬虫,快给我假数据。撞上去之后先计算提价比例再反算真实价格不就行了?这样还能让对方的数据好看不少,这么多请求都中了我的策略,被我欺骗了。回头他还能升职加薪,你也获得了数据。这个也回到了刚才的问题:有很多爬虫被拦截,是不是意味着策略有效?
有人会说:底价忘记反爬这个太低级了,很容易发现。那么,线上那么多字段,究竟有几个字段忘记做反爬了,有人能说得清吗?如果说不清,你考虑这样一个问题,假设有 n 个字段没做反爬,那么是不是有可能通过解方程直接解出其余字段的真实值?这个其实很像数独,有可能莫名其妙就出来一个无需破解反爬直接解出真实字段的方法,而这种方法在被发现前,大家都认为它不存在。
所以如果你觉得整体做反爬比较困难,或者说你觉得自己没这个实力,不妨考虑这样一种玩法:页面上的字段随机做反爬,每次都不一样。在爬虫眼里,每个字段都是不可信的,也不敢列方程来解。示弱也是一个重要的策略。
换个平台
这个主要针对 PC 转 Mobile 时代的事情。当时的 PC 站一般是一群老程序员在弄,有严密的反爬措施。而 Mobile Web 则一般是一群年轻人,也不管那么多,干了再说,产品等着上线呢。这个时候据我所知,大部分爬虫都会选择放弃 PC,直接来 Mobile Web 爬,爽的不得了。哦你说 PC 站没爬虫了会不会引起怀疑?你这个问题就问的太单纯了,你有意去爬一爬 PC,让他们有点业绩不就好了?回头他们还可以述职和老板吹牛逼说自己拦截了多少爬虫,你自己在 Mobile Web 闷声发大财,双赢不好吗?
所以这里也有个题外话:你对反爬虫工程师的考核方式正确吗?是不是抓的小偷越多越好?当然 Mobile Web 的时代过去了,小程序的风口也过的差不多了,但是还有新的平台诞生。是不是现在有个新平台,叫无障碍?这个平台,做反爬了吗?由于微服务和 GraphQL 盛行,换个平台很可能没有接反爬。其实戳破之后,技术上就很简单了。就怕想不到。这就是反爬最可怕的一点。从这一点来说,反爬和魔术其实差不多。相信很多爬虫工程师会非常认可这一比喻。
换个设备
随着 App 爬虫的兴起,Web 爬虫越来越不吃香了。App 一般走二进制的接口,不走 HTTP 了,旧的反爬策略很难迁移过来。而且由于 App 升级比 Web 要慢很多,所以做反爬,几乎是一个不能完成的任务了。这时候大家都把目光放在了设备信息上。但是国家对隐私保护力度的加强,让众多反爬工程师也头疼不已,很多硬件信息慢慢的拿不到了。各种指纹都被大数据给模拟的差不多了。我觉得你们是不是可以反过来考虑一下,为什么一定要识别出爬虫呢?只要爬虫拿不到正确的数据不就好了吗?完全可以正确的错误的数据都下发,客户端只使用正确的呀,或者加密下发两个错的,但是其中一个错的可以刚好可以通过别的办法计算成正确的,甚至大部分时候都是对的某个请求忽然不对了。至于如何欺骗爬虫去使用错误的数据,就是你们斗智斗勇的小技巧了。可以交给时间,交给空间,甚至交给间谍,甚至你可以写个博客教他怎么拿错误的数据(真实案例不开玩笑)。
社工
社工小技巧其实非常有意思,而且所有的社工,说穿了都会感觉很没技术含量。我举两个小例子。第一个,一个小公司的爬虫工程师莫名其妙离职了。接手的人感觉很奇怪,一直感觉这个人干的挺爽的啊,咋忽然走了呢。调试了下代码,发现对方反爬虫站点对他进行了灵魂拷问:你都调试到这了,你知道你现在的水平,如果去做前端能拿到多少钱的工资吗?我给你个行情价。请问你做爬虫工程师,能拿到这个价格吗?
接手人大骂:杀人诛心啊。
第二个,某小公司的爬虫工程师,常年破解一个站点,然后写博客说自己怎么破解的。下面的评论人员说:大神大神,你就是我们的救星。快更新。然后他每次只要有点进展就写出来。然后很快就被封了。他也很奇怪:对方怎么反应这么快呢。其实,人家一直在看他博客呢。甚至还催更。至于第一次怎么找到这个博客的?很简单,反爬工程师在代码里留了一句挑衅的话,然后他看到之后非常不爽,直接写了个博客吐槽,说就这,还挑衅呢。然后不到一周,对方就通过搜索引擎找这句话找到了他的博客。不止如此,他们还催更,只要一有爬虫就催更,他赶紧更新。
第三个是关于爬虫的,就是假装尿急骗取竞对保安的同情进去厕所扫描人家 WiFi 的 SSID 扩充白名单这种羞于启齿的事情...... 当然其实你也可以用正常方法拿到,毕竟你的竞对总有人使用你的产品......
机器学习
随着机器学习的横行,很多反爬措施慢慢开始迁移到自动化反爬上了,人工反爬越来越少。就如同军事器械的发展,自动化的东西越来越多,人工的东西越来越被轻视。但是决定战争胜负的,永远是人,而不是装备。至少截止目前为止,机器学习还是很好欺骗的。比如在某站刷视频,经常看到广告:96 年的妹子想认识你一下。你很烦这个广告,又不知道怎么关掉。你搜一下 Gay,多看几个视频,很快广告就消失了。简单粗暴,毫无技术含量。
反爬也是,大家都用各种样本来训练,指望他识别出爬虫。但是你考虑一下,你训练的数据集,真的纯洁吗?里面有没有爬虫掺杂在里面?如果竞对爬虫的量大,理论上可以把自己训练成正常用户,到时候这个模型可能拦别人没问题,但是拦竞对爬虫就无能为力。这是大家想要的吗?有人说,我可以使用一些规则来清洗流量,那么奇怪了,你都知道规则了干嘛不在线上直接用来拦截呢?
SEO
关于 SEO 误伤,是很多反爬工程师绕不过的一道坎。事实上 SEO 流量非常好检测,只需要针对 IP 来源进行 rDNS 检测即可。针对 SEO 流量,引导到专门的集群,不但能避免误伤 SEO,还能提升抓取性能,不影响业务集群。但是,一定要注意发布更新,避免被搜索引擎认为页面不一致,被判定为 SEO 作弊降权。一旦发生,很难挽回。此外检测时不要信任 UA 等可信度低的字段,避免爬虫把自己伪造成 SEO。
因此,如果你有 Web 反爬,你仔细想想,自己的 SEO 受到伤害了吗?一般反爬工程师的汇报里不会提及任何 SEO 相关的东西, 也许他们知道自己伤害了 SEO。
法务问题
我并非法律专业人士,只是和法务经常打交道。根据我所掌握的知识,早年爬虫很难定罪,而最近爬虫主要有以下三种可能的罪名:
- 破坏计算机安全罪
- 版权法
- 用户隐私
第一个,主要针对的就是,你有反爬虫措施,对方破解了你的措施,继续爬取,那么就违法了。但是根据法务规定,谁主张谁举证。你如果觉得有人破解了你,你需要提交相关证据。很遗憾,这个证据非常难提交。技术上这个没有难度,你可以证明自己有反爬措施,哪怕很渣,很容易破解,但只要有这个措施在,对方绕过你的措施就算破坏。但是你的 log,很难能被法务承认。因此虽然爬虫团队遍天下,但是真正被起诉的很少,主要也在此。
第二个,主要指的就是,有些数据是受版权保护的,哪怕你没有破解计算机,你是人肉抓的,比如你雇了 200 多个实习生一个一个拷贝下来的,也是可以走法务流程的。
第三个,就是抓取的信息是用户隐私。这个比较敏感,不谈。不过这里存在一个陷阱问题:假设对方有意给你一批用户隐私数据,怎么办?当然这个问题极具争议因此不敢展开。
合一起我们可以得出一个推论,所有的违法都不发生在“爬”本身,而是发生在获取过程和数据用途上。更直白一点就是,开锁不犯法,撬锁犯法,拿东西犯法。这就是大家经常说的技术无罪论,工具无罪论。我们不可能认定爬这个动作违法。否则,假设爬取这个动作是违法的,那么 Nginx 算不算爬?不能算吧,不然天下公司都违法了。但如果明确说明了不算,那你信不信明天就会出来一个基于 Nginx 的爬虫框架?
关于内卷
我在写这个文章的时候,有人劝我,你别写,本来这个行业就很卷了,你再把各种小技巧公布出去, 大家不是更卷了吗?我觉得他说的很有道理。
所以在我不做反爬之后,我就开始写文章。反正卷的不是我自己。
但是说真的,隐藏欺骗方式不公布,就能让欺骗变得更少吗?我觉得不能。恰恰相反,大家都知道如何做欺骗了,才能真正做到天下无贼。每个人都知道如何反欺诈,才会真正没有欺诈。爬虫能让公司变得更强大吗?其实并不能,大部分公司的护城河根本不是数据,而价格劣势也没有大家想的那么有用。公司的护城河永远是用户本身。用户开心,就留下。不开心,再便宜也会走。老老实实做生意,以客户为中心,而不是使用各种小技巧占客户的小便宜。这才是能长久经营下去的诀窍。
爬虫反爬虫,不过是企业之间的内卷罢了。这并没有创造任何收益。也不可能创造什么收益。永远是个零和博弈。
考虑到反爬虫这个话题的敏感性, 我再强调一次, 上面的所有例子,都是我编的。就是给大家看个乐子。
作者简介:
DS Hunter。前知名企业反爬虫工程师,研发总监,深耕反爬虫技术多年。现某大厂业务线前端负责人。