我有一个相当大的音乐网站,里面有一个庞大的艺术家数据库。我一直注意到其他音乐网站在抓取我们网站的数据(我在这里和那里输入虚拟艺术家的名字,然后在谷歌上搜索它们)。
如何防止屏幕刮花?甚至可能吗?
我有一个相当大的音乐网站,里面有一个庞大的艺术家数据库。我一直注意到其他音乐网站在抓取我们网站的数据(我在这里和那里输入虚拟艺术家的名字,然后在谷歌上搜索它们)。
如何防止屏幕刮花?甚至可能吗?
注意:由于此答案的完整版本超出了 Stack Overflow 的长度限制,您需要前往 GitHub阅读扩展版本,其中包含更多提示和详细信息。
为了阻止抓取(也称为Webscraping、Screenscraping、Web 数据挖掘、Web 收获或Web 数据提取),了解这些抓取器是如何工作的,进而了解是什么阻止了它们正常工作是有帮助的。
有各种类型的刮刀,每种都有不同的工作方式:
蜘蛛,如谷歌的机器人或网站复制器,如HTtrack,它们递归地跟随到其他页面的链接以获取数据。这些有时用于有针对性的抓取以获取特定数据,通常与 HTML 解析器结合使用以从每个页面中提取所需的数据。
Shell 脚本:有时,常用的 Unix 工具用于抓取:Wget 或 Curl 用于下载页面,Grep (Regex) 用于提取数据。
HTML 解析器,例如基于 Jsoup、Scrapy等的解析器。类似于基于 shell 脚本正则表达式的那些,它们通过基于 HTML 中的模式从页面中提取数据来工作,通常忽略其他所有内容。
例如:如果你的网站有搜索功能,这样的爬虫可能会提交搜索请求,然后从结果页面 HTML 中获取所有结果链接及其标题,以便专门只获取搜索结果链接及其标题. 这些是最常见的。
屏幕截图,基于例如。Selenium或PhantomJS,它们在真正的浏览器中打开您的网站,运行 JavaScript、AJAX 等,然后从网页中获取所需的文本,通常通过:
在页面加载并运行 JavaScript 后从浏览器获取 HTML,然后使用 HTML 解析器提取所需数据。这些是最常见的,因此许多破坏 HTML 解析器/抓取器的方法也适用于此。
截取渲染页面的屏幕截图,然后使用 OCR 从屏幕截图中提取所需的文本。这些很少见,只有真正想要您的数据的专用刮板才会设置它。
网络抓取服务,例如ScrapingHub或Kimono。事实上,有些人的工作是弄清楚如何抓取您的网站并提取内容供他人使用。
不出所料,专业的抓取服务是最难阻止的,但是如果您很难且费时地弄清楚如何抓取您的网站,那么这些(以及为此付费的人)可能不会费心抓取您的网站。
使用框架将您的网站嵌入到其他网站的页面中,并将您的网站嵌入到移动应用程序中。
虽然在技术上不是抓取,但移动应用程序(Android 和 iOS)可以嵌入网站,并注入自定义 CSS 和 JavaScript,从而彻底改变页面的外观。
人工复制 - 粘贴:人们会复制并粘贴您的内容,以便在其他地方使用。
这些不同类型的爬虫之间有很多重叠,并且许多爬虫的行为相似,即使它们使用不同的技术和方法。
这些技巧主要是我自己的想法,我在写爬虫时遇到的各种困难,以及来自互联网的一些信息和想法。
你不能完全阻止它,因为无论你做什么,坚定的刮刀仍然可以弄清楚如何刮。但是,您可以通过执行以下操作来停止大量抓取:
定期检查您的日志,如果出现表明自动访问(抓取工具)的异常活动,例如来自同一 IP 地址的许多类似操作,您可以阻止或限制访问。
具体来说,一些想法:
速率限制:
仅允许用户(和爬虫)在特定时间内执行有限数量的操作 - 例如,仅允许每秒从任何特定 IP 地址或用户进行几次搜索。这将减慢刮板的速度,并使它们无效。如果操作完成得比真实用户快或快,您还可以显示验证码。
检测异常活动:
如果您看到异常活动,例如来自特定 IP 地址的许多类似请求、有人查看过多页面或执行异常数量的搜索,您可以阻止访问,或为后续请求显示验证码。
不要只通过 IP 地址监控和速率限制 - 也可以使用其他指标:
如果您确实进行了阻止或速率限制,请不要仅针对每个 IP 地址进行操作;您可以使用其他指标和方法来识别特定用户或爬虫。一些可以帮助您识别特定用户/抓取工具的指标包括:
用户填写表单的速度,以及他们点击按钮的位置;
您可以使用 JavaScript 收集大量信息,例如屏幕大小/分辨率、时区、安装的字体等;您可以使用它来识别用户。
HTTP 标头及其顺序,尤其是 User-Agent。
例如,如果您从一个 IP 地址收到许多请求,所有请求都使用相同的用户代理、屏幕大小(由 JavaScript 确定),并且用户(在本例中为抓取工具)总是以相同的方式和以相同的速度点击按钮定期,它可能是一个屏幕刮板;并且您可以暂时阻止类似的请求(例如,阻止来自该特定 IP 地址的具有该用户代理和屏幕大小的所有请求),这样您就不会给该 IP 地址上的真实用户带来不便,例如。在共享互联网连接的情况下。
您还可以更进一步,因为您可以识别相似的请求,即使它们来自不同的 IP 地址,这表明分布式抓取(使用僵尸网络或代理网络的抓取器)。如果您收到很多其他相同的请求,但它们来自不同的 IP 地址,您可以阻止。同样,请注意不要无意中阻止了真实用户。
这对于运行 JavaScript 的屏幕截图非常有效,因为您可以从中获取大量信息。
安全堆栈交换的相关问题:
如何唯一标识具有相同外部 IP 地址的用户?了解更多详情,以及
当 IP 地址经常变化时,为什么人们会使用 IP 地址禁令?有关这些方法的限制的信息。
不要暂时阻止访问,而是使用验证码:
实现速率限制的简单方法是暂时阻止访问一段时间,但是使用验证码可能更好,请参阅下面的验证码部分。
如果您的网站可行,则需要创建帐户才能查看您的内容。这对于爬虫来说是一个很好的威慑,但对于真实用户来说也是一个很好的威慑。
为了避免脚本创建许多帐户,您应该:
需要一个电子邮件地址进行注册,并通过发送一个必须打开才能激活帐户的链接来验证该电子邮件地址。每个电子邮件地址只允许一个帐户。
需要在注册/帐户创建期间解决验证码。
要求创建帐户才能查看内容会驱走用户和搜索引擎;如果您需要创建帐户才能查看文章,则用户将转到其他地方。
有时,爬虫将从 Web 托管服务运行,例如 Amazon Web Services 或 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
。这(和类似的东西)将允许爬虫简单地遍历所有articleId
s 并以这种方式请求所有文章。确保您没有公开任何 API,即使是无意的。例如,如果您使用 AJAX 或来自 Adobe Flash 或 Java Applets(上帝保佑!)中的网络请求来加载您的数据,那么查看页面中的网络请求并找出这些请求的去向是微不足道的,并且然后进行反向工程并在抓取程序中使用这些端点。确保您混淆了您的端点,并使它们难以供其他人使用,如所述。
由于 HTML 解析器的工作原理是根据 HTML 中可识别的模式从页面中提取内容,因此我们可以故意更改这些模式以破坏这些抓取工具,甚至搞砸它们。这些技巧中的大多数也适用于其他刮板,如蜘蛛和屏幕刮板。
直接处理 HTML 的抓取工具通过从 HTML 页面的特定、可识别部分中提取内容来完成此操作。例如:如果您网站上的所有页面都有div
一个 id 为 的article-content
,其中包含文章的文本,那么编写脚本访问您网站上的所有文章页面,并提取article-content
div的内容文本是很简单的在每个文章页面上,瞧,刮板以可以在其他地方重复使用的格式包含您网站上的所有文章。
如果您经常更改 HTML 和页面结构,则此类抓取工具将不再起作用。
您可以经常更改 HTML 中元素的 id 和类,甚至可以自动更改。所以,如果你div.article-content
变成了类似的东西div.a4c36dda13eaf0
,并且每周都在变化,那么刮板最初会正常工作,但一周后会坏掉。确保也更改 ids / classes 的长度,否则刮板将使用它div.[any-14-characters]
来查找所需的 div。也要小心其他类似的孔..
如果无法从标记中找到所需的内容,则抓取工具将从 HTML 的结构方式中找到所需的内容。所以,如果你所有的文章页面都是相似的, a之后的每个div
里面的a都是文章内容,那么爬虫会根据它来获取文章内容。同样,为了打破这一点,您可以定期和随机地向您的 HTML 添加/删除额外的标记,例如。添加额外的 s 或s。使用现代服务器端 HTML 处理,这应该不会太难。div
h1
div
span
需要注意的事项:
这将是繁琐且难以实现、维护和调试的。
你会阻碍缓存。特别是如果您更改 HTML 元素的 id 或类,这将需要对您的 CSS 和 JavaScript 文件进行相应的更改,这意味着每次更改它们时,都必须由浏览器重新下载它们。这将导致重复访问者的页面加载时间更长,并增加服务器负载。如果一周只换一次,问题不大。
聪明的抓取工具仍然能够通过推断实际内容的位置来获取您的内容,例如。通过知道页面上的一大块文本很可能是实际文章。这使得仍然可以从页面中找到并提取所需的数据。Boilerpipe正是这样做的。
从本质上讲,确保脚本不容易为每个相似页面找到实际的、所需的内容。
有关如何在 PHP 中实现此功能的详细信息,另请参阅如何防止依赖于 XPath 的爬虫获取页面内容。
这有点类似于上一个技巧。如果您根据用户的位置/国家(由 IP 地址确定)提供不同的 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 隐藏),也不会访问该链接。/scrapertrap/
因为您在 robots.txt 中不允许访问,所以像 Google 之类的真正和可取的蜘蛛也不会访问该链接。
你可以让你scrapertrap.php
做一些事情,比如阻止访问它的 IP 地址,或者对来自该 IP 的所有后续请求强制验证码。
不要忘记/scrapertrap/
在 robots.txt 文件中禁用蜜罐 ( ),以免搜索引擎机器人落入其中。
您可以/应该将其与前面经常更改 HTML 的技巧结合起来。
也经常改变这个,因为爬虫最终会学会避免它。更改蜜罐 URL 和文本。还想考虑更改用于隐藏的内联 CSS,并改用 ID 属性和外部 CSS,因为爬虫将学会避免任何具有style
用于隐藏内容的 CSS 属性的东西。也可以尝试只在某些时候启用它,所以刮板最初可以工作,但会在一段时间后中断。这也适用于前面的提示。
恶意人员可以通过共享指向您的蜜罐的链接,甚至将该链接作为图像嵌入某处(例如,在论坛上)来阻止真实用户的访问。经常更改 URL,并使任何禁止时间相对较短。
如果您检测到明显是刮板,您可以提供虚假和无用的数据;这将破坏刮板从您的网站获取的数据。您还应该使此类虚假数据与真实数据无法区分,以便爬虫不知道他们被搞砸了。
举个例子:你有一个新闻网站;如果您检测到刮板,而不是阻止访问,而是提供虚假的、随机生成的文章,这将毒害刮板获得的数据。如果你让你的假数据与真实数据无法区分,你会让爬虫很难得到他们想要的东西,即真实的数据。
通常,懒惰编写的爬虫不会随请求发送用户代理标头,而所有浏览器以及搜索引擎蜘蛛都会发送。
如果您收到不存在用户代理标头的请求,您可以显示验证码,或者简单地阻止或限制访问。(或者提供如上所述的假数据,或者其他东西......)
欺骗是微不足道的,但作为针对写得不好的爬虫的一种措施,值得实施。
在某些情况下,爬虫将使用没有真正的浏览器或搜索引擎蜘蛛使用的用户代理,例如:
如果您发现网站上的爬虫使用了特定的用户代理字符串,而真正的浏览器或合法蜘蛛没有使用该字符串,您也可以将其添加到黑名单中。
真正的浏览器将(几乎总是)请求和下载图像和 CSS 等资产。HTML 解析器和抓取工具不会,因为它们只对实际页面及其内容感兴趣。
您可以记录对资产的请求,如果您看到大量仅针对 HTML 的请求,则可能是刮板。
请注意,搜索引擎机器人、古老的移动设备、屏幕阅读器和配置错误的设备也可能不会请求资产。
您可以要求启用 cookie 才能查看您的网站。这将阻止没有经验和新手的爬虫编写者,但是爬虫很容易发送 cookie。如果您确实使用并需要它们,您可以使用它们跟踪用户和抓取工具的操作,从而针对每个用户而不是每个 IP 实施速率限制、阻止或显示验证码。
例如:当用户进行搜索时,设置一个唯一的识别cookie。查看结果页面时,验证该 cookie。如果用户打开了所有的搜索结果(你可以从 cookie 中看出),那么它很可能是一个爬虫。
使用 cookie 可能无效,因为抓取工具也可以将 cookie 连同他们的请求一起发送,并根据需要丢弃它们。如果您的网站仅使用 cookie,您还将阻止禁用 cookie 的真实用户访问。
请注意,如果您使用 JavaScript 设置和检索 cookie,您将阻止不运行 JavaScript 的爬虫,因为它们无法检索和发送 cookie 及其请求。
您可以在页面本身加载后使用 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 端点。
刮板可以刮掉其他刮板:如果有一个网站从您的网站上刮取了内容,那么其他刮板可以从该刮板的网站上刮取。
维基百科关于网络抓取的文章。关于所涉及的技术和不同类型的网络爬虫的许多细节。
阻止脚本编写者每秒数百次抨击您的网站。关于一个非常相似的问题的问答 - 机器人检查网站并在商品一上市就购买。很多相关信息,尤其是。关于验证码和速率限制。
I will presume that you have set up robots.txt
.
As others have mentioned, scrapers can fake nearly every aspect of their activities, and it is probably very difficult to identify the requests that are coming from the bad guys.
I would consider:
/jail.html
.robots.txt
(so the respectful spiders will never visit).display: none
)./jail.html
.This might help you to quickly identify requests from scrapers that are flagrantly disregarding your robots.txt
.
You might also want to make your /jail.html
a whole entire website that has the same, exact markup as normal pages, but with fake data (/jail/album/63ajdka
, /jail/track/3aads8
, etc.). This way, the bad scrapers won't be alerted to "unusual input" until you have the chance to block them entirely.
起诉他们。
说真的:如果你有一些钱,就找一位熟悉互联网的优秀、友善、年轻的律师谈谈。你真的可以在这里做点什么。根据站点所在的位置,您可以让律师在您所在的国家/地区写出停止和终止或类似文件。你至少可以吓唬那些混蛋。
记录您的虚拟值的插入。插入清楚(但模糊)指向您的虚拟值。我认为这是电话簿公司的常见做法,在德国,我认为有好几次抄袭者通过他们 1:1 复制的虚假条目而遭到打击。
如果这会驱使您弄乱您的 HTML 代码、拖累 SEO、有效性和其他事情,那将是一种耻辱(即使模板系统对相同页面的每个请求使用稍微不同的 HTML 结构可能已经帮助很多总是依赖 HTML 结构和类/ID 名称来获取内容的爬虫。)
像这样的情况是版权法的好处。剥削别人的诚实工作来赚钱是你应该能够反对的事情。
提供 XML API 来访问您的数据;以易于使用的方式。如果人们想要你的数据,他们会得到它,你还不如全力以赴。
通过这种方式,您可以有效地提供部分功能,至少确保抓取工具不会占用 HTTP 请求和大量带宽。
然后,您所要做的就是说服希望您的数据使用 API 的人。;)
实际上,您无能为力来完全防止这种情况发生。爬虫可以伪造他们的用户代理,使用多个 IP 地址等,并以普通用户的身份出现。您唯一能做的就是在页面加载时使文本不可用 - 使用图像、flash 或使用 JavaScript 加载。但是,前两个是坏主意,如果没有为某些普通用户启用 JavaScript,最后一个将是可访问性问题。
如果他们绝对抨击您的网站并浏览您的所有页面,您可以进行某种速率限制。
不过还是有些希望的。抓取工具依赖于您网站的数据格式一致。如果你能以某种方式随机化它,它可能会破坏他们的刮刀。诸如在每次加载时更改页面元素的 ID 或类名等事情。但这是很多工作要做,我不确定是否值得。即便如此,他们也可以通过足够的奉献精神来解决这个问题。
对不起,这真的很难做到……
我建议您礼貌地要求他们不要使用您的内容(如果您的内容受版权保护)。
如果是并且他们没有将其删除,那么您可以采取进一步行动并向他们发送停止和终止信函。
一般来说,无论你做什么来防止抓取,最终都可能会产生更负面的影响,例如可访问性、机器人/蜘蛛等。
好的,正如所有帖子所说,如果你想让它对搜索引擎友好,那么机器人肯定可以抓取。
但是你仍然可以做一些事情,它可能对 60-70% 的抓取机器人有效。
制作一个检查脚本,如下所示。
如果某个特定 IP 地址的访问速度非常快,那么在几次访问 (5-10) 后,将其 IP 地址 + 浏览器信息放入文件或数据库中。
(这将是一个后台进程,一直运行或在几分钟后安排。)制作另一个脚本,继续检查那些可疑的 IP 地址。
案例 1. 如果用户代理是谷歌、必应、雅虎等知名搜索引擎(您可以通过谷歌搜索找到更多关于用户代理的信息)。然后你必须看到http://www.iplists.com/。此列表并尝试匹配模式。如果它看起来像一个伪造的用户代理,那么在下次访问时要求填写验证码。(您需要对机器人 IP 地址进行更多研究。我知道这是可以实现的,并且还可以尝试 IP 地址的 whois。这可能会有所帮助。)
案例 2. 没有搜索机器人的用户代理:只需要求在下次访问时填写验证码。
迟到的答案 - 而且这个答案可能不是你想听到的......
我自己已经写了很多(几十个)不同的专业数据挖掘爬虫。(只是因为我喜欢“开放数据”哲学)。
其他答案中已经有很多建议-现在我将扮演魔鬼的拥护者角色,并将扩展和/或纠正它们的有效性。
第一的:
尝试使用一些技术壁垒是不值得的麻烦,导致:
纯HMTL - 最简单的方法是解析纯 HTML 页面,具有明确定义的结构和 css 类。例如,使用 Firebug 检查元素就足够了,并在我的爬虫中使用正确的 Xpath 和/或 CSS 路径。
您可以动态生成 HTML 结构,也可以动态生成 CSS 类名(以及 CSS 本身)(例如,通过使用一些随机类名) - 但是
您不能更改每个响应的结构,因为您的普通用户会讨厌您。此外,这会给您(维护)带来更多麻烦,而不是刮刀。XPath 或 CSS 路径可由抓取脚本自动从已知内容中确定。
Ajax - 一开始有点难,但很多时候加速了抓取过程:) - 为什么?
在分析请求和响应时,我只是设置了自己的代理服务器(用 perl 编写),而我的 firefox 正在使用它。当然,因为它是我自己的代理 - 它是完全隐藏的 - 目标服务器将其视为普通浏览器。(因此,没有 X-Forwarded-for 和此类标头)。根据代理日志,大多数情况下可以确定 ajax 请求的“逻辑”,例如我可以跳过大部分 html 抓取,而只使用结构良好的 ajax 响应(主要是 JSON 格式)。
所以,ajax并没有多大帮助......
一些更复杂的页面使用大量 打包的 javascript 函数。
这里可以使用两种基本方法:
这种抓取速度很慢(抓取与常规浏览器一样),但它是
基于用户代理的过滤根本没有帮助。任何认真的数据挖掘者都会在他的刮板中将其设置为正确的。
需要登录- 没有帮助。击败它的最简单方法(无需任何分析和/或编写登录协议脚本)只是以普通用户身份登录网站,使用 Mozilla 并在运行基于 Mozrepl 的刮板之后......
请记住,要求登录对匿名机器人有帮助,但对想要抓取您的数据的人没有帮助。他只是将自己注册为您的网站的普通用户。
使用框架也不是很有效。许多现场电影服务都使用此功能,并且不难击败。这些框架只是另一个需要分析的 HTML/Javascript 页面......如果数据值得麻烦 - 数据挖掘器将进行所需的分析。
基于 IP 的限制根本无效 - 这里有太多公共代理服务器,还有 TOR ...... :) 它不会减慢抓取速度(对于真正想要您的数据的人)。
很难抓取隐藏在图像中的数据。(例如,简单地将数据转换为服务器端的图像)。使用“tesseract”(OCR)可以帮助很多次 - 但老实说 - 数据必须值得刮板的麻烦。(很多时候不值得)。
另一方面,您的用户会因此而讨厌您。我自己,(即使不抓取)讨厌不允许将页面内容复制到剪贴板的网站(因为信息在图像中,或者(愚蠢的)试图绑定到右键单击一些自定义 Javascript 事件。: )
最难的是使用java applet 或 flash的站点, applet 在内部使用安全的 https请求。但请三思而后行——您的 iPhone 用户会多么高兴……;)。因此,目前很少有网站使用它们。我自己,在我的浏览器中阻止所有 Flash 内容(在常规浏览会话中)——并且从不使用依赖于 Flash 的网站。
您的里程碑可能是……,因此您可以尝试这种方法 - 请记住 - 您可能会失去一些用户。另请记住,某些 SWF 文件是可反编译的。;)
验证码(好的验证码——比如 reCaptcha)有很大帮助——但你的用户会讨厌你……——想象一下,当你的用户需要解决所有显示音乐艺术家信息的页面中的一些验证码时,他们会如何爱你。
可能不需要继续 - 你已经进入了画面。
现在你应该做什么:
请记住:如果您希望将数据(以友好的方式)发布给您的普通用户,那么隐藏您的数据几乎是不可能的。
所以,
在尝试使用一些技术障碍之前,请三思而后行。
与其尝试阻止数据挖掘者,不如为您的网站可用性增加更多努力。您的用户会爱上您。投入技术障碍的时间(和精力)通常是不值得的 - 最好花时间制作更好的网站......
此外,数据窃贼与普通窃贼不同。
如果你买了一个便宜的家庭警报器并加上一个警告“这所房子与警察有关”——许多小偷甚至不会试图闯入。因为他的一个错误举动——他要进监狱了……
所以,你只投资了几块钱,但小偷投资和风险很大。
但是数据窃贼没有这样的风险。恰恰相反——如果你做了一个错误的举动(例如,如果你因为技术障碍而引入了一些BUG),你就会失去你的用户。如果抓取机器人第一次无法工作,则不会发生任何事情 - 数据挖掘器只会尝试另一种方法和/或调试脚本。
在这种情况下,您需要投入更多——而刮刀投入更少。
想想你想把时间和精力投入到哪里……
PS:英语不是我的母语-所以请原谅我的英语不好...
我做了很多网络爬虫,并 根据我觉得烦人的内容总结了一些技术来阻止我的博客上的网络爬虫。
这是您的用户和抓取工具之间的权衡。如果您限制 IP、使用 CAPTCHA、需要登录等,您会让爬虫变得困难。但这也可能会赶走您的真正用户。
可能对初学者刮板起作用的事情:
一般会有所帮助的事情:
有帮助但会让你的用户讨厌你的事情:
从技术的角度来看:当你一次用太多的查询打他们时,只需模拟谷歌的行为。这应该会制止很多事情。
从法律角度来看:听起来您发布的数据不是专有的。这意味着您正在发布不受版权保护的姓名和统计数据以及其他信息。
如果是这种情况,则抓取工具不会通过重新分发有关艺术家姓名等信息而侵犯版权。但是,当它们将您的网站加载到内存中时,它们可能会侵犯版权,因为您的网站包含受版权保护的元素(如布局等)。
我建议阅读 Facebook v. Power.com 并查看 Facebook 用来阻止屏幕抓取的论点。您可以通过多种合法方式来阻止某人抓取您的网站。它们可以是深远的和富有想象力的。有时法院会购买这些论点。有时他们不会。
但是,假设您要发布不受版权保护的公共领域信息,例如名称和基本统计信息……您应该以言论自由和开放数据的名义放手。也就是说,网络的全部内容。
不幸的是,您最好的选择是相当手动的:寻找您认为表明抓取并禁止其 IP 地址的流量模式。
既然你在谈论一个公共网站,那么使网站搜索引擎友好也将使网站抓取友好。如果搜索引擎可以抓取和抓取您的网站,那么恶意抓取工具也可以。这是一条很好的步行路线。
这可能不是您想要的答案,但为什么要隐藏您想要公开的内容呢?
当然有可能。为了 100% 的成功,请让您的网站离线。
实际上,您可以做一些使抓取更加困难的事情。谷歌会进行浏览器检查,以确保您不是抓取搜索结果的机器人(尽管这与大多数其他东西一样,可以被欺骗)。
您可以执行一些操作,例如在第一次连接到您的网站和随后的点击之间需要几秒钟。我不确定理想的时间是什么时候或确切的时间,但这是另一个想法。
我敢肯定还有其他几个人有更多的经验,但我希望这些想法至少能有所帮助。
您可以采取一些措施来尝试防止屏幕刮擦。有些不是很有效,而另一些(验证码)有效,但会妨碍可用性。您还必须记住,它可能会阻碍合法的网站抓取工具,例如搜索引擎索引。
但是,我假设如果您不希望它被刮掉,那意味着您也不希望搜索引擎对其进行索引。
以下是您可以尝试的一些事情:
如果我必须这样做,我可能会使用最后三个的组合,因为它们可以最大限度地减少对合法用户的不便。但是,您必须承认您无法以这种方式阻止所有人,一旦有人弄清楚如何绕过它,他们将能够永远刮掉它。然后,您可以在发现它们时尝试阻止它们的 IP 地址,我猜。
方法一(仅限小型站点):
提供加密/编码数据。
我使用 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”作为用户代理来抓取它们。
方法四:
确保所有用户标题都是有效的,我有时会提供尽可能多的标题以使我的爬虫看起来像一个真实的用户,其中一些甚至不像 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"
}
快速解决此问题的方法是设置一个诱杀/机器人陷阱。
制作一个页面,如果它打开了一定次数甚至完全打开,将收集某些信息,例如 IP 和诸如此类的信息(您也可以考虑不规则或模式,但这个页面根本不应该打开)。
在您的页面中创建一个链接,该链接使用 CSS display:none; 隐藏;或左:-9999px;位置:绝对;尝试将其放置在不太可能被忽略的位置,例如您的内容所在的位置,而不是您的页脚,因为有时机器人可以选择忘记页面的某些部分。
在您的 robots.txt 文件中,为您不希望友好机器人(哈哈,就像他们有笑脸!)收集信息并将此页面设置为其中之一的页面设置一大堆禁止规则。
现在,如果一个友好的机器人通过它应该忽略该页面。对,但这还不够好。制作更多这些页面或以某种方式重新路由页面以接受不同的名称。然后在您的 robots.txt 文件中与您希望忽略的页面一起为这些陷阱页面放置更多禁止规则。
收集这些机器人或进入这些页面的任何人的 IP,不要禁止它们,而是创建一个功能来在您的内容中显示面条文本,如随机数、版权声明、特定文本字符串、显示可怕图片,基本上是任何阻碍您的内容好内容。您还可以设置指向需要永远加载的页面的链接,即。在 php 中,您可以使用 sleep() 函数。如果爬虫有某种检测来绕过加载时间过长的页面,这将反击爬虫,因为一些编写良好的机器人被设置为一次处理 X 数量的链接。
如果您制作了特定的文本字符串/句子,为什么不去您最喜欢的搜索引擎搜索它们,它可能会告诉您您的内容在哪里结束。
无论如何,如果你从战术上和创造性地思考这可能是一个很好的起点。最好的办法是了解机器人是如何工作的。
我还考虑欺骗一些 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"
您无法停止正常的屏幕抓取。无论好坏,这是网络的本质。
您可以这样做,除非他们以注册用户身份登录,否则任何人都无法访问某些内容(包括音乐文件)。在 Apache 中做起来并不难。我认为在 IIS 中也不会太难。
与其将机器人列入黑名单,不如将它们列入白名单。如果您不想杀死前几个引擎的搜索结果,可以将它们的用户代理字符串列入白名单,这些字符串通常已广为人知。不太道德的机器人倾向于伪造流行的网络浏览器的用户代理字符串。排名前几位的搜索引擎应该会为您带来 95% 以上的流量。
使用其他发布者建议的技术,识别机器人本身应该相当简单。
一种方法是将内容作为 XML 属性、URL 编码字符串、带有 HTML 编码 JSON 的预格式化文本或数据 URI 提供,然后在客户端将其转换为 HTML。以下是一些这样做的网站:
斯凯奇:XML
<document
filename=""
height=""
width=""
title="SKECHERS"
linkType=""
linkUrl=""
imageMap=""
href="http://www.bobsfromskechers.com"
alt="BOBS from Skechers"
title="BOBS from Skechers"
/>
Chrome 网上应用店:JSON
<script type="text/javascript" src="https://apis.google.com/js/plusone.js">{"lang": "en", "parsetags": "explicit"}</script>
必应新闻:数据 URL
<script type="text/javascript">
//<![CDATA[
(function()
{
var x;x=_ge('emb7');
if(x)
{
x.src='data:image/jpeg;base64,/*...*/';
}
}() )
Protopage : URL 编码字符串
unescape('Rolling%20Stone%20%3a%20Rock%20and%20Roll%20Daily')
TiddlyWiki:HTML 实体 + 预格式化的 JSON
<pre>
{"tiddlers":
{
"GettingStarted":
{
"title": "GettingStarted",
"text": "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>
如果您查看以上任何内容的源代码,您会看到抓取只会返回元数据和导航。
我同意上面的大多数帖子,并且我想补充一点,您的网站对搜索引擎越友好,它就越容易被抓取。您可以尝试做一些非常容易让爬虫更难的事情,但这也可能会影响您的搜索能力......当然,这取决于您希望您的网站在搜索引擎上的排名。
大多数已经说过,但是您是否考虑过 CloudFlare 保护?我的意思是:
其他公司可能也这样做,CloudFlare 是我知道的唯一一家。
我很确定这会使他们的工作复杂化。由于速率限制(我使用简单的 AJAX 请求循环),当我试图废弃受 CloudFlare 保护的站点的数据时,我也曾被自动禁止 IP 4 个月。
如果您想查看一个很好的示例,请查看http://www.bkstr.com/。他们使用 aj/s 算法设置 cookie,然后重新加载页面,以便它可以使用 cookie 来验证请求是否在浏览器中运行。一个为抓取而构建的桌面应用程序肯定可以解决这个问题,但它会阻止大多数 cURL 类型的抓取。
生成 HTML、CSS 和 JavaScript。编写生成器比编写解析器更容易,因此您可以以不同的方式生成每个服务页面。你不能再使用缓存或静态内容。
将您的内容放在验证码后面意味着机器人将难以访问您的内容。然而,人类会感到不便,因此这可能是不希望的。