如何防止网站被爬取?

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个回答

421

注意: 由于完整版答案超出了Stack Overflow的长度限制,您需要前往GitHub阅读扩展版本,其中包含更多提示和详细信息。


为了防止网站爬虫(也称为Webscraping,Screenscraping,Web数据挖掘,Web收割或Web数据提取),了解这些爬虫的工作原理以及阻止它们正常工作的方法非常有帮助。
有各种类型的爬虫,每种都有不同的工作方式:
  • 爬虫,例如谷歌机器人或网站复制程序如HTtrack, 递归地跟随链接到其他页面以获取数据。这些有时会用于有针对性的抓取以获取特定数据,通常与HTML解析器结合使用,从每个页面中提取所需数据。

  • Shell脚本:有时会使用常见的Unix工具进行抓取:Wget或Curl下载页面,Grep(Regex)提取数据。

  • HTML解析器,例如基于Jsoup、Scrapy和其他的解析器。类似于基于shell脚本的正则表达式方法,这些方法通过根据HTML中的模式从页面中提取数据,通常忽略其他内容。

    例如:如果您的网站有一个搜索功能,这样的抓取器可能会提交搜索请求,然后从结果页面HTML中获取所有结果链接及其标题,以仅获取搜索结果链接及其标题。这是最常见的方法。

  • 屏幕抓取器,例如SeleniumPhantomJS,它们在真实的浏览器中打开您的网站,运行JavaScript、AJAX等,然后从网页中获取所需文本,通常的方法是:

    • 在页面加载完成并JavaScript运行后从浏览器中获取HTML,然后使用HTML解析器提取所需数据。这是最常见的方法,因此许多破坏HTML解析器/抓取器的方法在这里也适用。

    • 截取已呈现页面的屏幕截图,然后使用OCR从屏幕截图中提取所需文本。这种方法很少见,只有真正想要您的数据的专门抓取器才会设置。

  • 网页抓取服务,例如ScrapingHubKimono。事实上,有些人的工作就是找出如何抓取您的网站并提取内容供他人使用。

    毫不奇怪,专业的抓取服务最难阻挡,但如果您使其难以找到如何抓取您的网站,并且需要耗费时间,这些服务(以及雇佣他们的人)可能不会费心抓取您的网站。

  • 将您的网站嵌入其他网站的页面中,使用frames,并将您的网站嵌入移动应用程序中。

    虽然技术上不算抓取,但移动应用程序(Android和iOS)可以嵌入网站,并注入自定义CSS和JavaScript,从而完全改变您的页面外观。

  • 人工复制-粘贴:人们会复制和粘贴您的内容以便在其他地方使用。

这些不同种类的爬虫之间有很多重叠,即使它们使用不同的技术和方法,许多爬虫的行为也会相似。

这些建议大多是我自己的想法,遇到编写爬虫时遇到的各种困难,以及来自网络的信息和思路的碎片。

如何停止爬取

你无法完全防止它,因为无论你做什么,决心的爬虫仍然可以找出如何进行爬取。但是,您可以通过执行以下几项操作来停止大量的爬取:

监控您的日志和流量模式;如果发现异常活动,请限制访问:

定期检查日志,并在出现自动访问(爬虫)迹象的异常活动情况下,例如来自相同IP地址的许多相似操作,您可以阻止或限制访问。

具体来说,一些想法:

  • 限制频率:

    仅允许用户(和爬虫)在一定时间内执行有限数量的操作 - 例如,只允许来自任何特定IP地址或用户的几次搜索每秒钟。这将减慢爬虫的速度,并使它们无效。如果操作完成得太快或比真实用户更快,则还可以显示验证码。

  • 检测异常活动:

    如果您看到异常活动,例如从特定IP地址发出许多类似请求,某人查看过多的页面或执行异常数量的搜索,则可以防止访问,或为随后的请求显示验证码。

  • 不要仅按IP地址监视和限制频率 - 还要使用其他指标:

    如果要阻止或限制频率,请不要仅基于每个IP地址进行操作;您可以使用其他指标和方法来识别特定用户或爬虫。一些可帮助您识别特定用户/爬虫的指标包括:

    • 用户填写表单的速度以及他们在按钮上点击的位置;

    • 您可以使用JavaScript收集大量信息,例如屏幕大小/分辨率,时区,安装的字体等;您可以使用此信息来识别用户。

    • HTTP标头及其顺序,特别是User-Agent。

    例如,如果您从单个IP地址收到许多请求,所有这些请求都使用相同的用户代理,屏幕大小(使用JavaScript确定)以及用户(在这种情况下为爬虫)始终以相同的方式和定期间隔点击按钮,则可能是屏幕刮削器;您可以暂时阻止类似的请求(例如,阻止来自该特定IP地址的具有该用户代理和屏幕大小的所有请求),这样您就不会给该IP地址上的真实用户带来不便,例如在共享互联网连接的情况下。

    您还可以进一步采取措施,即使它们来自不同的IP地址,也可以识别出类似的请求,表示分布式刮削(使用僵尸网络或代理网络的刮削器)。如果您收到许多完全相同的请求,但它们来自不同的IP地址,则可以阻止。再次注意不要无意中阻止真实用户。

    对于运行JavaScript的屏幕刮削器,这可能是有效的,因为您可以从中获取大量信息。

    安全堆栈交换上的相关问题:

  • 使用验证码而不是暂时阻止访问:

    实现限制频率的简单方法是暂时阻止访问一定时间,但使用验证码可能更好,有关验证码的部分请参见下面的部分。

需要注册和登录

如果您的网站可行,要求创建帐户才能查看您的内容。这是防止网络爬虫的好方法,但也会成为真实用户的障碍。

  • 如果您需要注册和登录,您可以准确地跟踪用户和网络爬虫的操作。这样,您就可以轻松检测到特定帐户被用于网络爬取并禁用它。诸如速率限制或检测滥用(例如短时间内大量搜索)的事情变得更加容易,因为您可以识别特定的网络爬虫而不仅仅是IP地址。

为了避免脚本创建多个账户,您应该:

  • 要求填写电子邮件地址进行注册,并通过发送必须打开链接以激活帐户的方式验证该电子邮件地址。一个电子邮件地址只能对应一个账号。

  • 在注册/创建帐户期间要求解决验证码。

要求创建帐户才能查看内容会让用户和搜索引擎远离您的网站;如果您要求用户必须创建帐户才能查看文章,他们可能会转向其他网站。

从云主机和网络爬虫服务的IP地址阻止访问

有时候,网络爬虫会从网页托管服务(例如亚马逊网络服务或GAE)或VPS运行。对于来自这些云托管服务使用的IP地址发起的请求,限制访问您的网站(或显示验证码)。
同样,您也可以限制来自代理或VPN提供商使用的IP地址的访问,因为爬虫可能会使用这些代理服务器来避免检测到许多请求。
请注意,通过阻止代理服务器和VPN的访问,您将对真实用户产生负面影响。
如果您确实阻止/限制了访问,请确保不要告诉爬虫是什么原因导致了阻止,从而给他们提供修复其爬虫的线索。因此,显示类似以下文本的错误页面是一个坏主意:
- 您的IP地址请求过多,请稍后再试。 - 错误,用户代理标头不存在!
相反,显示一个友好的错误消息,不要告诉爬虫是什么原因导致的。类似下面的内容更好:
抱歉,出了点问题。如果问题仍然存在,您可以通过helpdesk@example.com联系支持。
这样做对真实用户更加友好,万一他们看到了这样的错误页面。如果一个真实用户看到错误消息,您还应该考虑显示验证码来代替硬性阻止,以便不会阻止合法用户并引起他们与您联系。

如果怀疑您的网站正在被爬取,请使用验证码。

验证码(“完全自动化区分计算机和人类的测试”)非常有效地阻止了爬虫。不幸的是,它们也很容易激怒用户。
因此,在怀疑可能存在爬虫并希望停止爬取但又不想阻止访问的情况下,它们非常有用。如果怀疑有爬虫,则可以考虑在允许访问内容之前显示验证码。
使用验证码时需要注意以下事项:
  • 不要自己开发,使用像Google的reCaptcha这样的东西:它比你自己实现验证码要容易得多,比一些你自己想出来的模糊和扭曲文本解决方案更加用户友好(用户通常只需要勾选一个框),而且对于脚本编写者来说,它也更难解决,比从你的网站提供简单图像要困难得多。

  • 不要在HTML标记中包含验证码的解决方案:我曾经看到一个网站在页面本身中有验证码的解决方案(虽然相当隐蔽),因此使其变得几乎无用。不要做这样的事情。同样,使用像reCaptcha这样的服务,您就不会有这种问题(如果您正确地使用它)。

  • 验证码可以批量解决:有一些验证码解决服务,真正的低薪人员批量解决验证码。同样,使用reCaptcha在这里是一个好主意,因为他们有保护措施(例如用户解决验证码的相对较短时间)。除非您的数据真的很有价值,否则不太可能使用这种服务。

将文本内容作为图像提供

你可以在服务器端将文本呈现为图像,并提供该图像以显示,这将阻止简单的网络爬虫提取文本。但是,这对于屏幕阅读器、搜索引擎、性能和几乎所有其他方面都不利。在某些地方(如美国残疾人法案等方面)这也是非法的,而且很容易通过一些OCR方法规避它,所以不要这样做。 你可以使用CSS Sprites实现类似的效果,但这也有同样的问题。

不要公开完整数据集:

如果可行,不要提供一个脚本/机器人获取您的所有数据集的方法。例如:您有一个新闻网站,其中有许多单独的文章。您可以使这些文章只能通过网站内的搜索来访问,并且如果您没有在网站上列出所有文章及其URL的列表,则这些文章将仅通过使用搜索功能才能访问。这意味着想要从您的网站上获取所有文章的脚本将不得不对可能出现在您的文章中的所有短语进行搜索,以便找到它们,这将耗时、效率极低,并且希望会让网络爬虫放弃。
如果:
  • 机器人/脚本不需要完整的数据集。
  • 您的文章通过类似 example.com/article.php?articleId=12345 的 URL 进行服务。这(以及类似的事情)将允许爬虫简单地迭代所有的 articleId 并以此请求所有文章。
  • 还有其他方法可以最终找到所有文章,例如编写一个脚本来跟随链接,这些链接会导向其他文章。
  • 搜索 "and" 或 "the" 等内容几乎可以揭示一切,所以要注意这一点。(您可以通过仅返回前 10 或 20 个结果来避免这种情况)。
  • 您需要搜索引擎来找到您的内容。

不要公开您的 API、端点等:

确保您不会意外公开任何 API。例如,如果您正在使用 AJAX 或从 Adobe Flash 或 Java Applets(天哪!)中进行网络请求来加载数据,则轻松查看页面的网络请求并确定这些请求的目标,然后反向工程并在爬虫程序中使用这些端点。确保您混淆您的端点并使其难以被他人使用,如所述。

为了防止HTML解析器和爬虫:

由于HTML解析器通过识别HTML中的可识别模式来从页面中提取内容,我们可以故意更改这些模式以破坏这些爬虫,甚至干扰它们。大多数这些技巧也适用于其他爬虫,如蜘蛛和屏幕抓取程序。

经常更改您的HTML

直接处理HTML的爬虫是通过从HTML页面的特定可识别部分提取内容来进行的。例如:如果您网站上的所有页面都有一个id为“article-content”的

,其中包含文章的文本,则编写一个脚本以访问您网站上的所有文章页面,并提取每个文章页面上的div的内容文本,然后就可以在其他地方重复使用这些爬虫所需的格式中获取该爬虫的所有文章。

如果您经常更改HTML和页面结构,则此类爬虫将不再起作用。

  • 您可以经常更改HTML中元素的ID和类,甚至可以自动更改。因此,如果您的div.article-content变成了div.a4c36dda13eaf0,并且每周都会更改,则爬虫在最初时将正常工作,但一周后将会崩溃。确保还要更改您的id /类的长度,否则爬虫将使用div.[any-14-characters]来查找所需的div。还要注意其他类似的漏洞。

  • 如果无法从标记中找到所需的内容,则爬虫将从HTML结构的方式中获取它。因此,如果所有文章页面都相似,即在h1之后的每个div内的div都是文章内容,则爬虫将基于此获取文章内容。同样,为了打破这一点,您可以定期和随机地添加/删除额外的标记到您的HTML中,例如添加额外的divspan。使用现代服务器端HTML处理,这应该不太困难。

需要注意的事项:

  • 实现、维护和调试将会很繁琐和困难。

  • 它会妨碍缓存。特别是如果您更改HTML元素的id或class,这将需要相应地更改CSS和JavaScript文件,这意味着每次更改它们时,浏览器都必须重新下载它们。这将导致重复访问者的页面加载时间变长,并增加服务器负载。如果您只更改一次每周,那么这不会是一个大问题。

  • 聪明的爬虫仍然可以通过推断实际内容的位置来获取您的内容,例如,知道页面上的一个大文本块可能是实际文章。这使得仍然可以从页面中找到并提取所需的数据。Boilerpipe正是这样做的。

基本上,请确保对于每个类似的页面,脚本无法轻松找到实际的、期望的内容。

有关如何在PHP中实现此功能的详细信息,请参见如何防止依赖XPath的网络爬虫获取页面内容

基于用户位置改变您的HTML

这与之前的提示有些类似。如果根据用户的位置/国家(通过IP地址确定)提供不同的HTML,可能会破坏向用户提供的爬虫程序。例如,如果有人正在编写从您的网站中爬取数据的移动应用程序,它最初可以正常工作,但是当实际分发给用户时,它会出现问题,因为这些用户可能在不同的国家,因此获取不同的HTML,而嵌入式爬取器并未设计用于消耗这些HTML。

经常更改您的HTML,积极地干扰爬虫!

例如:您的网站上有一个搜索功能,位于 example.com/search?query=somesearchquery,返回以下HTML:

<div class="search-result">
  <h3 class="search-result-title">Stack Overflow has become the world's most popular programming Q & A website</h3>
  <p class="search-result-excerpt">The website Stack Overflow has now become the most popular programming Q & A website, with 10 million questions and many users, which...</p>
  <a class"search-result-link" href="/stories/story-link">Read more</a>
</div>
(And so on, lots more identically structured divs with search results)

作为您可能已经猜到的,这很容易被爬取:所有爬虫需要做的就是使用查询访问URL,并从返回的HTML中提取所需数据。除了如上所述定期更改HTML之外,您还可以将旧的标记与旧的id和类一起保留,用CSS隐藏它,并填充虚假数据,从而污染爬虫。以下是搜索结果页面的更改方式:
<div class="the-real-search-result">
  <h3 class="the-real-search-result-title">Stack Overflow has become the world's most popular programming Q & A website</h3>
  <p class="the-real-search-result-excerpt">The website Stack Overflow has now become the most popular programming Q & A website, with 10 million questions and many users, which...</p>
  <a class"the-real-search-result-link" href="/stories/story-link">Read more</a>
</div>

<div class="search-result" style="display:none">
  <h3 class="search-result-title">Visit Example.com now, for all the latest Stack Overflow related news !</h3>
  <p class="search-result-excerpt">Example.com is so awesome, visit now !</p>
  <a class"search-result-link" href="http://example.com/">Visit Now !</a>
</div>
(More real search results follow)

这意味着编写用于根据类或ID从HTML中提取数据的爬虫仍将似乎起作用,但它们将获取假数据甚至广告,这些数据是真实用户永远看不到的,因为它们被CSS隐藏。
干扰爬虫:向页面插入假的不可见蜜罐数据
在前面的示例上添加,您可以向HTML添加不可见的蜜罐项以捕获爬虫。下面是一个可以添加到先前描述的搜索结果页面的示例:
<div class="search-result" style="display:none">
  <h3 class="search-result-title">This search result is here to prevent scraping</h3>
  <p class="search-result-excerpt">If you're a human and see this, please ignore it. If you're a scraper, please click the link below :-)
  Note that clicking the link below will block access to this site for 24 hours.</p>
  <a class"search-result-link" href="/scrapertrap/scrapertrap.php">I'm a scraper !</a>
</div>
(The actual, real, search results follow.)

一个用来获取所有搜索结果的爬虫将会捕捉到这个链接,就像页面上的任何其他真实搜索结果一样,并访问该链接以查找所需内容。一个真正的人类用户根本看不到它(因为它被CSS隐藏了),也不会访问该链接。一个真正的、可取的蜘蛛,比如Google的蜘蛛,也不会访问该链接,因为你在robots.txt中禁止了/scrapertrap/。
你可以让你的scrapertrap.php做一些阻止访问该IP地址或强制使用验证码的操作。
  • 不要忘记在你的robots.txt文件中禁止你的蜜罐(/scrapertrap/),这样搜索引擎爬虫就不会掉进去。

  • 你可以/应该结合之前的提示,经常更改你的HTML。

  • 也要经常更改它,因为网络爬虫最终会学会避开它。更改蜜罐URL和文本。还要考虑更改用于隐藏的内联CSS,并使用ID属性和外部CSS代替,因为网络爬虫会学会避开任何具有用于隐藏内容的style属性和CSS的内容。还要尝试仅在某些时候启用它,以便网络爬虫最初可以工作,但一段时间后就会破坏。这也适用于之前的提示。

  • 恶意人员可以通过分享链接到你的蜜罐,甚至将该链接嵌入到某个地方作为图片(例如,在论坛上)来阻止真正用户的访问。经常更改URL,并使任何禁止时间相对较短。

如果检测到网络爬虫,请提供虚假和无用的数据

如果你检测到明显的网络爬虫,可以提供虚假和无用数据;这会破坏网络爬虫从你的网站获取的数据。你还应该使这些虚假数据与真实数据无法区分,以便网络爬虫不知道它们被搞了。
例如:你有一个新闻网站;如果你检测到一个网络爬虫,不要阻止访问,而是提供虚假的 随机生成的 文章,这将污染网络爬虫获取的数据。如果你的虚假数据与真实数据无法区分,你就会让网络爬虫很难得到他们想要的东西,也就是真正的数据。

如果 User Agent 为空/缺失,则不接受请求

通常,懒惰编写的网络爬虫不会在请求中发送 User Agent 标头,而所有浏览器和搜索引擎蜘蛛都会发送。
如果你收到一个没有 User Agent 标头的请求,你可以显示验证码,或者简单地阻止或限制访问。(或者像上面描述的那样提供虚假数据,或者其他什么方法...)
虽然很容易欺骗,但作为对付编写不良的网络爬虫的措施,值得实施。
不要接受常见爬虫的用户代理请求;将被爬取者使用的黑名单添加到其中。在某些情况下,爬虫会使用没有真实浏览器或搜索引擎蜘蛛使用的用户代理,例如:"Mozilla"(只有这个,没有其他。我在这里看到了一些关于使用它进行爬取的问题。真正的浏览器永远不会仅使用它),“Java 1.7.43_u43”(默认情况下,Java的HttpUrlConnection使用类似于此的东西),"BIZCO EasyScraping Studio 2.0",“wget”,“curl”,“libcurl”等(有时会使用Wget和cURL进行基本抓取)。如果您发现特定的用户代理字符串由网站爬虫使用,并且真实浏览器或合法蜘蛛不使用该字符串,则还可以将其添加到黑名单中。
如果不请求资源(CSS,图像),它就不是真正的浏览器。真正的浏览器(几乎总是)会请求和下载诸如图像和CSS之类的资源。 HTML解析器和爬虫不会这样做,因为它们只对实际页面及其内容感兴趣。
你可以记录对资源的请求,如果只有HTML的请求很多,可能是一个网站抓取器。
需要注意的是,搜索引擎机器人、古老的移动设备、屏幕阅读器和配置不正确的设备也可能不会请求资源。
使用Cookie并要求使用它们来跟踪用户和网站抓取器的操作。
你可以要求启用Cookie以查看您的网站。这将阻止经验不足和新手网站抓取器编写者,但是对于一个网站抓取器来说发送Cookie很容易。如果您使用并要求Cookie,则可以使用它们跟踪用户和网站抓取器的操作,从而实现基于每个用户而非每个IP的速率限制、阻止或显示验证码等。
例如:当用户执行搜索时,设置唯一标识符Cookie。在查看结果页面时,请验证该Cookie。如果用户打开了所有搜索结果(可以从Cookie中看出),则很可能是一个网站抓取器。
使用Cookie可能无效,因为网站抓取器也可以发送Cookie,并根据需要丢弃它们。如果您的网站只能使用Cookie,还会阻止禁用Cookie的真实用户的访问。
请注意,如果使用JavaScript设置和检索Cookie,则会阻止不运行JavaScript的网站抓取器,因为他们无法检索和发送Cookie。

使用JavaScript + Ajax加载内容

在页面本身加载后,您可以使用JavaScript + AJAX来加载内容。这将使HTML解析器无法访问内容,因为它们不运行JavaScript。对于编写爬虫的新手和经验不足的程序员,这通常是一个有效的威慑。

请注意以下事项:

  • 使用JavaScript加载实际内容会降低用户体验和性能

  • 搜索引擎也可能不运行JavaScript,从而防止索引您的内容。这可能对搜索结果页面不是问题,但对文章页面等其他内容可能是问题。

混淆您的标记、脚本和所有其他网络请求。

如果您使用Ajax和JavaScript来加载数据,请混淆传输的数据。例如,您可以在服务器上对数据进行编码(使用简单的base64或更复杂的方法),然后通过Ajax获取数据并在客户端解码和显示。这意味着检查网络流量的人不会立即看到您的页面如何工作和加载数据,而且对于直接请求您的端点数据,他们将不得不反向工程您的解密算法。

  • 如果您使用Ajax加载数据,应该使其难以在未首先加载页面的情况下使用端点,例如通过要求一些会话密钥作为参数,这可以嵌入到JavaScript或HTML中。

  • 您还可以直接在初始HTML页面中嵌入混淆的数据,并使用JavaScript对其进行解混淆并显示,这将避免额外的网络请求。这样做将显着增加使用仅运行HTML的解析器提取数据的难度,因为编写爬虫程序的人必须反向工程您的JavaScript(您也应该混淆它)。

  • 您可能需要定期更改混淆方法,以破坏已经破解它的爬虫程序。

然而,这样做有几个缺点:

  • 实施、维护和调试都将很繁琐和困难。

  • 对于实际运行JavaScript然后提取数据的爬虫程序和屏幕截图程序,它将无效。(但大多数简单的HTML解析器不运行JavaScript)

  • 如果用户禁用JavaScript,则会使您的网站无法正常使用。

  • 性能和页面加载时间将受到影响。

非技术性:

  • 告诉人们不要爬取数据,有些人会尊重这个

  • 找一位律师

  • 提供API使你的数据易于获取:

    你可以轻松地提供你的数据,并要求署名和返回链接到你的网站。或许还可以收费。

杂项:

  • 还有商业的爬虫保护服务,例如 Cloudflare 的反爬虫或 Distill Networks(这里详细介绍了其工作原理here),它们可以代替您执行这些操作以及更多其他操作。

  • 在真实用户可用性与防爬虫之间找到平衡:您所做的一切都会以某种方式对用户体验产生负面影响,请寻求妥协。

  • 不要忘记您的移动站点和应用程序。如果您有一个移动应用程序,则也可以进行屏幕抓取,并且可以检查网络流量以确定其使用的 REST 终端点。

  • 爬虫可以抓取其他爬虫:如果有一个网站从您的网站中抓取内容,则其他爬虫可以从该爬虫的网站中进行抓取。

进一步阅读:


16
这篇文章让我来到这里。非常令人印象深刻的答案。此外,修订历史也很惊人。感谢您的帖子。你得到了一个赞。不仅因为你付出了很多努力,而且因为它对我很有用。 - DaveTheMinion
5
@JonH,如果他们感兴趣,他们会阅读它。此外,我已将其分成带有标题和子标题的段落,因此人们可以快速浏览并阅读他们想要的部分。实际上,在 Stack Overflow 上有很多类似长度的答案,人们确实会阅读它们。 - Jonas Czech
2
@JoshCrozier - 我只是认为像这样的网站不太适合处理这么多信息。我并不是说这些信息有问题。 - JonH
2
我的隐写指纹内容保护的想法可能会在法庭上使用。想象一下当你通过数据中独特的特征证明你的数据的持有者是从你那里得到的时候,他们会有多么震惊... - ErikE
1
@mplungjan 当然不是。但这仍然是一个很酷的想法,可以在许多情况下提供帮助。 - ErikE
显示剩余20条评论

249

我假设您已经设置了robots.txt

正如其他人提到的那样,网络爬虫可以伪造其活动的几乎每一个方面,因此很难确定来自不良方的请求。

我的建议是:

  1. 设置一个名为/jail.html的页面。
  2. robots.txt中禁止访问此页面(这样尊重规则的搜索引擎就不会访问)。
  3. 在您网站的一个页面上加入一个链接,使用CSS隐藏该链接(display:none)。
  4. 记录访问/jail.html的IP地址。

这可能有助于您快速确定来自不遵守robots.txt规则的不良爬虫的请求。

您还可以将/jail.html做成一个完整的网站,其标记与普通页面完全相同,但其中包含虚假数据(例如/jail/album/63ajdka/jail/track/3aads8等)。这样,直到您有机会完全阻止它们之前,不良爬取程序就不会被警觉到存在“异常输入”。


49
我曾经看过这种技术被称为“蜜罐”。这是一种在垃圾邮件过滤中也使用的技术,您可以在页面上放置一个电子邮件地址,但隐藏它或明确表示它不是用于人们发送合法邮件的。然后收集任何向该地址传送邮件的邮件服务器的IP地址。 - thomasrutter
13
假设它们正在爬取链接。大多数网络爬虫会尝试提交某种表单并抓取返回的数据。 - Byron Whitlock
9
我见过基于Perl的蜜罐邮件,其中包含由Perl脚本生成的其他“页面”链接。读取robots.txt文件的合法机器人不会查看它,并且通过CSS对用户隐藏,但是爬虫(或电子邮件收集器)很快就会陷入一个无限深度的页面树中,所有这些页面上都有错误数据。在每个页面的开头放置脚本链接。 - Stephen P
19
另一个可以用于蜜罐的好东西是teergrubing(或tarpitting)。这是一种我喜欢的古老技术——当你发现一个坏人时,通过故意保持他的连接尽可能长时间而不超时,使他的垃圾邮件/爬取过程变得非常缓慢。当然,这也可能会让他们意识到你已经发现了他们,但是做这件事真的很有趣。http://en.wikipedia.org/wiki/Teergrubing - womp
12
这种方法的唯一问题是,如果我在一个热门论坛上放置[img] http://yoursite/jail.html [/img]。你将会收到大量IP登录你的系统,很难过滤出哪些是恶意的。如果你想防止这种情况发生,你需要在URL中添加与IP相关联的令牌。类似于jail.php?t=hoeyvm,并且在数据库中,你有一个hoeyvm和请求页面的IP之间的关联。 - HoLyVieR
显示剩余9条评论

51

起诉他们。

认真的:如果你有一些钱,找一位精通互联网的好的、友好的年轻律师。你可能真的能够在这里做些什么。根据这些站点所在的地方,你可以请律师起草一份禁止令或你所在国家的等同物。你可能至少能吓唬那些混蛋。

记录插入虚拟值的过程。插入明显但含义隐晦指向你的虚拟值。我认为这是电话簿公司的常规做法,在德国,我认为已经有几个案例证明抄袭者通过他们复制的虚拟条目被抓住了。

如果这会让你搞砸你的HTML代码,拖慢SEO、有效性和其他东西,那将是一件遗憾的事情(即使一个使用每个请求的略微不同的HTML结构的模板系统,对于总是依赖HTML结构和类/ID名称来获取内容的爬取者来说可能已经有很大的帮助)。

像这样的案例正是版权法所适用的范围。盗用别人的劳动成果以赚钱,是你应该能够反抗的事情。


12
仅适用于法律框架稳固的国家。 - TomL
3
律师靠冲突为生,并从中获利。很少有律师会建议你不去法院。任何一个曾经这样做的人都会告诉你,胜利和失败与“正义”的精细概念没有任何关系,而是取决于当天的争论、情绪和偏见。请记住,如果出现问题,你可能不仅要承担自己律师的费用,而且还要承担其他方的费用,如果他们决定反诉——那么。你可能轻易失去你的家和生活中的任何其他资产。这不是我建议你去冒险的事情。我建议你尽一切可能避免进入法庭。 - Frankie
3
我同意@TomL的看法。如果他们在西方国家,这还有点合理。但如果他们在印度/中国/俄罗斯/乌克兰或其他类似的国家,那么,说实话,成功的机会少之又少。至少对于俄罗斯法院而言,他们甚至不会费心处理你的诉求。 - Highstaker

34

你真的无法完全防止这种情况发生。爬虫可以伪造他们的用户代理,使用多个IP地址等方式,并表现得像普通用户一样。唯一能做的就是在页面加载时不使文本可用-用图像、Flash或使用JavaScript加载。然而,前两个方法都不好,最后一个对于一些常规用户没有启用JavaScript将成为一个无障碍问题。

如果他们绝对会猛攻你的网站并浏览你所有的页面,你可以进行某种限制速率的控制。

但有一些希望。爬虫依赖于您网站的数据以一致的格式存在。如果你可以以某种方式对其进行随机化处理,它可能会破坏他们的爬虫。例如,在每次加载时更改页面元素的ID或类名称等内容。但是,这需要大量的工作,我不确定是否值得这么做。即使如此,他们可能还是能够通过足够的耐心和努力绕过这个问题。


14
限制每个 IP 地址每分钟可以查看的页面数量是一种不错的技巧,因为屏幕抓取程序会比普通人更快地遍历整个网站。 - TravisO
同意。IP地址需要花费金钱,并且大多数托管公司都有限制。 - Tal Weiss
“像在每次加载时更改页面元素的ID或类名之类的事情。” 如果您通过PHP创建类名,然后仅使用<div class = "<?php echo $myPHPGeneratedClassName; ?>">,那么这并不是太糟糕,您甚至可以在其中使用随机字符串使其完全唯一。 任何阻止它们找到模式的东西都会使从DOM中解析出来变得更加困难。 - niggles
@niggles:唯一的问题是您需要动态生成关联的CSS或将其嵌入页面中,以便随机类名与CSS选择器匹配。然后,您将无法使用所有静态内容分发的优化策略(例如CDN)。 - André Caron
1
作为一个“好人”爬虫(获取政府公开的PDF文档),IP的请求限制是整体策略的一个很好的补充。你必须找到适合你网站的合理限制。例如:大型目录网站:每秒3个请求,每分钟20个请求(假设真实用户会同时打开多个标签页),每小时100个请求。 - Victor Marconi
显示剩余2条评论

33
提供一个简单易用的XML API来访问您的数据,如果人们需要您的数据,他们就会获得它,因此您应该尽力而为。
这样,您可以以有效的方式提供功能的子集,确保至少不会有爬虫程序消耗大量的HTTP请求和带宽。
然后,您只需要说服需要您的数据的人使用API即可。 ;)

3
这个建议非常合理。屏幕抓取确实很难预防,但如果提供API,则可以对其进行一些限制,添加通知(“来自----.com的内容”),并基本控制所提供的数据。 - alecwh
6
@alecwh: 并收取访问费! - André Caron
3
我已经授予你赏金,部分原因是如果每个网站都这样做,网络将会更好。让我们希望它变得更加普遍。 - Jonas Czech
2
一旦您让他们注册该服务,他们将返回正常的网站。 - mplungjan
我是这次对话的另一方。我为百老汇演出建立模型,不得不抓取所有数据而不是直接访问。 - Yaakov Bressler

22

很抱歉,这确实非常困难...

如果您的内容受版权保护,我建议您礼貌地要求他们不要使用您的内容。

如果他们不下架,您可以采取进一步行动并向他们发送停止和禁止信函

通常,无论您采取什么措施来防止网络爬虫抓取,可能会产生更消极的影响,例如可访问性、机器人/蜘蛛等。


13

好的,像所有帖子所说的那样,如果你想让它对搜索引擎友好,那么机器人肯定可以爬取。

但是你仍然可以做一些事情,这可能会影响60-70%的爬网页机器人。

制作一个检查脚本,如下所示。

如果特定IP地址访问非常快,则在几次访问后(5-10),将其IP地址+浏览器信息放入文件或数据库中。

下一步

(这将是一个后台进程,始终运行或定期几分钟运行。)制作另一个脚本,将继续检查这些可疑的IP地址。

案例1. 如果用户代理是已知搜索引擎(如Google,BingYahoo)之一,您可以通过搜索“用户代理”来获取更多信息。 然后必须参见http://www.iplists.com/。此列表并尝试匹配模式。如果似乎是虚假的用户代理,则请在下次访问时填写CAPTCHA。(您需要对机器人IP地址进行更多的研究。我知道这是可以实现的,并且还尝试使用IP地址的whois 。它可能有帮助。)

案例2. 没有搜索机器人的用户代理:只需在下次访问时要求填写CAPTCHA。


使用iplists.com是一个极好的主意。 - Daniel Trebbien

11
晚来的回答 - 而且这个回答可能不是你想听到的...
我自己已经编写了许多(很多十个)不同的专业数据挖掘爬虫。(只是因为我喜欢“开放数据”哲学)
在其他答案中已经有很多建议了 - 现在我将扮演魔鬼的角色,扩展和/或纠正它们的有效性。
首先:
- 如果某人真的想要你的数据 - 你不能有效地(技术上)隐藏你的数据 - 如果数据应该公开访问给你的“普通用户”
尝试使用一些技术屏障不值得造成以下问题:
- 对于你的常规用户而言,会恶化他们的用户体验 - 对于常规和受欢迎的机器人(搜索引擎)也一样 - 以及其他等等...
纯粹的HTML——最简单的方法是解析带有明确定义的结构和CSS类的纯HTML页面。例如,足以使用Firebug检查元素,并在我的爬虫中使用正确的XPath和/或CSS路径。
你可以动态生成HTML结构,还可以动态生成CSS类名(以及CSS本身)(例如,使用一些随机类名)- 但是,你希望以一致的方式向常规用户呈现信息(例如,再次分析页面结构就足够设置爬虫)。可以通过自动分析一些“已知内容”来实现自动化,例如,当某人已经通过先前的爬取了解了“菲尔·科林斯”信息的内容时,只需显示“菲尔·科林斯”页面并(自动)分析页面的结构即可。不能为每个响应更改结构,因为常规用户会讨厌你。此外,这将为您(而不是爬虫)带来更多麻烦(维护)。XPath或CSS路径可以从已知内容中的爬取脚本自动确定。 Ajax-在开始时有点困难,但很多时候可以加快爬取过程的速度:) -为什么呢?
当分析请求和响应时,我只需设置自己编写的代理服务器(使用perl),然后在Firefox中使用它。当然,因为这是我的自有代理 - 它完全隐藏 - 目标服务器将其视为常规浏览器。 (因此,没有X-Forwarded-for等头)。
基于代理日志,大多数情况下可以确定ajax请求的“逻辑”,例如,我可以跳过大部分HTML抓取,只使用结构良好的ajax响应(主要是JSON格式)。
所以,ajax并没有太大帮助...
一些更复杂的页面使用了很多 压缩的javascript函数
在这里,可以使用两种基本方法:
  • 解压并理解JS,并创建一个遵循Javascript逻辑的爬虫(较困难的方式)
  • 或者(最好由我自己使用) - 只需使用Mozrepl的Mozilla进行抓取。例如,真正的抓取是在启用完整功能的JavaScript浏览器中完成的,该浏览器被编程为单击正确的元素并直接从浏览器窗口获取“解码”响应。
这种爬取方式很慢(像普通浏览器一样进行爬取),但是:
- 非常容易设置和使用 - 几乎不可能被打败 :) - “慢速”本身就可以对付“基于同一IP的快速请求阻止”
基于User-Agent的过滤根本没有帮助。任何认真的数据挖掘者都会在他的爬虫中设置正确的User-Agent。 需要登录也没有帮助。最简单的方法(无需分析或脚本化登录协议)是使用Mozilla作为普通用户登录到网站,然后运行基于Mozrepl的爬虫...
请记住,需要登录对于匿名机器人有用,但是对于想要爬取您数据的人来说并没有帮助。他只需注册成为您网站的普通用户即可。
使用框架也不是非常有效。许多实时电影服务都使用它,而且很容易被击败。框架只是另一个HTML/Javascript页面,需要进行分析...如果数据值得麻烦,数据挖掘者将完成所需的分析。
IP限制并不是很有效 - 有太多公共代理服务器和TOR... :) 对于那些真的想要你的数据的人来说,这并没有减缓网络爬虫。
从图像中提取隐藏数据非常困难。(例如,在服务器端将数据简单地转换为图像)。使用“tesseract”(OCR)可以帮助很多次 - 但老实说 - 数据必须值得网络爬虫去做这件事。(很多时候不值得)
另一方面,你的用户会因此而讨厌你。我自己(即使不是在爬取网站)也讨厌那些不允许复制页面内容到剪贴板的网站(因为信息都在图像中,或者(傻瓜式的)试图将右键绑定到某些自定义Javascript事件。:)
最难的是使用Java小程序或Flash的网站,小程序内部使用安全的https请求。但请三思而后行 - 你的iPhone用户会有多开心呢... ;). 因此,目前只有很少的网站在使用它们。我自己在浏览器中阻止所有闪存内容(在常规浏览会话中) - 从不使用依赖Flash的网站。
您的里程碑可能是...,因此您可以尝试这种方法 - 只需记住 - 您可能会失去一些用户。还要记住,某些SWF文件是可反编译的。 ;)
验证码(像reCaptcha这样的好东西)确实有很大帮助-但是您的用户会讨厌您... - 想象一下,当用户需要在显示有关音乐艺术家信息的所有页面上解决某些验证码时,您的用户将会多么爱您。
可能不需要继续了-您已经了解情况了。
现在您应该做什么:
记住:如果您想以友好的方式向常规用户发布数据,则几乎不可能隐藏您的数据。
所以,
  • 使您的数据易于访问 - 通过一些API
    • 这样可以轻松访问数据
    • 例如,卸载服务器的爬取 - 对您有好处
  • 设置正确的使用权(例如,必须引用来源)
  • 请记住,许多数据无法受版权保护 - 并且很难保护它们
  • 添加一些虚假数据(正如您已经完成的那样)并使用合法工具
    • 正如其他人所说,发送“停止和撤回信”
    • 其他法律行动(起诉等)可能过于昂贵且难以获胜(尤其是针对非美国网站)

在尝试使用某些技术障碍之前三思。

与其试图阻止数据挖掘者,不如增加网站的可用性。 您的用户会喜欢您。 投入技术障碍的时间(和精力)通常不值得 - 最好花时间让网站变得更好...

此外,数据窃贼不像普通窃贼。

如果您购买了一个廉价的家庭警报器并添加了一个警告“这个房子连接到警察局” - 许多窃贼甚至不会尝试闯入。 因为他的一举一动都可能使他进监狱...

所以,你只投入了一点点钱,但是小偷的投资和风险要多得多。但是数据小偷没有这样的风险。相反,如果你犯了一个错误(例如由于技术障碍导致了一些BUG),你将失去你的用户。如果爬虫第一次不起作用,什么都不会发生-数据挖掘者只会尝试另一种方法和/或调试脚本。在这种情况下,你需要投入更多的时间和精力-而爬取器的投资则较少。想想你想在哪里投资你的时间和精力... PS:英语不是我的母语-请原谅我的破英语...

@Parapluie,你真的应该阅读一下有关免费内容和/或开源模型的文章——了解它们的历史、目标和伦理。特别是关于开放数据,我创建了大部分的爬虫程序... - clt60
我确实理解这个概念,虽然我感谢您的博学建议。我们本可以就此展开有趣的对话;但似乎我的原始评论已被第三方删除。那么,我们真的自由了吗? - Parapluie

10

可能会阻碍新手网络爬虫的因素:

  • IP封锁
  • 使用大量Ajax技术
  • 检查referer请求头信息
  • 要求登录

通常能够帮助爬虫程序的因素:

  • 每周更改布局
  • robots.txt文件

可能有助于爬虫程序,但会让用户讨厌的因素:

  • 验证码

现在也有验证码解决程序。 - Yanjan. Kaf.

9

我在我的博客上做了很多网络爬虫,并总结了一些停止网络爬虫的技巧,具体内容请参考此链接

这是用户和爬虫之间的权衡。如果您限制IP、使用CAPTCHA、需要登录等,您会让爬虫的生活变得困难。但这也可能会赶走真正的用户。


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