引言
我写爬虫也有几年了,大大小小的文章看了也有很多,但是我发现,很多的文章都是侧重于具体技术的,比如怎么才能去绕过验证码,怎么换ip池子之类。但是很少有文章写爬虫背后深层次的思想。今天就想要来简单探讨一下,当然,为了防止一些人看不懂,我会列举具体例子说清楚。
声明
因为外界普遍对爬虫的误区(爬虫会进监狱之类),本人讲述的这些思想只能用于技术交流,不要用于任何的违法犯罪目的!本人不承担任何责任!
核心思想1 - 不要硬拼,顺着来!
这条可以说,是最重要的一条爬虫思想了!可以说,从网页端js分析的时候远程rpc调用,到拿无头浏览器绕过验证的使用,都在体现这一条思想!
举个例子来说吧,就好比,有个机密的地方,它只允许女生进去,但是你是男生,想从里面拿东西,怎么办?自己女装吗?实际上你女装的再厉害,也肯定会被发现一些端倪,比如声音啊,身高啊,骨架啊之类的,即使你有能力把这些都消除了,也很容易在一些细枝末节的地方暴露你的男生身份!
这时候,要采取的核心办法就是,既然你必须女生进去,那我就直接找一个真正的女生进去,但是,我进去之前,告诉女生我要拿的东西是什么,让女生进去以后给我拿出来,这样,你再怎么检测,也是完全合法的女生,因为这就是女生!但是我那东西的目的却拿到了。
写爬虫的时候也是一样的道理,比如有的网站,检测你浏览器环境,看你浏览器不对劲就不给你看,那我直接,拿一个真正浏览器看,但是我偷偷远程操控它,让它记录下来所有内容,就可以完成爬取。
同样,有的网站,用复杂加密来阻挡你的爬虫,但是,为什么要死磕这些函数?你反正都知道他们在哪里了,直接远程给python调用不就好了?
这条思想,核心意义就是,面对很多网站的限制,不要硬拼,应该顺应它们的限制,在允许限制的情况下,用合适的手段带上自己的目的,就可以完成爬取了。
核心思想2 - 细节决定你的成败!
这条思想,同样也很重要,如果说第一条是说的基础,那第二条就是很多人爬虫被发现的陷阱。
很多的新人都会犯这种错误,就是,网站的请求,只要改UA头,就可以爬取,那我请求就带上一个UA头,其他的我一律不拿。实际上这种做法很危险,尤其是你请求量很大的时候,如果网站管理员查看日志,发现有很多的ip,都是只有UA的请求,他肯定会觉得,这十分有十五分不对!因为一个正常浏览器,发送请求的时候,除了UA头,还会带上一些其他的头,比如Cookie啊之类的。
再列举一个具体例子就是,你上课偷偷吃零食,结果别人都是一小口吃进去,就你是当着老师面一大口吞进去嚼,那肯定老师会发现你的。
这里说的细节至少包括下面几个方面:
细节1 请求内容和请求头的细微参数差别
对于http协议来说,一般请求会包含一些看上去很冷门,毫无意义的请求头和请求内容,这时候,为了能够尽量像真实请求,你千万不要忘记加上这些参数!因为正常的浏览器,也是有这些参数的,如果不能尽量地模拟真实浏览器请求,就很很容易被发现!
细节2 单个ip或者设备的请求频率差别
这个就更好理解了,一个ip或者设备,一秒里面请求了1145141919810次某个接口,这一看就是十分有十五分不对!所以一定要控制好自己的单个ip或者设备的并发,最好设置成随机延时,加上5到8的并发,这样才能均衡好爬取效率和安全性。
细节3 行为上的差别
这个一般适用于那些风控极其严格的网站,这些网站往往引入了基于机器学习的风控引擎,用来智能地分类出爬虫用户。针对这种网站,除了上面说的那两条,还要注意一些更加细致入微的行为细节,比如,两次关键请求的顺序,是否请求了css和js资源(大多数爬虫不会请求这些无用资源),是否是高风险ip(比如某些多人共用的代理),是不是疑似大量遍历(比如大量地从目录里面抓取关键图片),是不是频繁登录退出(尤其你要用好几个账户的时候),是不是每次请求都会频繁更换ip(这一秒在美国,下一秒又到了德国)。针对这些网站,往往需要你仔细观察,先拿一部分账户探测出它们的风控逻辑,在探测成功以后,才能够接着针对性地修改爬取逻辑,拿到自己想要的数据。
核心思想3 - 融入群体,不要成为特类!
这一条非常重要!可以说,很多小白都会栽在这里!因为很多人有一个非常错误的想法,就是认为,只要我每次请求的时候,都让设备参数随机(比如每次都随机UA头),让ip随机(比如这一秒在日本,下一秒跑到美国,你是在坐火箭吗?),就可以不被发现,实际上这种想法
大错特错!!!
因为很多时候,你随机成为了特类,反而会让你更加容易被发现!这就好像,大街上别人都是黑色衬衫加白色裤子,就你穿个五颜六色的衣服,花里胡哨地走大街上,那肯定会第一时间注意到你!
所以,真正的策略是,每次都是固定参数,同一个ip或者地理相近的ip,但是我通过多个不同的设备组成池子,同时进行爬取,这才是正解!
尾声
写完这篇博文,我知道还有一部分缺失的内容,但是后面缺少的内容,想到哪里再往上补充吧。