如何防止网站被爬取?

339

我有一个相当大的音乐网站,拥有庞大的艺术家数据库。 我注意到其他音乐网站正在抓取我们网站的数据(我在某些地方输入虚假的艺术家名称,然后进行谷歌搜索)。

如何防止屏幕抓取? 这是否可能?

答: 防范网站屏幕抓取并非易事,但可以采取以下措施: - 添加robots.txt文件以告知搜索引擎哪些页面不应该被抓取 - 限制访问频率以确保数据仅被人类用户获取 - 将数据分散存储,例如使用CDN和多个服务器 - 实施身份验证和验证码来限制机器人对网站的访问 - 监视流量和访问模式以识别可疑行为
请注意,这些方法并不能完全保证防范屏幕抓取,但它们可以减少被抓取的可能性。

12
您是否考虑过通过IP或类似方式(检查日志)来检测他们的爬虫,并为这些爬虫完全伪造数据?这样一来,他们将会“爬取”您的站点,但是他们所获得的“数据”将是无用的。 - Lasse V. Karlsen
34
颠倒的lolcats和翻转/混淆的文本,有人需要吗? - Wayne Werner
7
正在Meta上讨论的问题是:我正在撰写的答案超过了30,000个字符的限制,我应该怎么办? - T.J. Crowder
3
使用 HTML 的可点击 map 功能,将整个网页渲染为 PNG。 - Tomáš Zato
2
@JonasCz 这是一个讽刺的笑话。可悲的是,类似的建议包含在您的答案中,尽管受到了批评。 - Tomáš Zato
显示剩余10条评论
26个回答

8

从技术角度来看: 当你向谷歌发送过多的查询时,只需模仿他们的做法即可解决大部分问题。

从法律角度来看: 听起来你发布的数据并不是专有的。这意味着你发布的名称、统计数据和其他信息无法受到版权保护。

如果是这种情况,网络爬虫在重新分发关于艺术家姓名等信息时并没有侵犯版权。然而,当他们将你的网站加载到内存中时,他们可能会侵犯版权,因为你的网站包含了一些受版权保护的元素(如布局等)。

我建议阅读 Facebook v. Power.com 的相关内容,并查看 Facebook 用来阻止屏幕抓取的论据。有许多合法的方法可以尝试阻止某人抓取你的网站。它们可以是广泛的和富有想象力的。有时法院会接受这些论点,有时则不会。

但是,假设你发布的是公共领域信息,例如姓名和基本统计数据,你应该放手,以言论自由和开放数据为名。这就是互联网的全部精神。


1
尽管您可能无法对信息进行版权保护,但您绝对可以在使用条款中加入反对网络爬虫的条款。然后,针对违反使用条款的行为发送一封停止侵权信。 - André Caron
1
言论自由和开放数据确实是互联网的精神! - Ciara
1
是的,言论自由什么的都好。但是,这些爬虫可能会浪费大量的原帖预算或带宽,并且复制了不受版权保护的数据。 - jpaugh

8

很遗憾,你最好的选择是相当手动的:寻找你认为表明有网页抓取行为的流量模式,并封禁它们的IP地址。

由于你讨论的是公共网站,使网站对搜索引擎友好也会使网站容易被抓取。如果搜索引擎可以爬取和抓取你的网站,那么恶意的抓取程序也可以。这是一个微妙的平衡点。


4
IP阻止会减缓爬虫的速度,但对于您的服务器来说也是很大的负担。假设我使用1000个代理来爬取您的网站,我仍然能够获取我想要的数据,而且现在您的防火墙变得一团糟了。 - pguardiario
1
当你这样做时,它们会在你身上横向移动。今天对于他们来说,100000个地址不花费任何费用,但如果你试图禁止它们所有访问,会减慢你的网站速度 - 而且它们会轮换IP地址,以免重复访问一两次。 - mplungjan

7

当然是可以的。为了100%成功,需要将您的网站下线。

实际上,您可以做一些使爬取变得更加困难的事情。谷歌会进行浏览器检查,以确保您不是在爬取搜索结果(虽然像大多数其他事情一样,这也可以被欺骗)。

您可以采取一些措施,比如要求在首次连接到您的网站和后续点击之间等待几秒钟。我不确定最理想的时间是多少,也不知道具体如何操作,但这是另一个想法。

我相信还有很多其他有更丰富经验的人,但我希望这些想法至少有点帮助。


7
  1. 不,无法以任何方式停止。
  2. 接受它。为什么不将其发布为RDFa,成为超级搜索引擎友好的,并鼓励数据的重复使用?人们会感谢你并给予应有的荣誉(参见musicbrainz的例子)。

这可能不是你想要的答案,但为什么要隐藏你想公开的东西呢?


6
有几个方法可以尝试防止屏幕抓取。其中一些不是很有效,而其他方法(如CAPTCHA)则很有效,但会影响易用性。您还必须记住,这可能会妨碍合法的网站爬虫,例如搜索引擎索引。
但是,我假设如果您不希望被抓取,那么这意味着您也不希望搜索引擎对其进行索引。
以下是一些可尝试的方法:
- 将文本显示为图像。这相当可靠,并且对用户来说比CAPTCHA更少烦恼,但这意味着他们将无法剪切和粘贴,并且它不会缩放得漂亮或易于访问。 - 使用CAPTCHA并要求在返回页面之前完成它。这是一种可靠的方法,但也是对用户施加的最大的痛苦。 - 要求用户注册帐户才能查看页面,并确认其电子邮件地址。这将非常有效,但不是完全有效的-屏幕抓取程序可能会设置一个帐户,并可能巧妙地编程其脚本以代表他们登录。 - 如果客户端的用户代理字符串为空,则阻止访问。网站爬取脚本通常会懒惰地编程,并且不会设置用户代理字符串,而所有Web浏览器都会设置。 - 您可以设置已知屏幕抓取程序用户代理字符串的黑名单,因为您发现它们。同样,这只能帮助懒惰编码的人;知道自己在做什么的程序员可以设置用户代理字符串以模拟Web浏览器。 - 经常更改URL路径。当您更改它时,请确保旧路径仍然有效,但仅限于一个用户可能打开其浏览器的时间。让人难以预测新的URL路径将是什么。如果他们的URL是硬编码的,则这将使脚本难以抓取。最好使用某种脚本来执行此操作。
如果我必须这样做,我可能会结合后三个方法,因为它们最大程度地减少了对合法用户的不便。但是,您必须接受您无法以这种方式阻止每个人,并且一旦有人找到如何绕过它,他们将能够永久地进行抓取。然后,您可以尝试在发现它们时阻止其IP地址。

5

方法一(仅适用于小型网站):
提供加密/编码数据。
我使用Python(urllib、requests、beautifulSoup等)扫描网络,并发现许多网站提供加密/编码数据,这些数据在任何编程语言中都无法解密,因为加密方法不存在。

我在PHP网站中实现了这一点,通过对输出进行加密和最小化处理(警告:对于大型网站来说,这不是一个好主意),响应总是混乱的内容。

以下是在PHP中最小化输出的示例(如何最小化PHP页面HTML输出?):

<?php
  function sanitize_output($buffer) {
    $search = array(
      '/\>[^\S ]+/s', // strip whitespaces after tags, except space
      '/[^\S ]+\</s', // strip whitespaces before tags, except space
      '/(\s)+/s'      // shorten multiple whitespace sequences
    );
    $replace = array('>', '<', '\\1');
    $buffer = preg_replace($search, $replace, $buffer);
    return $buffer;
  }
  ob_start("sanitize_output");
?>

方法二:
如果您无法阻止爬虫,可以提供伪造的/无用的数据作为响应。

方法三:
阻止常见的爬虫用户代理,大型网站通常会采取此方法,使用“python3.4”等User-Agent无法对其进行爬取。

方法四:
确保所有用户标头都是有效的。我有时会提供尽可能多的标头来使我的爬虫看起来像一个真实的用户,其中一些甚至不是真实或有效的,比如 en-FU :)。这是我通常提供的一些标头列表。

headers = {
  "Requested-URI": "/example",
  "Request-Method": "GET",
  "Remote-IP-Address": "656.787.909.121",
  "Remote-IP-Port": "69696",
  "Protocol-version": "HTTP/1.1",
  "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
  "Accept-Encoding": "gzip,deflate",
  "Accept-Language": "en-FU,en;q=0.8",
  "Cache-Control": "max-age=0",
  "Connection": "keep-alive",
  "Dnt": "1",  
  "Host": "http://example.com",
  "Referer": "http://example.com",
  "Upgrade-Insecure-Requests": "1",
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"
}

3

一种快速的方法是设置诱饵或陷阱页面来捕获机器人。

  1. 创建一个页面,如果它被打开了特定次数,或者即便只是被打开了一次,就会收集特定信息,例如IP地址等(您还可以考虑不规则或模式,但这个页面本身不应该被打开)。

  2. 在您网页中创建一个链接,将其隐藏使用CSS属性 display:none; 或 left:-9999px; positon:absolute; 尝试将其放置在较不容易忽略的位置,如内容下方而非底部,因为有时候机器人会选择忽略页面的某些部分。

  3. 在 robots.txt 文件中设置大量拒绝访问规则,以此来限制不希望友好的机器人(哈哈,它们有开心的表情符号!)搜集信息的页面,并将此页面作为其中之一。

  4. 现在,如果一个友好的机器人进入,它应该会忽略该页面。但这还不够好。再创建几个这样的页面,或以某种方式重定向页面以接受不同名称,并在 robots.txt 文件中添加更多的不允许规则,将这些陷阱页面与需要被忽略的页面放在一起。

  5. 收集这些机器人或任何进入这些页面的人的IP地址,不要封禁它们,但可以制作一个函数,在您的内容中显示杂乱无章的文本,如随机数字、版权声明、特定文本字符串、恐怖图片等基本上任何阻碍良好内容的东西。您还可以设置指向需要很长时间才能加载的页面的链接,例如在php中使用 sleep() 函数。如果一些编写得很好的机器人被设置为同时处理X个链接,那么这将对抗爬虫程序。

  6. 如果您已经创建了特定的文本字符串/句子,为什么不去您最喜欢的搜索引擎搜索它们呢?这可能会显示您的内容出现的位置。

总之,如果您从战略和创意的角度来考虑,这将是一个良好的起点。最好的方法是学习机器人的工作原理。

我也认为应该考虑混淆一些 ID 或页面元素上显示的属性方式:

<a class="someclass" href="../xyz/abc" rel="nofollow" title="sometitle"> 

有些机器人可能会设置为查找页面或目标元素中的特定模式,因此每次都会更改其形式。

<a title="sometitle" href="../xyz/abc" rel="nofollow" class="someclass"> 

id="p-12802" > id="p-00392"

1
你不仅想要禁止他们,而且还想完全搞砸他们...我喜欢! - Zoidberg
隐形封禁正是我所想的(又称影子封禁、地狱封禁)。 - ErikE

3

与其把机器人列入黑名单,不如将它们列入白名单。如果您不想损坏前几个搜索引擎的搜索结果,可以将它们的用户代理字符串列入白名单,这些字符串通常是公开的。不道德的机器人往往会伪造流行的Web浏览器的用户代理字符串。前几个搜索引擎应该占据您流量的95%以上。

使用其他帖子中建议的技术,识别机器人本身应该相当简单。


2
大部分已经说过了,但您是否考虑过使用CloudFlare保护?我的意思是这个:
其他公司可能也会做到这一点,但我只知道CloudFlare。
我相信这会让他们的工作变得更加复杂。我曾经试图通过简单的AJAX请求循环来获取受CloudFlare保护的网站的数据,由于速率限制而自动禁止了我的IP地址,禁止了4个月。

2

正常的屏幕抓取是无法阻止的。不管好坏,这就是网络的本质。

可以使某些内容(包括音乐文件)仅在用户登录为注册用户时才能访问。这并不太困难在Apache中实现。我认为在IIS中也不会太难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接