举个例子,这个世界存在3家公司,售卖相同的电商产品。三家公司的名字分别是A,B,C。
这个时候,客户去A公司查询了下某商品的价格,看了下发现价格不好。于是他不打算买了。他对整个行业的订单贡献为0。
然而A公司的后台会检测到,我们有个客户流失了,原因是他来查询了一个商品,这个商品我们的价格不好。没关系,我去爬爬别人试试。
于是他分别爬取了B公司和C公司。
B公司的后台检测到有人来查询价格,但是呢,最终没有下单。他会认为,嗯,我们流失了一个客户。怎么办呢?
我可以爬爬看,别人什么价格。于是他爬取了A和C。
C公司的后台检测到有人来查询价格。。。。。
过了一段时间,三家公司的服务器分别报警,访问量过高。三家公司的CTO也很纳闷,没有生成任何订单啊,怎么访问量这么高? 一定是其他两家禽兽写的爬虫没有限制好频率。妈的,老子要报仇。于是分别做反爬虫,不让对方抓自己的数据。然后进一步强化自己的爬虫团队抓别人的数据。一定要做到:宁叫我抓天下人,休叫天下人抓我。
然后,做反爬虫的就要加班天天研究如何拦截爬虫。做爬虫的被拦截了,就要天天研究如何破解反爬虫策略。大家就这么把资源全都浪费在没用的地方了。直到大家合并了,才会心平气和的坐下来谈谈,都少抓点。
最近国内的公司有大量的合并,我猜这种“心平气和”应该不少吧?
二、爬虫反爬虫技术现状
下面我们谈谈,爬虫和反爬虫分别都是怎么做的。
1、为python平反
首先是爬虫。爬虫教程你到处都可以搜的到,大部分是python写的。我曾经在一篇文章提到过:用python写的爬虫是最薄弱的,因为天生并不适合破解反爬虫逻辑,因为反爬虫都是用javascript来处理。然而慢慢的,我发现这个理解有点问题(当然我如果说我当时是出于工作需要而有意黑python你们信吗。。。)。
Python的确不适合写反爬虫逻辑,但是python是一门胶水语言,他适合捆绑任何一种框架。而反爬虫策略经常会变化的翻天覆地,需要对代码进行大刀阔斧的重构,甚至重写。这种情况下,python不失为一种合适的解决方案。
举个例子,你之前是用selenium爬取对方的站点,后来你发现自己被封了,而且封锁方式十分隐蔽,完全搞不清到底是如何封的,你会怎么办?你会跟踪selenium的源码来找到出错的地方吗?
你不会。你只会换个框架,用另一种方式来爬取。然后你就把两个框架都浅尝辄止地用了下,一个都没有深入研究过。因为没等你研究好,也许人家又换方式了。你不得不再找个框架来爬取。毕竟,老板等着明天早上开会要数据呢。老板一般都是早上八九点开会,所以你七点之前必须搞定。等你厌倦了,打算换个工作的时候,简历上又只能写“了解n个框架的使用”,仅此而已。
这就是爬虫工程师的宿命,爬虫工程师比外包还可怜。外包虽然不容易积累技术,但是好歹有正常上下班时间,爬虫工程师连这个权利都没有。
然而反爬虫工程师就不可怜了吗?也不是的。反爬虫有个天生的死穴,就是:误伤率。
2、无法绕开的误伤率
我们首先谈谈,面对对方的爬虫,你的第一反应是什么?
如果限定时间的话,大部分人给我的答案都是:封杀对方的IP。
然而,问题就出在,IP不是每人一个的。大的公司有出口IP,ISP有的时候会劫持流量让你们走代理,有的人天生喜欢挂代理,有的人为了翻墙24小时挂vpn,最坑的是,现在是移动互联网时代,你如果封了一个IP?不好意思,这是中国联通的4G网络,5分钟之前还是别人,5分钟之后就换人了哦!
因此,封IP的误伤指数最高。并且,效果又是最差的。因为现在即使是最菜的新手,也知道用代理池了。你们可以去淘宝看下,几十万的代理价值多少钱。我们就不谈到处都有的免费代理了。
也有人说:我可以扫描对方端口,如果开放了代理端口,那就意味着是个代理,我就可以封杀了呀。
事实是残酷的。我曾经封杀过一个IP,因为他开放了一个代理端口,而且是个很小众的代理端口。不出一天就有人来报事件,说我们一个分公司被拦截了。我一查IP,还真是我封的IP。我就很郁闷地问他们IT,开这个端口干什么?他说做邮件服务器啊。我说为啥要用这么奇怪的端口?他说,这不是怕别人猜出来么?我就随便取了个。