反爬虫正传
2016-08-22 22:23
134 查看
大概一年前, 在招聘网站搜“爬虫”, 会发现有很多职位。 而搜索反爬虫, 职位为0。 最近有所进步, 我更新了下简历, 只加了“反爬虫”三个字, 结果意外的就有HR发私信询问了。 虽然暂时没有更换工作的计划, 但是这一现象说明了一个事情:反爬虫开始受到业界的重视了。 这是个好事情——当然你要是说HR误以为是反爬虫与爬虫是一个意思。。。 那好像也说得过去。。。。。。毕竟有些人还以为java和javascript是一个东西呢。
之前在公司组织的斗鱼直播上讲了一次反爬虫topic, 反响很强烈, 但是我发现个事情, 那就是反响相当的两极分化。 大概有如下两种人:
1 表示非常有收获。
2 表示这也值得讲?
而且两类人群都很庞大。 我觉得这充分说明了反爬虫是个极具争议的话题, 当然我也承认当时讲的十分浅显。 其实理由也很简单啊, 这个属于敏感话题, 领导要审核, 什么都讲你还想不想干了?
回过头我反思了下, 如何讲出点有用的东西, 又不涉嫌泄密。 后来我看了很多其他人的文章, 我恍然大悟:其实只要说一些大而空的纯理论知识就可以了吗, 每天看博客园首页一堆热门文章, 都是“虽然不懂但是看起来好像很厉害的样子”, 这就很值得学习吗。 所以我觉得可以试着自己写一些擦边知识, 在不泄露任何机密的情况下让大家了解下反爬虫这个比爬虫更灰色的地带。 如果有人对这个领域感兴趣, 也很希望你联系我, 也许我们刚好缺工程师呢?
当然也有可能写了一堆, 依然有人留言:这也忒简单了, 也值得写? 那我就毫无办法了。 也许您实在是太高大上了, 我们无法企及。
我只希望这篇文章(也许是系列, 也许就这一篇了。。。)能对一些人有用。。。
当然这是入门级文章, 你不要指望我上来就给你讲canvas指纹。。。(事实上高级技巧在实战中的用武之地也不是很大)
至少能对dudu有用我就心满意足了。 博客园其实也深受爬虫之苦。。。。 你们这群技术宅都干了什么丧心病狂的事情啊魂淡~
===============================================================================
要了解反爬虫首先要知道什么是爬虫。 所谓爬虫, 有的时候被称为spider, 有的时候也被称为robot, 这两个词汇分别表达了它的两个特征: 网状, 自动。 spider本意是蜘蛛, 爬虫爬去到一个网站后会根据网站已有的链接, 递归爬取下去。 robot是机器人, 是指爬虫永不休息, 可以一直工作下去。因此, 如果你的程序不能批量获取对方网站的信息, 那是不可以称为爬虫的。
很多时候我们是不欢迎这种访问的, 具体理由可能有多种多样, 但是既然你关心了反爬虫, 就说明你不欢迎爬虫, 我可以不关心理由是什么, 现在你的问题应该就是:如何拦截爬虫?
拦截爬虫的等价问题是:如何识别爬虫?因为如果无法识别爬虫, 拦截无从谈起。
刚开始做反爬虫的时候, 我们是焦头烂额, 完全没有方向。 在网上搜反爬虫, 只能搜到如何通过IP访问量来检测爬虫, 而我们用IP访问量排了下序, 封一个错一个, 全是正常用户。 可见这是多么不靠谱。
后来我请教了我老婆。 额, 我老婆不是程序员, 她是会计。 我问:你们会计是如何分辨假币的?
我以为我或获得一大堆假币与真币的不同点, 并有一丁点的概率从中获取一些经验。 没想到她只是不屑地说了句:
“摸一下就知道了”。
我当时对这个答案是非常的无语啊, 这相当于说:怎么知道一个请求是不是爬虫? 检测一下就知道了啊。 这种答案毫无用处啊!
我耐着性子继续问:那到底怎么样的感觉是假的呢?
她想了下, 说:这个不好说。 唯一可以告诉你的就是:假币和真币一定是有区别的。 真币都是一样的, 假币各有各的不同。
这句话忽然让我有一种柯南顿悟的那种感觉。。。那个画面大家都熟悉吧? 就是屏幕一闪, 柯南说啊我知道了, 剩下的就只是找证据了。
爬虫与正常用户有什么不同? 爬虫一定与正常用户不一样, 至于哪里不一样,你得去找(后来我在别的地方看到有人总结的爬虫经验, 说爬虫就是个cosplay。 下面其他人并没有当回事, 但是我看起来忽然感觉很触动, 心想这才是真正懂行的啊)。
然而这句话目前对于我们来说虽然无比正确, 却依然只是一句废话。 问题在于如何寻找不同点?
===============================================================================
以上是干货
===============================================================================
以下开始吹牛
===============================================================================
你看, 你好不容易读到这里, 忽然发现我什么都没说, 是不是觉得很郁闷?
别急, 也许以下的吹牛对你才真的有用。
为什么?
首先你要想一个问题:你为什么要做反爬虫?
如果你还没开始做反爬虫, 只是要做, 那么这个问题非常重要。 也许你只是受领导委托, 要解决爬虫问题(实际上这是大部分反爬虫工程师的需求)。
然后你可能会请求一些爬虫工程师, 询问下他们平时是如何爬的, 并期望得到一些反抗的手段。
然而技术人员都是狂妄的, 你得到的答案多半是:切, 不管你怎么做, 其实我都是爬的到的。
这个就忽然变的很没意思了。 实际上他这句话在理论上是完全正确的, 因为有一种爬虫叫人肉爬虫:
“在贫困山区开个公司, 给他们一部电脑或手机, 让他们访问页面, 把内容填写到自己开发的网站上,并给予适当的报酬”
这种爬虫是不可能被防住的。
当然这种情况过于极端了。
比如上次的直播, 有人直接就问我, phantomjs如何防?
首先这个问题的答案我是不会告诉你的! 这个泄密已经不是一星半点了, 基本要泄光了。
其次, 你知道phantomjs在现实世界所占的比例吗?
最后, phantomjs的效率问题你自己应该比我更清楚。
综合以上三点, 这个问题就不应该提出来呀。。。。。
正常的对话应该是这样的:
“xx桑, 请问如果对方用python模拟http请求我们应该如何处理?”
“xx桑, 请问如果他包含所有的http信息呢?”
“xx桑, 那如果他知道如何运行js呢?”
“xx桑, 那如果。。。”
这才是正常的对话模式啊。
好了在不泄密的情况下, 我首先出几道题目:
1 请问这个字符串是什么:
“Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9”
答案:这是一个user-agent, 并且是lynx浏览器。 lynx是一个奇葩浏览器, 正常用户是不会用他访问你的站点的, 就算访问了也不会买你东西的, 你只管封了它好了, 不会对你业务产生任何影响, 也不会有人投诉。
2 请问你觉得这个user-agent出现在你的访问日志里的数量应该是多少?
答案:出乎你的想象, 这个UA非常多。 在极端情况下它甚至可以在ua排行榜里进入前十名甚至前五名。
3 请问为什么这么多爬虫喜欢用这个UA?
答案:用你喜欢的搜索引擎搜索下这个UA, 你看看你会得到什么知识?你是不是以为会得到lynx的介绍, 或者再不济也是一些毫无意义的访问统计?
其实答案是: 你会得到好几页的python爬虫教程。
现在自己动手搜一下试试吧。
这就是爬虫界的现状: 80%以上的爬虫是十分低级的爬虫。
当然了, 随着你慢慢的加大反爬虫力度, 这种低级爬虫会越来越少。 我们称之为:进化。
爬虫是会进化的, 正常程序员是不会在工作正常的情况下加班的。 但是如果抓不到数据, 老板就会骂他, 他就会加班。
咦, 上面这句话是不是透露了什么关键的信息?
===============================================================================
回到开头:
>>至少能对dudu有用我就心满意足了
那么, 请问如何帮到dudu进行反爬虫呢?
我们看下博客园的文章是如何加载的:
请求url, 直接得到html文件。 其中包含文章内容。
这就奇怪了, 为什么dudu会让你如此轻易的得到文章内容?如果改为ajax加载, 那么至少要耗费一步, 拉完页面拉ajax才行(虽然依然没有任何卵用, 不过至少恶心了一点)
因为SEO啊!你写的文章为什么在博客园发表完很快就能在百度搜的到? 因为博客园的权重啊!为了让大家能够更快的出名, 博客园简直就是在爬虫面前裸奔啊!
因此, 你还好意思问phantomjs怎么爬博客园么?用phantomjs爬, 简直是作死好不好?一个urllib2就搞定的事情!
此外吐槽一下:博客园是有api的, 可以直接获取内容。 然而, dudu和我吐槽过, 大家依然还是喜欢爬。。。。
1 封IP
这一点虽然很二, 但是非常有效。
2 封代理IP
有些人问:为什么我使用了代理服务器, 却一下子就被认出来了?呵呵, 你知道那是代理服务器, 难道对方就不知道吗?
3 封奇葩的UA
连Mozila开头都不知道, 这种爬虫还能留?额, 你是不是觉得爬虫不会这么缺心眼?如果是的话, 怎么会有那么多的lynx?
此外有个理论:user-agent的最小长度为xx字节。 至于xx是多少。。。 select一下自己看看吧。
补充:搜索引擎的ua不符合这一条。 但是搜索引擎的IP是固定的。
4 封accept-encoding里不包括gzip的。
为什么有些爬虫的accept-encoding里会不包括gzip? 说起来这个事情非常可笑。 我们自己写了个爬虫才知道。 如果不写这个头, 服务器会返回未压缩的文本可以直接分析。 如果加了, 服务器会返回压缩后的。 因此你要多写点代码来做gzip解压缩。 虽然这个代码很简单但是有些人真的是懒!到!极!致!了!由于目前的服务器其实都支持不压缩的请求方式, 因此他们就会选择用这个来投机取巧。
5 经常改dom结构。
不解释。 玩死那些懒到用正则的大懒虫。 甚至无需更改dom结构, 多加点注释影响正则都可以。 你可以猜猜对方会如何写正则, 然后精心构造一个会让他跑错的。
以上办法均十分简单易行, 并且不会伤害SEO。 并且使用了之后, 爬虫量会大大减小。
如果使用了之后没有减小。。。。。
那说明你们面对的爬虫高于业界平均新手水平。
===============================================================================
参考资料
===============================================================================
骗你的, 这种破文章还要什么参考资料
1 人工打码的话, 一条验证码1到2分钱。
2 买IP的话, 几十块钱可以买到几十万, 当然IP质量一般。
3 想运行javascript的, 只需要用nodejs即可, 无需动用phantomjs这么高级的玩意。
4 canvas指纹的冲突率比你想象的要高
5 你写的十分复杂的javascript, 并不一定有人看。
6 jsFuck不支持IE
7 永远不存在爬不到的信息, 只是成本高低的问题
之前在公司组织的斗鱼直播上讲了一次反爬虫topic, 反响很强烈, 但是我发现个事情, 那就是反响相当的两极分化。 大概有如下两种人:
1 表示非常有收获。
2 表示这也值得讲?
而且两类人群都很庞大。 我觉得这充分说明了反爬虫是个极具争议的话题, 当然我也承认当时讲的十分浅显。 其实理由也很简单啊, 这个属于敏感话题, 领导要审核, 什么都讲你还想不想干了?
回过头我反思了下, 如何讲出点有用的东西, 又不涉嫌泄密。 后来我看了很多其他人的文章, 我恍然大悟:其实只要说一些大而空的纯理论知识就可以了吗, 每天看博客园首页一堆热门文章, 都是“虽然不懂但是看起来好像很厉害的样子”, 这就很值得学习吗。 所以我觉得可以试着自己写一些擦边知识, 在不泄露任何机密的情况下让大家了解下反爬虫这个比爬虫更灰色的地带。 如果有人对这个领域感兴趣, 也很希望你联系我, 也许我们刚好缺工程师呢?
当然也有可能写了一堆, 依然有人留言:这也忒简单了, 也值得写? 那我就毫无办法了。 也许您实在是太高大上了, 我们无法企及。
我只希望这篇文章(也许是系列, 也许就这一篇了。。。)能对一些人有用。。。
当然这是入门级文章, 你不要指望我上来就给你讲canvas指纹。。。(事实上高级技巧在实战中的用武之地也不是很大)
至少能对dudu有用我就心满意足了。 博客园其实也深受爬虫之苦。。。。 你们这群技术宅都干了什么丧心病狂的事情啊魂淡~
===============================================================================
要了解反爬虫首先要知道什么是爬虫。 所谓爬虫, 有的时候被称为spider, 有的时候也被称为robot, 这两个词汇分别表达了它的两个特征: 网状, 自动。 spider本意是蜘蛛, 爬虫爬去到一个网站后会根据网站已有的链接, 递归爬取下去。 robot是机器人, 是指爬虫永不休息, 可以一直工作下去。因此, 如果你的程序不能批量获取对方网站的信息, 那是不可以称为爬虫的。
很多时候我们是不欢迎这种访问的, 具体理由可能有多种多样, 但是既然你关心了反爬虫, 就说明你不欢迎爬虫, 我可以不关心理由是什么, 现在你的问题应该就是:如何拦截爬虫?
拦截爬虫的等价问题是:如何识别爬虫?因为如果无法识别爬虫, 拦截无从谈起。
刚开始做反爬虫的时候, 我们是焦头烂额, 完全没有方向。 在网上搜反爬虫, 只能搜到如何通过IP访问量来检测爬虫, 而我们用IP访问量排了下序, 封一个错一个, 全是正常用户。 可见这是多么不靠谱。
后来我请教了我老婆。 额, 我老婆不是程序员, 她是会计。 我问:你们会计是如何分辨假币的?
我以为我或获得一大堆假币与真币的不同点, 并有一丁点的概率从中获取一些经验。 没想到她只是不屑地说了句:
“摸一下就知道了”。
我当时对这个答案是非常的无语啊, 这相当于说:怎么知道一个请求是不是爬虫? 检测一下就知道了啊。 这种答案毫无用处啊!
我耐着性子继续问:那到底怎么样的感觉是假的呢?
她想了下, 说:这个不好说。 唯一可以告诉你的就是:假币和真币一定是有区别的。 真币都是一样的, 假币各有各的不同。
这句话忽然让我有一种柯南顿悟的那种感觉。。。那个画面大家都熟悉吧? 就是屏幕一闪, 柯南说啊我知道了, 剩下的就只是找证据了。
爬虫与正常用户有什么不同? 爬虫一定与正常用户不一样, 至于哪里不一样,你得去找(后来我在别的地方看到有人总结的爬虫经验, 说爬虫就是个cosplay。 下面其他人并没有当回事, 但是我看起来忽然感觉很触动, 心想这才是真正懂行的啊)。
然而这句话目前对于我们来说虽然无比正确, 却依然只是一句废话。 问题在于如何寻找不同点?
===============================================================================
以上是干货
===============================================================================
以下开始吹牛
===============================================================================
你看, 你好不容易读到这里, 忽然发现我什么都没说, 是不是觉得很郁闷?
别急, 也许以下的吹牛对你才真的有用。
为什么?
首先你要想一个问题:你为什么要做反爬虫?
如果你还没开始做反爬虫, 只是要做, 那么这个问题非常重要。 也许你只是受领导委托, 要解决爬虫问题(实际上这是大部分反爬虫工程师的需求)。
然后你可能会请求一些爬虫工程师, 询问下他们平时是如何爬的, 并期望得到一些反抗的手段。
然而技术人员都是狂妄的, 你得到的答案多半是:切, 不管你怎么做, 其实我都是爬的到的。
这个就忽然变的很没意思了。 实际上他这句话在理论上是完全正确的, 因为有一种爬虫叫人肉爬虫:
“在贫困山区开个公司, 给他们一部电脑或手机, 让他们访问页面, 把内容填写到自己开发的网站上,并给予适当的报酬”
这种爬虫是不可能被防住的。
当然这种情况过于极端了。
比如上次的直播, 有人直接就问我, phantomjs如何防?
首先这个问题的答案我是不会告诉你的! 这个泄密已经不是一星半点了, 基本要泄光了。
其次, 你知道phantomjs在现实世界所占的比例吗?
最后, phantomjs的效率问题你自己应该比我更清楚。
综合以上三点, 这个问题就不应该提出来呀。。。。。
正常的对话应该是这样的:
“xx桑, 请问如果对方用python模拟http请求我们应该如何处理?”
“xx桑, 请问如果他包含所有的http信息呢?”
“xx桑, 那如果他知道如何运行js呢?”
“xx桑, 那如果。。。”
这才是正常的对话模式啊。
好了在不泄密的情况下, 我首先出几道题目:
1 请问这个字符串是什么:
“Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9”
答案:这是一个user-agent, 并且是lynx浏览器。 lynx是一个奇葩浏览器, 正常用户是不会用他访问你的站点的, 就算访问了也不会买你东西的, 你只管封了它好了, 不会对你业务产生任何影响, 也不会有人投诉。
2 请问你觉得这个user-agent出现在你的访问日志里的数量应该是多少?
答案:出乎你的想象, 这个UA非常多。 在极端情况下它甚至可以在ua排行榜里进入前十名甚至前五名。
3 请问为什么这么多爬虫喜欢用这个UA?
答案:用你喜欢的搜索引擎搜索下这个UA, 你看看你会得到什么知识?你是不是以为会得到lynx的介绍, 或者再不济也是一些毫无意义的访问统计?
其实答案是: 你会得到好几页的python爬虫教程。
现在自己动手搜一下试试吧。
这就是爬虫界的现状: 80%以上的爬虫是十分低级的爬虫。
当然了, 随着你慢慢的加大反爬虫力度, 这种低级爬虫会越来越少。 我们称之为:进化。
爬虫是会进化的, 正常程序员是不会在工作正常的情况下加班的。 但是如果抓不到数据, 老板就会骂他, 他就会加班。
咦, 上面这句话是不是透露了什么关键的信息?
===============================================================================
回到开头:
>>至少能对dudu有用我就心满意足了
那么, 请问如何帮到dudu进行反爬虫呢?
我们看下博客园的文章是如何加载的:
请求url, 直接得到html文件。 其中包含文章内容。
这就奇怪了, 为什么dudu会让你如此轻易的得到文章内容?如果改为ajax加载, 那么至少要耗费一步, 拉完页面拉ajax才行(虽然依然没有任何卵用, 不过至少恶心了一点)
因为SEO啊!你写的文章为什么在博客园发表完很快就能在百度搜的到? 因为博客园的权重啊!为了让大家能够更快的出名, 博客园简直就是在爬虫面前裸奔啊!
因此, 你还好意思问phantomjs怎么爬博客园么?用phantomjs爬, 简直是作死好不好?一个urllib2就搞定的事情!
此外吐槽一下:博客园是有api的, 可以直接获取内容。 然而, dudu和我吐槽过, 大家依然还是喜欢爬。。。。
1 封IP
这一点虽然很二, 但是非常有效。
2 封代理IP
有些人问:为什么我使用了代理服务器, 却一下子就被认出来了?呵呵, 你知道那是代理服务器, 难道对方就不知道吗?
3 封奇葩的UA
连Mozila开头都不知道, 这种爬虫还能留?额, 你是不是觉得爬虫不会这么缺心眼?如果是的话, 怎么会有那么多的lynx?
此外有个理论:user-agent的最小长度为xx字节。 至于xx是多少。。。 select一下自己看看吧。
补充:搜索引擎的ua不符合这一条。 但是搜索引擎的IP是固定的。
4 封accept-encoding里不包括gzip的。
为什么有些爬虫的accept-encoding里会不包括gzip? 说起来这个事情非常可笑。 我们自己写了个爬虫才知道。 如果不写这个头, 服务器会返回未压缩的文本可以直接分析。 如果加了, 服务器会返回压缩后的。 因此你要多写点代码来做gzip解压缩。 虽然这个代码很简单但是有些人真的是懒!到!极!致!了!由于目前的服务器其实都支持不压缩的请求方式, 因此他们就会选择用这个来投机取巧。
5 经常改dom结构。
不解释。 玩死那些懒到用正则的大懒虫。 甚至无需更改dom结构, 多加点注释影响正则都可以。 你可以猜猜对方会如何写正则, 然后精心构造一个会让他跑错的。
以上办法均十分简单易行, 并且不会伤害SEO。 并且使用了之后, 爬虫量会大大减小。
如果使用了之后没有减小。。。。。
那说明你们面对的爬虫高于业界平均新手水平。
===============================================================================
参考资料
===============================================================================
骗你的, 这种破文章还要什么参考资料
1 人工打码的话, 一条验证码1到2分钱。
2 买IP的话, 几十块钱可以买到几十万, 当然IP质量一般。
3 想运行javascript的, 只需要用nodejs即可, 无需动用phantomjs这么高级的玩意。
4 canvas指纹的冲突率比你想象的要高
5 你写的十分复杂的javascript, 并不一定有人看。
6 jsFuck不支持IE
7 永远不存在爬不到的信息, 只是成本高低的问题
相关文章推荐
- thinksns解析1
- logstash indexer和shipper的配置
- Fragment嵌套Viewpager时报错
- Vijos P1407 古韵之刺绣
- OpenSSL多线程互斥锁
- Android---数据存储SQLite
- ActionBar中的返回键的设置及使用(位于屏幕左上角)
- Linux基础篇之三系统启动过程
- C++中的override
- WPF(x:Null 使用)
- logstash indexer和shipper的配置
- python中的变量和对象
- SpringMVC源代码学习(四)九大组件
- Android 5.1 反射法无法获取 framework services.jar 中的类
- WPF中静态引用资源与动态引用资源的区别
- 在Mac系统上配置Android真机调试环境
- linux学习-ping和ifcongfig
- jquery 结合bootstrap样式的前端分页
- 苦逼的Python爬虫学习过程
- |Vijos|图论生成树|P1234 口袋的天空