如何防止刮擦现场?[关闭]


301

我有一个大型音乐网站,拥有大型艺术家数据库。我一直注意到其他音乐网站正在抓取我们网站的数据(我在这里和那里输入虚拟的艺术家名称,然后用google搜索它们)。

如何防止屏幕刮擦?可能吗


9
您是否考虑过尝试通过IP或类似方法检测它们的抓取工具(检查日志),并完全伪造这些数据?这样,是的,他们会“抓取”您的网站,但是他们的“数据”将毫无用处。
Lasse V. Karlsen

30
颠倒的笑话和颠倒/扰乱的文字有人吗?
韦恩·维尔纳



2
@JonasCz真是讽刺。可悲的是,尽管遭到批评,但您的答案中包含了类似的建议。
托马什Zato -恢复莫妮卡

Answers:


325

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


为了阻止抓取(也称为Web 抓取屏幕抓取Web数据挖掘Web收集Web数据提取),它有助于了解这些抓取器的工作方式,并通过扩展来阻止它们正常工作。

刮板有多种类型,每种都有不同的工作方式:

  • 蜘蛛(例如Google的漫游器HTtrack等网站复印机)会递归地跟踪到其他页面的链接以获取数据。这些有时有时用于有针对性的抓取,以获取特定的数据,通常与HTML解析器结合使用以从每个页面提取所需的数据。

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

  • HTML解析器,例如基于Jsoup,Scrapy等的解析器。类似于基于shell脚本的正则表达式,它们的工作原理是基于HTML模式从页面提取数据,通常忽略其他所有内容。

    例如:如果您的网站具有搜索功能,则此类刮板可能会提交搜索请求,然后从结果页面HTML中获取所有结果链接及其标题,以便专门仅获取搜索结果链接及其标题。 。这些是最常见的。

  • 屏幕抓取工具,例如基于 SeleniumPhantomJS,它们可以在真实的浏览器中打开您的网站,运行JavaScript,AJAX等,然后通过以下方式从网页中获取所需的文本:

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

    • 截取渲染页面的屏幕截图,然后使用OCR从屏幕截图中提取所需的文本。这些很少见,只有真正想要您的数据的专用刮板才能进行设置。

  • Web爬网服务,例如ScrapingHub和服。实际上,有些人的工作是弄清楚如何抓取您的网站并提取内容供他人使用。

    毫不奇怪,专业的抓取服务最难以阻止,但是如果您很难弄清楚如何抓取您的网站,那么这些人(以及为此付费的人)可能不会为您的网站而烦恼。

  • 将您的网站嵌入带有框架的其他网站页面中,并将您的网站嵌入移动应用程序中。

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

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

这些不同类型的刮板之间有很多重叠,即使使用不同的技术和方法,许多刮板的行为也将相似。

这些技巧主要是我自己的想法,编写刮板时遇到的各种困难,以及来自Internet网上的一些信息和想法。

如何停止刮

您无法完全阻止它,因为无论您做什么,坚定的刮板仍然可以弄清楚如何刮。但是,您可以通过执行以下操作来停止大量抓取操作:

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

定期检查您的日志,如果发现异常活动指示自动访问(爬网程序),例如来自同一IP地址的许多类似操作,则可以阻止或限制访问。

具体来说,一些想法:

  • 速率限制:

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

  • 检测异常活动:

    如果您看到异常活动,例如来自特定IP地址的许多类似请求,有人看着过多的页面或执行异常数量的搜索,则可以阻止访问,或显示用于后续请求的验证码。

  • 不要只按IP地址监控和限制速率-也可以使用其他指标:

    如果您设置了限制或速率限制,则不要仅基于每个IP地址进行限制;您可以使用其他指标和方法来识别特定用户或抓取工具。可以帮助您识别特定用户/刮板的一些指标包括:

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

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

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

    例如,如果您从一个IP地址收到许多请求,则所有请求都使用相同的用户代理,屏幕大小(由JavaScript确定)和用户(在这种情况下为抓取工具)总是以相同的方式并在定期间隔,可能是屏幕刮板;并且您可以暂时阻止类似的请求(例如,阻止来自该特定IP地址的具有该用户代理和屏幕尺寸的所有请求),这样您就不会在该IP地址上给实际用户带来不便。如果共享Internet连接。

    您还可以更进一步,因为您可以识别类似的请求,即使它们来自不同的IP地址,也表示分布式抓取(使用僵尸网络或代理网络的抓取器)。如果收到许多其他相同的请求,但它们来自不同的IP地址,则可以阻止。同样,请注意不要无意间阻止了真实用户。

    这对于运行JavaScript的屏幕抓取工具可能是有效的,因为您可以从中获取很多信息。

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

  • 代替临时阻止访问,请使用验证码:

    实施速率限制的简单方法是在一段时间内临时阻止访问,但是使用验证码可能更好,请参阅下文中的验证码部分。

需要注册并登录

如果您的网站可行,则需要创建帐户才能查看您的内容。这对于刮板来说是很好的威慑力,但是对于实际用户也是很好的威慑力。

  • 如果需要创建和登录帐户,则可以准确跟踪用户和刮板操作。这样,您可以轻松地检测何时使用特定帐户进行抓取并禁止它。速率限制或检测滥用(例如在短时间内进行大量搜索)之类的事情变得更加容易,因为您可以识别特定的抓取工具,而不仅仅是IP地址。

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

  • 要求提供电子邮件地址进行注册,并通过发送必须激活才能激活该帐户的链接来验证该电子邮件地址。每个电子邮件地址仅允许一个帐户。

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

要求创建帐户来查看内容将驱使用户和搜索引擎离开;如果您需要创建帐户才能查看文章,则用户将转到其他地方。

阻止来自云托管和抓取服务IP地址的访问

有时,将从Web托管服务(例如Amazon Web Services或GAE或VPS)运行抓取工具。限制来自此类云托管服务使用的IP地址的请求对您网站的访问(或显示验证码)。

同样,您也可以限制来自代理或VPN提供商使用的IP地址的访问,因为爬虫可能会使用此类代理服务器来避免检测到许多请求。

请注意,通过阻止来自代理服务器和VPN的访问,将会对真实用户产生负面影响。

如果您阻止,请使您的错误消息不再描述

如果您确实要阻止/限制访问,则应确保不要告诉刮板是什么原因导致刮板,从而为他们提供有关如何修复刮板的线索。因此,一个糟糕的主意将是显示错误页面,其中包含以下文本:

  • 您IP地址的请求太多,请稍后再试。

  • 错误,不存在用户代理标头!

而是显示一条友好的错误消息,该消息不会告诉刮板是什么原因造成的。像这样的东西要好得多:

  • 抱歉,出了一些问题。如果helpdesk@example.com问题仍然存在,您可以通过联系联系支持。

如果实际用户看到这样的错误页面,这对用户也更加友好。您还应该考虑显示用于后续请求的验证码,而不是硬阻止,以防真实用户看到错误消息,从而您不会阻止并因此导致合法用户与您联系。

如果您怀疑刮板正在访问您的网站,请使用验证码。

验证码(“完全自动化的测试可以区分计算机和人”)对于阻止刮板非常有效。不幸的是,它们在刺激用户方面也非常有效。

这样,当您怀疑可能的刮板并希望停止刮板时,如果它们不是刮板而是真正的用户,则它们也将在不阻止访问的情况下很有用。如果您怀疑刮板,则可能需要考虑在允许访问内容之前显示验证码。

使用验证码时要注意的事项:

  • 不要自己动手,使用类似Google的reCaptcha之类的东西:它比自己实现验证码容易得多,比您可能会想出的一些模糊和扭曲的文本解决方案更易于使用(用户通常只需要勾选一个方框即可) ),而且脚本编写者要解决的问题比从您的网站提供的简单图片还要难得多

  • 不要在HTML标记中包含针对验证码的解决方案:我实际上已经看到一个网站在页面本身中(尽管隐藏得很好)具有针对验证码的解决方案,因此非常无用。不要做这样的事情。同样,使用诸如reCaptcha之类的服务,也不会出现此类问题(如果使用正确)。

  • 验证码可以批量解决:有一些验证码解决服务,可以由实际的低薪人员来批量解决验证码。同样,在这里使用reCaptcha是一个好主意,因为它们具有保护功能(例如,用户为解决验证码所花费的时间相对较短)。除非您的数据确实有价值,否则不太可能使用这种服务。

将您的文本内容作为图像显示

您可以将文本渲染到图像服务器端,然后将其显示出来,这将妨碍简单的抓取工具提取文本。

但是,这对屏幕阅读器,搜索引擎,性能以及几乎所有其他方面都是不利的。在某些地方,这也是非法的(由于无障碍环境,例如《美国残疾人法》),而且某些OCR也很容易规避,所以不要这样做。

您可以使用CSS Sprite进行类似的操作,但是会遇到相同的问题。

不要公开完整的数据集:

如果可行,请不要为脚本/机器人提供一种获取所有数据集的方法。例如:您有一个新闻站点,其中包含很多单独的文章。您可以通过现场搜索来搜索这些文章,以使这些文章无法访问;如果您没有所有文章的列表,站点上文章及其URL则只能通过搜索来访问这些文章。特征。这意味着想要将所有文章从您的网站上删除的脚本将不得不搜索所有可能出现在文章中的短语,以便找到所有短语,这将很耗时,效率极低并且有望使刮板放弃。

如果出现以下情况,这将无效:

  • 机器人/脚本无论如何都不想要/需要完整的数据集。
  • 您的文章是通过类似于的URL提供的example.com/article.php?articleId=12345。这(和类似的东西)将使刮板可以简单地遍历所有articleIds并以这种方式请求所有物品。
  • 还有其他方法可以最终找到所有文章,例如通过编写脚本来跟随文章中指向其他文章的链接。
  • 搜索“ and”或“ the”之类的内容几乎可以揭示所有内容,因此需要注意。(您可以通过仅返回前10或20个结果来避免这种情况)。
  • 您需要搜索引擎才能找到您的内容。

不要公开您的API,端点和类似内容:

确保您不公开任何API,即使是无意间也是如此。例如,如果您正在Adobe Flash或Java Applets(禁止上帝!)中使用AJAX或网络请求来加载数据,那么查看页面中的网络请求并弄清楚这些请求的去向是很简单的,并且然后进行反向工程,并在刮板程序中使用这些端点。确保对端点进行混淆处理,使它们难以为他人使用,如所述。

要阻止HTML解析器和抓取器:

由于HTML解析器的工作原理是基于HTML中可识别的模式从页面中提取内容,因此我们可以有意地更改这些模式以破坏这些抓取工具,甚至将它们拼凑在一起。这些技巧大多数也适用于其他刮板,例如蜘蛛和筛板刮板。

经常更改您的HTML

直接处理HTML的抓取工具通过从HTML页面的特定部分(可识别的部分)提取内容来进行处理。例如:如果您网站上的所有页面都有一个divID为的ID(article-content其中包含文章的文本),那么编写脚本来访问您网站上所有文章页面并提取article-contentdiv 的内容文本是很简单的。在每个文章页面和页眉上,抓取工具都以可在其他地方重复使用的格式来存储您网站中的所有文章。

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

  • 您可以频繁地甚至甚至自动地更改HTML中元素的id和元素类。因此,如果您div.article-content变成div.a4c36dda13eaf0,并且每周更换一次,则刮板最初可以正常工作,但一周后会损坏。请确保也更改ID /类的长度,否则抓取工具将用于div.[any-14-characters]查找所需的div。还要提防其他类似的孔。

  • 如果没有办法从标记中找到所需的内容,则抓取工具将按照HTML的结构方式进行查找。因此,如果您所有的文章页面都是相似的,而div在a div后面的每个内部h1都是文章内容,则抓取工具将根据该内容获得文章内容。再次,要打破这一点,您可以定期或随机地向HTML添加/删除额外的标记,例如。添加额外div的或span。使用现代服务器端HTML处理,这应该不太困难。

注意事项:

  • 这将是乏味且难以实现,维护和调试的。

  • 您将阻止缓存。特别是如果您更改HTML元素的ID或类,这将需要在CSS和JavaScript文件中进行相应的更改,这意味着每次更改它们时,都必须由浏览器重新下载它们。对于重复访问者,这将导致更长的页面加载时间,并增加服务器负载。如果您仅每周更改一次,则不会有太大问题。

  • 聪明的抓取工具仍然可以通过推断实际内容的位置来获取您的内容,例如 知道页面上的一大段文字很可能是实际的文章。这使得仍然可以从页面中查找并提取所需的数据。锅炉管正是这样做的。

本质上,请确保脚本很难为每个相似的页面找到实际的所需内容。

另请参阅如何防止依赖XPath的爬网程序获取页面内容,获取有关如何在PHP中实现的详细信息。

根据用户位置更改HTML

这有点类似于上一个技巧。如果您根据用户的位置/国家/地区(由IP地址确定)提供不同的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的蜘蛛)也不会访问该链接,因为您不允许/scrapertrap/使用robots.txt。

您可以scrapertrap.php做一些事情,例如阻止访问它的IP地址的访问,或者对来自该IP的所有后续请求强制验证码。

  • 不要忘记/scrapertrap/在robots.txt文件中禁止蜜罐(),以免搜索引擎机器人陷入其中。

  • 您可以/应该将其与之前频繁更改HTML的技巧结合起来。

  • 也应经常更改此方法,因为刮板最终将学会避免这种情况。更改蜜罐URL和文本。还需要考虑更改用于隐藏的内联CSS,并改用ID属性和外部CSS,因为抓取工具将学会避免style使用CSS属性隐藏内容的任何东西。有时也尝试仅启用它,这样刮板便会开始工作,但过一会儿就会损坏。这也适用于前面的技巧。

  • 恶意人员可以通过共享指向您的蜜罐的链接,甚至将该链接嵌入图像中的某个位置(例如在论坛上)来阻止实际用户的访问。经常更改URL,并使任何禁止时间都相对较短。

如果检测到刮板,则提供虚假和无用的数据

如果您发现明显是刮板的内容,则可以提供伪造和无用的数据;这会损坏抓取工具从您的网站获取的数据。您还应该使得不可能将此类假数据与真实数据区分开,以使抓取工具不知道它们被搞砸了。

例如:您有一个新闻网站;如果您检测到一个刮板,而不是阻止访问,则提供伪造的,随机生成的文章,这会破坏刮板获得的数据。如果您将假数据与真实数据区分开,那么刮板将很难获得他们想要的东西,即实际的真实数据。

如果用户代理为空/丢失,则不接受请求

通常,懒惰的抓取工具不会随请求一起发送用户代理标头,而所有浏览器以及搜索引擎抓取工具都将发送。

如果收到不存在用户代理标头的请求,则可以显示验证码,或者简单地阻止或限制访问。(或如上所述提供虚假数据,或其他。)

进行欺骗是微不足道的,但是作为一种针对写得不好的刮板的措施,值得实施。

如果用户代理是常用的刮板,则不接受请求;刮板使用的黑名单

在某些情况下,抓取工具将使用用户代理,而实际的浏览器或搜索引擎蜘蛛都不会使用该用户代理,例如:

  • “ 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。如果确实使用并需要它们,则可以与它们一起跟踪用户和刮板操作,从而根据每个用户而不是每个IP实施限速,阻止或显示验证码。

例如:当用户执行搜索时,设置一个唯一的标识cookie。查看结果页面时,请验证该cookie。如果用户打开了所有搜索结果(您可以从cookie中分辨出),则可能是刮板。

使用cookie可能无效,因为刮板也可以随其请求一起发送cookie,并根据需要将其丢弃。如果您的站点仅适用于cookie,那么您还将阻止已禁用cookie的真实用户的访问。

请注意,如果您使用JavaScript设置和检索Cookie,则会阻止不运行JavaScript的抓取工具,因为它们无法通过请求检索和发送Cookie。

使用JavaScript + Ajax加载您的内容

页面加载后,您可以使用JavaScript + AJAX加载内容。这将使不运行JavaScript的HTML解析器无法访问内容。这通常可以有效阻止新手和经验不足的程序员编写刮板。

意识到:

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

  • 搜索引擎也可能不会运行JavaScript,因此会阻止它们将您的内容编入索引。对于搜索结果页面而言,这可能不是问题,但对于其他事物(例如,文章页面)而言,可能不是问题。

混淆标记,来自脚本的网络请求以及其他所有内容。

如果使用Ajax和JavaScript加载数据,请模糊处理传输的数据。举例来说,您可以在服务器上对数据进行编码(使用诸如base64之类的简单代码或更复杂的数据),然后在通过Ajax提取数据之后将其解码并显示在客户端上。这将意味着检查网络流量的人员不会立即看到您的页面如何工作并加载数据,并且对于某人直接从您的终结点请求请求数据将变得更加困难,因为他们将不得不对您的解扰算法进行反向工程。

  • 如果确实使用Ajax来加载数据,则应该不首先加载页面就很难使用端点,例如,通过要求一些会话密钥作为参数,您可以将其嵌入到JavaScript或HTML中。

  • 您还可以将混淆后的数据直接嵌入到初始HTML页面中,并使用JavaScript对其进行反混淆并显示,这样可以避免额外的网络请求。这样做将使使用不运行JavaScript的纯HTML解析器提取数据变得更加困难,因为编写刮板的人将不得不对JavaScript进行反向工程(您也应该对其进行混淆)。

  • 您可能需要定期更改混淆方法,以破坏发现问题的刮板。

但是,执行以下操作有几个缺点:

  • 这将是乏味且难以实现,维护和调试的。

  • 对于实际运行JavaScript然后提取数据的刮板和屏幕刮板来说,这将是无效的。(尽管大多数简单的HTML解析器都无法运行JavaScript)

  • 如果实际用户禁用了JavaScript,它将使您的网站无法正常运行。

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

非技术:

  • 告诉人们不要刮擦,有些人会尊重它

  • 找律师

  • 使您的数据可用,提供一个API:

    您可以轻松获取数据,并需要注明出处和返回您网站的链接。也许收取$$。

杂:

  • 还有一些商业性的刮擦保护服务,例如Cloudflare或Distill Networks的防刮擦(此处详细介绍了它的工作方式),这些服务可以为您做更多的事情。

  • 在实际用户的可用性和防刮擦性之间找到平衡:您所做的一切都会以一种或另一种方式对用户体验产生负面影响,并做出让步。

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

  • 抓取工具可以抓取其他抓取工具:如果有一个网站上有您抓取的内容,其他抓取工具可以从该抓取工具的网站抓取。

进一步阅读:


11
把我带到了这里。相当令人印象深刻的答案。此外,还有相当惊人的修订历史。感谢您的帖子。您得到了赞成。不仅因为付出了很多努力,而且因为它对我很有用。
DaveTheMinion '16

1
好答案!这里有一些想法。A real browser will (almost always) request and download assets such as images and CSS对可访问性读者也适用吗?CAPTCHA已损坏,因此至少可能不会受到专业服务的阻碍。Cookie的使用需要在欧盟进行通知/同意。Find a balance between usability for real users and scraper-proofness还可以在编程时间/复杂度与财务收益之间取得平衡。
Eric J.

5
@JonH,如果他们有兴趣,他们会阅读。另外,我将其分为带有标题和子标题的段落,以便人们可以对其进行扫描并阅读所需的部分。实际上,关于SO有很多类似的长答案,人们确实读过它们。
JonasCz-恢复莫妮卡

2
@JoshCrozier-我只是认为像这样的网站不能很好地利用这些信息。我并不是说信息不好。
JonH '02

2
PS我对内容创意的隐写指纹可以在法院使用。想象一下,当您证明数据的拥有者通过直接在数据中的独特特征从您那里获得数据时感到震惊……
ErikE

241

我想你已经建立了robots.txt

正如其他人提到的那样,抓取工具几乎可以伪造其活动的每个方面,并且很难识别来自坏人的请求。

我会考虑:

  1. 设置页面,/jail.html
  2. 禁止访问中的页面robots.txt(因此,尊敬的蜘蛛将永远不会访问)。
  3. 将链接放在您的页面之一上,并用CSS(display: none)将其隐藏。
  4. 记录访问者的IP地址/jail.html

这可能有助于您快速识别来自刮板的请求,而这些请求显然无视您的robots.txt

你可能也想使你的/jail.html整个整个网站具有相同的,准确的标记为正常的网页,而是用假数据(/jail/album/63ajdka/jail/track/3aads8等)。这样,只有当您有机会完全阻止它们时,不良的刮板才会收到“异常输入”的警报。


48
我之前已经看过这种技术,称为“蜜罐”。这是垃圾邮件过滤中也使用的一种技术,您可以在页面上放置一个电子邮件地址,然后将其隐藏或清除,以防止人们向其发送合法邮件。然后收集将邮件传递到该地址的任何邮件服务器的IP地址。
thomasrutter

12
假设它们正在爬网链接。大多数抓取工具会尝试提交某种形式的表格,并对返回的数据进行抓取。
拜伦·惠特洛克

9
我已经看到了基于Perl的电子邮件蜜罐,这些蜜罐具有由Perl脚本生成的其他“页面”的链接。读取robots.txt的合法bot不会看它,并且它通过CSS对用户隐藏了,但是抓取器(或电子邮件收集器)迅速陷入了无限深度的页面树中,这些页面上都有不良数据。在每个页面的开头放置指向脚本的链接。
斯蒂芬·P

18
扔给蜜罐的另一个很棒的事情是Teergrubing(或柏油碎屑)。这是我喜欢的一种古老技术-当您发现一个坏人时,可以故意在不造成超时的情况下尽可能长时间地保持他的连接处于打开状态,从而使他的垃圾邮件/抓取过程更加繁琐。当然,这可能会提醒他们您也加入其中,但是天哪,这很有趣。en.wikipedia.org/wiki/Teergrubing
womp

11
这种方法的唯一问题是,如果我将[img] yoursite / jail.html [/ img]放在一个流行的论坛上。您将获得登录到系统的大量IP,很难过滤哪一个是不良的IP。如果要防止这种情况,则需要在URL中添加与IP关联的令牌。诸如jail.php?t = hoeyvm之类的东西,在数据库中,您有一个与hoeyvm和请求该页面的IP的关联。
HolyVieR

48

告他们

认真地:如果您有钱,请与一个了解互联网的方式的好,好,年轻律师谈谈。您确实可以在这里做些事情。根据站点的所在位置,您可以让律师在您所在的国家/地区写上“停止与终止”或类似内容。您可能至少可以吓到这些混蛋。

记录下您的虚拟值的插入。插入明确(但晦涩)指向您的虚拟值。我认为这对电话簿公司来说是很普遍的做法,在德国,我认为在很多情况下,模仿者通过以1:1复制的伪造品而遭到破坏。

这将是一种耻辱,如果这会把你变成搞乱你的HTML代码,拖累SEO,有效性和其他东西(即使是对同一页面的每个请求使用了稍微不同的HTML结构的模板系统可能已经帮助很多反对始终依赖HTML结构和类/ ID名称来获取内容的抓取工具。)

像这样的情况就是版权法的优点。剥夺他人的诚实工作来赚钱是您应该与之抗衡的事情。


9
仅在具有可靠法律框架的国家/地区有效。
TomL 2014年

3
律师在冲突中蓬勃发展-并从中获利。很少有律师会建议您不要上法庭。任何人都会告诉你,胜利和失败与美好的“正义”概念无关,而与当日的论点,情绪和偏见有关。请记住,如果出了错,您不仅要承担律师费用,而且还要承担其他方面的责任,而且如果他们决定反诉,也可能要承担责任。您很容易失去房屋和生活中的任何其他资产。我不建议赌博。我建议您不惜一切代价避免上法庭。
弗兰基(Frankie)2014年

3
我同意@TomL。如果他们在西方,那似乎是合理的。但是,如果他们在印度/中国/俄罗斯/乌克兰/任何地区,那么,严重的是,机会很小。关于俄罗斯法院,我可以说:他们甚至不会理会您的要求。
Highstaker

35

实际上,您无法采取任何措施完全防止这种情况发生。抓取者可以伪造其用户代理,使用多个IP地址等,然后以普通用户的身份出现。您唯一可以做的就是在加载页面时使文本不可用-使用图像,Flash或使用JavaScript进行加载。但是,前两个是个坏主意,如果您的某些常规用户未启用JavaScript,则最后一个将是可访问性问题。

如果他们绝对抨击您的网站并浏览所有页面,则可以进行某种速率限制。

虽然有一些希望。抓取工具依赖于您网站数据的格式一致。如果您能以某种方式将其随机化,则可能会破坏其刮板。诸如在每次加载时更改页面元素的ID或类名之类的事情,等等。但这需要做很多工作,我不确定是否值得。即使那样,他们也可能会以足够的奉献精神绕过它。


14
创建一个限制每分钟IP可以查看多少页面的系统是一个不错的技巧,因为屏幕抓取工具比任何普通人都要快得多地掠过该站点。
TravisO

同意 IP需要花费资金,并且受到大多数托管公司的限制。
塔尔·魏斯

回复:“诸如在每次加载时更改页面元素的ID或类名之类的事情。” 如果通过PHP创建一个类名然后使用<div class =“ <?php echo $ myPHPGeneratedClassName;?>”>,甚至可以在其中使用随机字符串使其完全唯一,那还不错。阻止他们寻找模式的任何事情都使得解析DOM变得更加困难。
niggles

不难找到IP。有很多代理,朋友计算机,工作计算机,学校计算机,图书馆计算机...
隐身时间:2010年

@ user257493:是的,但是我们在这里谈论的是在抓取数据的人。机会是他们不打算去多的努力只是为了收割数据。如果这样做的话,您最终将耗尽他们的IP供应。
ryeguy 2010年

31

提供XML API来访问您的数据;以易于使用的方式。如果人们想要您的数据,他们会得到的,您不妨全力以赴。

通过这种方式,您可以有效地提供功能的子集,从而确保刮板至少不会消耗HTTP请求和大量带宽。

然后,您要做的就是说服希望您的数据使用API​​的人员。;)


3
这似乎很合理。屏幕抓取是很难防止的,如果提供API,则可以对其进行一些限制,添加通知(“来自----.com的内容”),并基本上控制给出哪些数据。
alecwh 2010年

6
@alecwh:并收取访问费用!
安德烈·卡伦

3
我授予您赏金,部分原因是,如果每个网站都这样做,网络会变得更好。希望它变得更加普遍。
JonasCz-恢复莫妮卡

1
一旦您让他们注册该服务,他们就会返回正常站点
mplungjan '17

我就是这场对话的另一方。我为百老汇演出建立模型,必须抓取我的所有数据,而不是整齐地访问。
Yaakov Bressler

22

抱歉,做到这一点真的很难...

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

如果是的话,他们没有拒绝,那么您可以采取进一步的行动,并给他们发送停止和停止的信

通常,您为防止抓取所做的任何事情都可能最终带来负面影响,例如可访问性,漫游器/蜘蛛等。


12

好的,正如所有帖子所说,如果您想使其对搜索引擎友好,那么机器人肯定可以抓取。

但是您仍然可以做一些事情,它可能会对60-70%的抓取机器人产生影响。

制作如下所示的检查脚本。

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

下一步

(这将是一个后台进程,并且始终运行或在几分钟后安排好时间。)制作另一个脚本,该脚本将继续检查那些可疑IP地址。

案例1.如果用户代理是Google,BingYahoo这样的已知搜索引擎(您可以通过搜索来找到有关用户代理的更多信息)。然后,您必须看到http://www.iplists.com/。此列表并尝试匹配模式。如果它看起来像是伪造的用户代理,则要求在下次访问时填写验证码。(您需要对机器人IP地址进行更多研究。我知道这是可以实现的,还可以尝试IP地址的Whois。这可能会有所帮助。)

案例2:搜索机器人没有用户代理:只需在下次访问时填写验证码即可。


+1使用iplists.com是个好主意
Daniel Trebbien

10

较晚的答案-而且这个答案可能不是您想要听到的...

我自己已经写了许多(数十个)不同的专用数据挖掘刮板。(因为我喜欢“开放数据”哲学)。

在其他答案中,这里已经有很多建议- 现在,我将扮演魔鬼的倡导者角色,并将扩大和/或纠正其效力。

第一:

  • 如果有人真的想要您的数据
  • 无法有效地(技术上)隐藏数据
  • 您的“常规用户” 是否应该公开访问数据

尝试使用一些技术障碍并不值得麻烦,原因是:

  • 恶化普通用户的使用体验
  • 常规和受欢迎的机器人(搜索引擎)
  • 等等...

纯HMTL最简单的方法是使用结构良好的CSS和CSS类来解析普通HTML页面。例如,足以使用Firebug检查元素,并在我的scraper中使用正确的Xpath和/或CSS路径。

您可以动态生成HTML结构,还可以动态生成CSS类名(以及CSS本身)(例如,通过使用一些随机的类名)-但是

  • 您想以一致的方式向普通用户展示信息
  • 例如,再次-足以再次分析页面结构以设置刮板。
  • 并且可以通过分析一些“已知内容”来自动完成
    • 一旦有人已经知道(通过较早的刮擦),例如:
    • 包含有关“菲尔·柯林斯”的信息
    • 足够显示“ phil collins”页面,并(自动)“今天”分析页面的结构:)

您无法更改每个响应的结构,因为您的普通用户会讨厌您。另外,这将给您(维护)而不是刮板带来更多麻烦。XPath或CSS路径可由抓取脚本根据已知内容自动确定。

Ajax-开始时有点困难,但是很多时候都加快了抓取过程:)-为什么?

当分析请求和响应时,我只是设置了自己的代理服务器(用perl编写),而Firefox使用了它。当然,由于它是我自己的代理服务器-它被完全隐藏了-目标服务器将其视为常规浏览器。(因此,没有X-Forwarded-for和此类标头)。基于代理日志,多数情况下可以确定ajax请求的“逻辑”,例如,我可以跳过大多数html抓取,而仅使用结构良好的ajax响应(大多数为JSON格式)。

因此,ajax并没有太大帮助...

一些更加复杂的页面使用 大量的javascript函数

这里可以使用两种基本方法:

  • 解压并理解JS并创建遵循Javascript逻辑的刮板(困难的方式)
  • 或(最好由我自己使用)-仅将Mozilla与Mozrepl配合使用即可抓取。例如,真正的抓取是在功能齐全的启用JavaScript的浏览器中完成的,该浏览器被编程为单击正确的元素,然后直接从浏览器窗口中获取“已解码”的响应。

这样的抓取速度很慢(与常规浏览器一样完成抓取操作),但是

  • 非常容易设置和使用
  • 而且几乎不可能对付它:)
  • 并且无论如何都需要“慢速”来应对“阻止基于IP的快速相同请求”

基于用户代理的过滤完全没有帮助。任何认真的数据挖掘者都会在其刮板上将其设置为正确的数据挖掘者。

需要登录 -没有帮助。击败它的最简单方法(无需任何分析和/或脚本化登录协议)是使用Mozilla以常规用户身份登录网站,然后在运行基于Mozrepl的刮板之后...

请记住,require登录对匿名机器人有帮助,但对于想要抓取您数据的人则无济于事。他只是将自己注册为您的常规用户。

使用框架也不是很有效。许多现场电影服务都使用此功能,因此很难击败它。框架只是另外一个需要分析的HTML / Javascript页面...如果数据值得解决-数据挖掘者将进行所需的分析。

基于IP的限制根本没有效果-这是太多的公共代理服务器,这也是TOR ... :)不会减慢抓取速度(对于真正想要您的数据的人)。

刮除数据隐藏在图像中非常困难。(例如,简单地将数据转换为服务器端的图像)。使用“ tesseract”(OCR)可以有很多帮助-但老实说-数据对于刮板来说一定是值得的麻烦。(很多次都不值得)。

另一方面,您的用户会为此而讨厌您。我自己(即使没有抓取)也讨厌网站不允许复制页面内容到剪贴板(因为信息在图像中,或者(愚蠢的)试图绑定到右键单击某些自定义Javascript事件)的网站: )

最难的是使用Java Applet或Flash的站点,Applet内部使用安全的https请求本身。但是请三思而后行-您的iPhone用户会多么高兴...;)。因此,目前很少有网站使用它们。我本人,阻止了我浏览器中的所有Flash内容(在常规浏览会话中)-从未使用依赖Flash的网站。

您的里程碑可能是...,所以您可以尝试这种方法-请记住-您可能会失去一些用户。还请记住,某些SWF文件是可反编译的。;)

验证码(很好的验证码-如reCaptcha)很有帮助-但您的用户会讨厌您...-试想一下,当用户需要解决所有显示有关音乐艺术家信息的验证码时,您的用户会如何爱您。

可能不需要继续-您已经了解了。

现在您应该做什么:

切记:如果您另一方面希望以友好的方式将数据发布给常规用户,则几乎不可能隐藏您的数据。

所以,

  • 使您的数据易于访问-通过某些API
    • 这样可以轻松访问数据
    • 例如,使服务器免于刮擦-对您有好处
  • 设置正确的使用权(例如,必须引用来源)
  • 请记住,许多数据无法版权保护-并且很难保护它们
  • 添加一些虚假数据(如您所愿)并使用法律工具
    • 就像其他人已经说过的那样,发送“终止和终止函”
    • 其他法律诉讼(起诉或类似诉讼)可能过于昂贵且难以取胜(尤其是针对非美国网站)

在尝试使用一些技术障碍之前,请三思而后行。

与其试图阻止数据挖掘者,不如为您的网站可用性增加更多的努力。您的用户会爱上您。通常,花在技术障碍上的时间(和精力)是不值得的-最好花时间建立更好的网站...

另外,数据窃贼与普通窃贼不同。

如果您购买廉价的家庭警报器并添加警告“此房屋已连接到警察”,则许多小偷甚至不会试图闯入。因为他的一个错误举动-他将入狱...

因此,您仅投资几美元,但小偷投资却冒险。

但是数据窃贼没有这种风险。恰恰相反-如果您采取了错误的措施(例如,由于技术障碍而引入了一些BUG),则会失去用户。如果抓取机器人第一次无法使用,则什么也没发生-数据挖掘者将尝试另一种方法和/或调试脚本。

在这种情况下,您需要投资更多-刮板投资少得多。

只是想想您想在哪里投入时间和精力...

ps:英语不是我的母语-请原谅我破碎的英语...


@Parapluie您确实应该阅读有关免费内容和/或开源模型的信息 -有关日期,历史,目标和道德规范。特别是关于开放数据 -我为其创建了大多数刮板...
jm666 '18

我确实理解这个概念,尽管我感谢您的博学建议。我们可能对此进行了有趣的交谈;但似乎我的原始评论已被第三方删除。因此,我们毕竟真的有自由吗?
Parapluie

8

从技术角度来看:只需模拟一下您一次遇到太多查询的情况下Google的行为。那应该停止很多。

从法律角度看:听起来您正在发布的数据不是专有数据。意味着您正在发布名称和统计信息以及其他无法获得版权的信息。

在这种情况下,抓取程序不会通过重新分配有关艺术家姓名等的信息来侵犯版权。但是,当它们将您的网站加载到内存中时,它们可能会侵犯版权,因为您的网站包含可版权保护的元素(例如布局等)。

我建议阅读有关Facebook v。Power.com的文章,并了解Facebook用于阻止屏幕抓取的参数。您可以采取多种合法方法来阻止他人抓取您的网站。他们可能具有深远的影响力和想象力。有时法院会接受这些论点。有时他们没有。

但是,假设您要发布不具版权的公共领域信息,例如名称和基本统计​​信息...,则应以言论自由和开放数据的名义让其公开。那就是网络的全部意义。


1
即使您可能无法对信息进行版权保护,也可以在使用条款中明确提出禁止刮擦的条款。然后,发送违反使用条款的停止通知书。
安德烈·卡伦

1
发表言论和开放数据确实是互联网的精神!
Ciara

是的,言论自由等等。但是,抓取工具很可能会浪费OP的预算或带宽,以及复制不可复制的数据。
jpaugh

8

可能对初学者刮板不利的事情:

  • IP封锁
  • 使用大量的ajax
  • 检查引荐请求标头
  • 需要登录

总的来说会有所帮助的事情:

  • 每周更改您的布局
  • robots.txt

有帮助但会使您的用户讨厌您的事情:

  • 验证码

8

我做了很多Web抓取工作,并 根据发现的烦恼总结了一些技术来阻止博客上的Web抓取工作。

这是用户和刮板之间的折衷方案。如果限制IP,使用CAPTCHA,要求登录等,那么对于刮板来说,您将感到非常困难。但这也可能会驱走您的真实用户。


8

不幸的是,最好的选择是相当手动的:查找您认为表明已被抓取的流量模式,并禁止其IP地址。

由于您是在谈论公共站点,因此使站点搜索引擎更友好也将使站点易于抓取。如果搜索引擎可以抓取并抓取您的网站,那么恶意抓取工具也可以。这是一条细线。


4
IP阻止将使抓取速度变慢,但是这对于您的服务器也是一项繁重的工作。假设我为您提供了1000个代理服务器,但我仍然可以获得所需的数据,现在您的防火墙很混乱。
pguardiario 2012年

1
当您这样做时,它们将在您的身上水平移动。如今,100000个地址对他们来说不算什么,但是如果您尝试禁止所有地址,则会使您的网站变慢-并且它们将轮换IP进行多次访问,而不是一两次访问
mplungjan

6

当然可以。为了获得100%的成功,请使您的网站离线。

实际上,您可以做一些使刮刮困难的事情。Google会进行浏览器检查,以确保您不是抓取搜索结果的机器人(尽管像大多数其他东西一样,这也可能被欺骗)。

您可以执行以下操作,从首次连接到站点到随后的点击之间都需要几秒钟的时间。我不确定理想时间是什么时间或确切的时间,但这是另一个想法。

我敢肯定还有其他几位有很多经验的人,但是我希望这些想法至少有所帮助。


6

您可以采取一些措施来尝试防止屏幕刮擦。有些不是很有效,而另一些(验证码)是有效的,但是却妨碍了可用性。您还必须记住,这可能会阻止合法的网站抓取工具,例如搜索引擎索引。

但是,我假设如果您不希望将其抓取,则意味着您也不希望搜索引擎对其进行索引。

您可以尝试以下操作:

  • 在图像中显示文本。这是相当可靠的,比CAPTCHA减轻了用户的痛苦,但是这意味着他们将无法剪切和粘贴,并且无法缩放或使用。
  • 返回页面之前,请使用验证码并要求完成该操作。这是一种可靠的方法,也是给用户带来的最大痛苦。
  • 在查看页面之前,要求用户注册一个帐户,并确认其电子邮件地址。这将非常有效,但并非完全有效-屏幕抓取工具可能会设置一个帐户,并且可能会巧妙地编写其脚本来为其登录。
  • 如果客户端的用户代理字符串为空,则阻止访问。网站抓取脚本通常会被懒惰地编程,并且不会设置用户代理字符串,而所有Web浏览器都可以。
  • 您可以在发现屏幕抓取器用户代理字符串时为其设置黑名单。再次,这只会帮助延迟编码的用户;知道自己在做什么的程序员可以设置用户代理字符串来模拟Web浏览器。
  • 经常更改URL路径。进行更改时,请确保旧版本可以继续使用,但前提是只有一个用户很可能会打开其浏览器。很难预测新的URL路径是什么。如果脚本的URL是硬编码的,这将使脚本难以抓住它。最好使用某种脚本来执行此操作。

如果必须执行此操作,则可能会使用后三个的组合,因为它们将对合法用户的不便降到最低。但是,您必须接受,您将无法以这种方式阻止所有人,而且一旦有人弄清楚如何解决它,他们将能够永远刮擦它。然后,您可以在发现它们时尝试阻止它们的IP地址。


6
  1. 不,无法停止(以任何方式)
  2. 拥抱它。为什么不以RDFa的身份发布并变得对超级搜索引擎友好,并鼓励重复使用数据?人们会感谢您并在适当的时候提供信誉(请参见musicbrainz为例)。

这不是您可能想要的答案,但是为什么隐藏您要公开的内容?


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");
?>

方法二:
如果无法阻止它们,则将它们拧成一堆,以提供虚假/无用的数据作为响应。

方法三:
阻止常见的抓取用户代理,您将在主要/大型网站中看到此信息,因为当您使用User-Agent时无法使用“ python3.4”来抓取它们。

方法四:
确保所有用户标头均有效,有时我会提供尽可能多的标头,以使我的scraper看起来像是真实的用户,其中有些甚至不像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"
}

2

与其将机器人列入黑名单,不如将其列入白名单。如果您不想终止搜索引擎的搜索结果,则可以将其用户代理字符串列入白名单,这些字符串通常广为宣传。较不道德的机器人倾向于伪造流行的Web浏览器的用户代理字符串。排名靠前的几个搜索引擎应该会吸引超过95%的点击量。

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


2

快速的解决方法是设置一个诱杀/机器人陷阱。

  1. 制作一个页面,如果该页面打开了一定的时间甚至根本没有打开,它会收集某些信息,例如IP和其他信息(您也可以考虑不规则或模式,但根本不必打开此页面)。

  2. 在您的页面中为此链接创建一个链接,该页面已被CSS display:none;隐藏;或左:-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

1

您无法停止正常的屏幕抓取。不论好坏,这都是网络的本质。

可以做到,除非有人以注册用户身份登录,否则没有人可以访问某些东西(包括音乐文件)。在Apache中做起来并不难。我认为在IIS中也不会太困难。


1

一种方法是将内容用作XML属性,URL编码的字符串,带有HTML编码的JSON的预格式化文本或数据URI,然后在客户端上将其转换为HTML。以下是一些这样做的站点:

  • Skechers:XML

    <document 
     filename="" 
     height="" 
     width="" 
     title="SKECHERS" 
     linkType="" 
     linkUrl="" 
     imageMap="" 
     href=&quot;http://www.bobsfromskechers.com&quot; 
     alt=&quot;BOBS from Skechers&quot; 
     title=&quot;BOBS from Skechers&quot; 
    />
  • Chrome网上应用店:JSON

    <script type="text/javascript" src="https://apis.google.com/js/plusone.js">{"lang": "en", "parsetags": "explicit"}</script>
  • 必应新闻:数据网址

    <script type="text/javascript">
      //<![CDATA[
      (function()
        {
        var x;x=_ge('emb7');
        if(x)
          {
          x.src='data:image/jpeg;base64,/*...*/';
          } 
        }() )
  • 原型:URL编码的字符串

    unescape('Rolling%20Stone%20%3a%20Rock%20and%20Roll%20Daily')
  • TiddlyWiki:HTML实体+预先格式化的JSON

       <pre>
       {&quot;tiddlers&quot;: 
        {
        &quot;GettingStarted&quot;: 
          {
          &quot;title&quot;: &quot;GettingStarted&quot;,
          &quot;text&quot;: &quot;Welcome to TiddlyWiki,
          }
        }
       }
       </pre>
  • 亚马逊:延迟加载

    amzn.copilot.jQuery=i;amzn.copilot.jQuery(document).ready(function(){d(b);f(c,function() {amzn.copilot.setup({serviceEndPoint:h.vipUrl,isContinuedSession:true})})})},f=function(i,h){var j=document.createElement("script");j.type="text/javascript";j.src=i;j.async=true;j.onload=h;a.appendChild(j)},d=function(h){var i=document.createElement("link");i.type="text/css";i.rel="stylesheet";i.href=h;a.appendChild(i)}})();
    amzn.copilot.checkCoPilotSession({jsUrl : 'http://z-ecx.images-amazon.com/images/G/01/browser-scripts/cs-copilot-customer-js/cs-copilot-customer-js-min-1875890922._V1_.js', cssUrl : 'http://z-ecx.images-amazon.com/images/G/01/browser-scripts/cs-copilot-customer-css/cs-copilot-customer-css-min-2367001420._V1_.css', vipUrl : 'https://copilot.amazon.com'
  • XMLCalabash:命名空间XML +自定义MIME类型+自定义文件扩展名

       <p:declare-step type="pxp:zip">
            <p:input port="source" sequence="true" primary="true"/>
            <p:input port="manifest"/>
            <p:output port="result"/>
            <p:option name="href" required="true" cx:type="xsd:anyURI"/>
            <p:option name="compression-method" cx:type="stored|deflated"/>
            <p:option name="compression-level" cx:type="smallest|fastest|default|huffman|none"/>
            <p:option name="command" select="'update'" cx:type="update|freshen|create|delete"/>
       </p:declare-step>

如果您查看以上任何内容的源代码,则会看到抓取将仅返回元数据和导航。


所以...由于内容现在采用统一格式,因此这种方法使抓取更加容易。实际上,它不再被称为“ 抓取”:它被称为“ 解析”,并且它非常容易以编程方式进行。
jpaugh

1

多数人已经说过了,但是您是否考虑过CloudFlare保护?我的意思是:

图片描述

其他公司也可能这样做,CloudFlare是我所知道的唯一一家。

我很确定这会使他们的工作复杂化。当我由于速率限制而尝试删除受CloudFlare保护的站点的数据时,我也有4个月自动被IP禁止(我使用了简单的AJAX请求循环)。


1

我同意上面的大多数帖子,并且我想补充一点,您的网站对搜索引擎的友好程度越高,它的可抓取性就越大。您可以尝试做一些非常棘手的事情,这些事情会使抓取工具变得更困难,但这也可能会影响您的搜索能力...当然,这取决于您希望站点在搜索引擎上的排名。


0

将您的内容放在验证码后面意味着机器人将很难访问您的内容。但是,人类会感到不便,这可能是不希望的。


0

如果您想查看一个很好的例子,请访问http://www.bkstr.com/。他们使用j / s算法设置cookie,然后重新加载页面,以便页面可以使用cookie验证请求是否正在浏览器中运行。可以通过抓取构建的桌面应用肯定可以通过此方法获得,但是它将停止大多数cURL类型的抓取。


0

屏幕抓取器通过处理HTML来工作。而且,如果他们决心要获取您的数据,那么您在技术上将无能为力,因为人眼无法处理任何事情。从法律上讲,您可能会有所求助,这就是我的建议。

但是,您可以使用非基于HTML的表示逻辑来隐藏数据的关键部分

  • 为每个艺术家/专辑等生成Flash文件。
  • 为每个艺术家内容生成图像。也许只需一张艺术家姓名的图像等就足够了。通过将文本呈现到服务器上的JPEG / PNG文件并链接到该图像来实现此目的。

请记住,这可能会影响您的搜索排名。


0

生成HTML,CSS和JavaScript。写生成器比解析器容易,因此您可以不同地生成每个服务页面。然后,您将无法再使用缓存或静态内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.