# 爬虫对抗




### why

知己知彼，百战不殆。

爬虫往往会爬取其他服务的一些核心资源，这些资源是服务提供商重点保护的资产，所以很多网站都会启用一些反爬虫策略。

这里我们简单分析一下反爬虫的常用手段。


### 监控后台日志和流量模式; 如果发现异常活动，则限制访问

通过日志是可以看出一些异常访问的，比如例如来自同一个IP地址的许多类似的请求操作。我们可以通过一些措施来限制这些访问，从而达到保护己方资源的效果，具体措施如下

* 访问速率限制
* 检测异常活动
* 不要只是通过IP地址监控和限制访问速率 —— 也可以使用其他指标，比如表单提交的速度，或者是user-agent
* 使用验证码替代临时阻止访问的方案

**反爬建议:可以使用ip池，降低访问频率或浏览器自动化工具爬虫来进行对抗**

### 要求注册和登录

如果你要求客户端创建帐户和登录，那么你可以准确的跟踪用户和爬虫的操作，另外也可以适当增加爬虫实现的难度。不过需不需要注册和登录最终还要看产品的需求，以产品需求为准。

为了避免自动化创建许多帐户的脚本，你应该做以下这些事情:

* 注册时需要一个电子邮件地址，并且用户必须打开通过你所发送的链接来验证该电子邮件地址才能激活该帐户。每个电子邮件地址只允许一个帐户。

* 需要在注册/帐户创建期间显示验证码，以防止自动化脚本创建帐户

**反爬建议:爬虫可以模拟登录，另外降低访问频率，以免暴露真实意图**

### 阻止来自云托管主机和爬虫服务的IP地址的访问

有时，爬虫会从网络托管服务（如Amazon Web Services或Google App Engine）或VPSes运行。限制（或显示验证码）来源于此类云主机服务使用的IP地址请求访问你的网站。你还可以阻止从爬虫服务使用的IP地址的访问。

同样，你还可以限制代理或VPN提供商使用的IP地址的访问，因为爬虫可能会使用此类代理服务器来避免单个IP发出许多请求。

**反爬建议:使用代理和ip池**

### 如果你要采取阻止访问的做法，请将你的错误消息进行调整

如果你采取了阻止/限制访问的手段，那么你应该确保不要告诉爬虫导致阻塞的实际原因，从而给爬虫制作者如何修复爬虫的线索。所以用文本显示错误页面可能是一个坏主意：

* 你的IP地址请求过于频繁，请稍后再试。
* 错误，User Agent不存在，非法访问！

相反，显示一个友好的错误消息，不要告诉爬虫是什么原因造成不能正常访问的。

抱歉，网站出了一些问题。如果问题仍然存在，你可以联系helpdesk@example.com。

这也是真正对用户友好的一种显示内容。你还应该考虑在后续的请求中不要直接显示验证码，以防真实用户看到这个错误消息，导致你阻止了合法用户的访问行为。

**反爬建议:使用浏览器自动化工具，伪装成真实的用户**

### 如果你的网站被爬虫访问，请使用验证码

验证码是双刃剑，可以非常有效的组织爬虫，但也会对真正的用户产生负面影响。

如果需要使用验证码，那么请

* 不要自己实现验证码，应该使用像Google的reCaptcha这样的东西：这比自己实现一个验证码要容易得多，它比一些模糊和扭曲的文本解决方案对用户来说更友好，而且比起自己实现验证码，它能更好的解决问题

* 不要在HTML标记中包含验证码的解决方案：实际上我已经看到一个网站在页面中嵌入了验证码的解决方案（虽然隐藏的很好）。但是不要这样做。还是推荐使用像reCaptcha这样的服务，如果你正确使用它，就不会出现问题。

* 验证码是可以批量验证的：在网上有一些低报酬的人工打码服务可以批量解决验证码的验证服务。所以，我在这里还是推荐使用reCaptcha，因为它具有很好的自我保护作用。这种服务不太可能被用于人工打码，除非你的数据真的很有价值。

**反爬建议:使用人肉打码服务**

### 将你的文本内容转成图片

你可以在服务器端将文本转换成图像然后在客户端显示，这种方法可以阻碍简单的爬虫提取文本。

记得当年起点的付费阅读的内容就全部是图片形式的。

然而，这对于屏幕阅读器，搜索引擎，性能以及其他的一些事情都是不利的。在某些方面（比如无障碍操作，例如美国残疾人法案）也可能是非法的，并且也很容易被一些OCR技术绕过，所以最好还是不要这样做。

**反爬建议:使用OCR图片识别技术**

### 不要公开你的完整数据集

如果可行的话，请不要为脚本或爬虫机器人提供所有数据集的方法。例如：你有一个新闻网站，有很多单独的文章。你可以通过现场搜索来搜索这些文章，并且如果你没有列出任何网站上的所有文章及其URL，那么这些文章将只能通过使用搜索来访问特征。这意味着一个想要从你的网站上获得所有文章的脚本将不得不搜索可能出现在你的文章中的所有可能的短语，才能找到文章的全部内容，这对于爬虫来说是很耗时的，而且效率低的可怕，所以爬虫一般都会放弃爬取数据。

如果是以下这些情况，那么这种方法将变得无效：

* 爬虫机器人或脚本并不想或需要完整的数据集。

* 你的文章的URL是一个看起来像 example.com/article.php?articleId=12345这种（和类似的东西）的格式，这将允许爬虫可以简单地迭代所有articleId的文章，并请求所有的文章内容。

* 还有其他方式可以最终找到所有的文章，比如通过编写一个脚本来跟踪其他文章的内容中的链接。

* 搜索“&”或“”的东西可以显示几乎所有的东西，这是一些需要注意的事情。（你只能返回前10或20个结果来避免这种情况）。

* 你需要搜索引擎来查找你的内容。

**反爬建议:遍历数字型id基本可以拿到所有内容**

### 参考资料

文本大部分参考了[Web网页爬虫对抗指南 Part.1](http://www.4hou.com/technology/8482.html)这篇文章，在这里附上原始链接，并对原作者和译者表示衷心的感谢。




原始封面

![课程图片](https://images.unsplash.com/photo-1504893524553-b855bce32c67?w=300)


