我有一个大型音乐网站,拥有大型艺术家数据库。我一直注意到其他音乐网站正在抓取我们网站的数据(我在这里和那里输入虚拟的艺术家名称,然后用google搜索它们)。
如何防止屏幕刮擦?可能吗
我有一个大型音乐网站,拥有大型艺术家数据库。我一直注意到其他音乐网站正在抓取我们网站的数据(我在这里和那里输入虚拟的艺术家名称,然后用google搜索它们)。
如何防止屏幕刮擦?可能吗
Answers:
注意:由于此答案的完整版本超出了Stack Overflow的长度限制,因此您需要前往GitHub阅读扩展版本,并获得更多提示和详细信息。
为了阻止抓取(也称为Web 抓取,屏幕抓取,Web数据挖掘,Web收集或Web数据提取),它有助于了解这些抓取器的工作方式,并通过扩展来阻止它们正常工作。
刮板有多种类型,每种都有不同的工作方式:
蜘蛛(例如Google的漫游器或HTtrack等网站复印机)会递归地跟踪到其他页面的链接以获取数据。这些有时有时用于有针对性的抓取,以获取特定的数据,通常与HTML解析器结合使用以从每个页面提取所需的数据。
Shell脚本:有时,常用的Unix工具用于抓取:Wget或Curl下载页面,而Grep(Regex)提取数据。
HTML解析器,例如基于Jsoup,Scrapy等的解析器。类似于基于shell脚本的正则表达式,它们的工作原理是基于HTML模式从页面提取数据,通常忽略其他所有内容。
例如:如果您的网站具有搜索功能,则此类刮板可能会提交搜索请求,然后从结果页面HTML中获取所有结果链接及其标题,以便专门仅获取搜索结果链接及其标题。 。这些是最常见的。
屏幕抓取工具,例如基于 Selenium或PhantomJS,它们可以在真实的浏览器中打开您的网站,运行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地址经常更改时,为什么人们使用IP地址禁令?有关这些方法的限制的信息。
代替临时阻止访问,请使用验证码:
实施速率限制的简单方法是在一段时间内临时阻止访问,但是使用验证码可能更好,请参阅下文中的验证码部分。
如果您的网站可行,则需要创建帐户才能查看您的内容。这对于刮板来说是很好的威慑力,但是对于实际用户也是很好的威慑力。
为了避免脚本创建多个帐户,您应该:
要求提供电子邮件地址进行注册,并通过发送必须激活才能激活该帐户的链接来验证该电子邮件地址。每个电子邮件地址仅允许一个帐户。
要求在注册/创建帐户时解决验证码。
要求创建帐户来查看内容将驱使用户和搜索引擎离开;如果您需要创建帐户才能查看文章,则用户将转到其他地方。
有时,将从Web托管服务(例如Amazon Web Services或GAE或VPS)运行抓取工具。限制来自此类云托管服务使用的IP地址的请求对您网站的访问(或显示验证码)。
同样,您也可以限制来自代理或VPN提供商使用的IP地址的访问,因为爬虫可能会使用此类代理服务器来避免检测到许多请求。
请注意,通过阻止来自代理服务器和VPN的访问,将会对真实用户产生负面影响。
如果您确实要阻止/限制访问,则应确保不要告诉刮板是什么原因导致刮板,从而为他们提供有关如何修复刮板的线索。因此,一个糟糕的主意将是显示错误页面,其中包含以下文本:
您IP地址的请求太多,请稍后再试。
错误,不存在用户代理标头!
而是显示一条友好的错误消息,该消息不会告诉刮板是什么原因造成的。像这样的东西要好得多:
helpdesk@example.com
问题仍然存在,您可以通过联系联系支持。如果实际用户看到这样的错误页面,这对用户也更加友好。您还应该考虑显示用于后续请求的验证码,而不是硬阻止,以防真实用户看到错误消息,从而您不会阻止并因此导致合法用户与您联系。
验证码(“完全自动化的测试可以区分计算机和人”)对于阻止刮板非常有效。不幸的是,它们在刺激用户方面也非常有效。
这样,当您怀疑可能的刮板并希望停止刮板时,如果它们不是刮板而是真正的用户,则它们也将在不阻止访问的情况下很有用。如果您怀疑刮板,则可能需要考虑在允许访问内容之前显示验证码。
使用验证码时要注意的事项:
不要自己动手,使用类似Google的reCaptcha之类的东西:它比自己实现验证码容易得多,比您可能会想出的一些模糊和扭曲的文本解决方案更易于使用(用户通常只需要勾选一个方框即可) ),而且脚本编写者要解决的问题比从您的网站提供的简单图片还要难得多
不要在HTML标记中包含针对验证码的解决方案:我实际上已经看到一个网站在页面本身中(尽管隐藏得很好)具有针对验证码的解决方案,因此非常无用。不要做这样的事情。同样,使用诸如reCaptcha之类的服务,也不会出现此类问题(如果使用正确)。
验证码可以批量解决:有一些验证码解决服务,可以由实际的低薪人员来批量解决验证码。同样,在这里使用reCaptcha是一个好主意,因为它们具有保护功能(例如,用户为解决验证码所花费的时间相对较短)。除非您的数据确实有价值,否则不太可能使用这种服务。
您可以将文本渲染到图像服务器端,然后将其显示出来,这将妨碍简单的抓取工具提取文本。
但是,这对屏幕阅读器,搜索引擎,性能以及几乎所有其他方面都是不利的。在某些地方,这也是非法的(由于无障碍环境,例如《美国残疾人法》),而且某些OCR也很容易规避,所以不要这样做。
您可以使用CSS Sprite进行类似的操作,但是会遇到相同的问题。
如果可行,请不要为脚本/机器人提供一种获取所有数据集的方法。例如:您有一个新闻站点,其中包含很多单独的文章。您可以通过现场搜索来搜索这些文章,以使这些文章无法访问;如果您没有所有文章的列表,站点上文章及其URL则只能通过搜索来访问这些文章。特征。这意味着想要将所有文章从您的网站上删除的脚本将不得不搜索所有可能出现在文章中的短语,以便找到所有短语,这将很耗时,效率极低并且有望使刮板放弃。
如果出现以下情况,这将无效:
example.com/article.php?articleId=12345
。这(和类似的东西)将使刮板可以简单地遍历所有articleId
s并以这种方式请求所有物品。确保您不公开任何API,即使是无意间也是如此。例如,如果您正在Adobe Flash或Java Applets(禁止上帝!)中使用AJAX或网络请求来加载数据,那么查看页面中的网络请求并弄清楚这些请求的去向是很简单的,并且然后进行反向工程,并在刮板程序中使用这些端点。确保对端点进行混淆处理,使它们难以为他人使用,如所述。
由于HTML解析器的工作原理是基于HTML中可识别的模式从页面中提取内容,因此我们可以有意地更改这些模式以破坏这些抓取工具,甚至将它们拼凑在一起。这些技巧大多数也适用于其他刮板,例如蜘蛛和筛板刮板。
直接处理HTML的抓取工具通过从HTML页面的特定部分(可识别的部分)提取内容来进行处理。例如:如果您网站上的所有页面都有一个div
ID为的ID(article-content
其中包含文章的文本),那么编写脚本来访问您网站上所有文章页面并提取article-content
div 的内容文本是很简单的。在每个文章页面和页眉上,抓取工具都以可在其他地方重复使用的格式来存储您网站中的所有文章。
如果您经常更改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中实现的详细信息。
这有点类似于上一个技巧。如果您根据用户的位置/国家/地区(由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隐藏),并且不会访问该链接。正版和理想的蜘蛛(例如Google的蜘蛛)也不会访问该链接,因为您不允许/scrapertrap/
使用robots.txt。
您可以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端点。
抓取工具可以抓取其他抓取工具:如果有一个网站上有您抓取的内容,其他抓取工具可以从该抓取工具的网站抓取。
维基百科有关Web抓取的文章。有关涉及的技术和不同类型的Web刮板的许多细节。
阻止脚本编写者每秒攻击您的网站数百次。关于一个非常相似的问题的问答-机器人检查网站并在销售后立即购买商品。很多相关信息,尤其是。在验证码和限速上。
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
还可以在编程时间/复杂度与财务收益之间取得平衡。
我想你已经建立了robots.txt
。
正如其他人提到的那样,抓取工具几乎可以伪造其活动的每个方面,并且很难识别来自坏人的请求。
我会考虑:
/jail.html
。robots.txt
(因此,尊敬的蜘蛛将永远不会访问)。display: none
)将其隐藏。/jail.html
。这可能有助于您快速识别来自刮板的请求,而这些请求显然无视您的robots.txt
。
你可能也想使你的/jail.html
整个整个网站具有相同的,准确的标记为正常的网页,而是用假数据(/jail/album/63ajdka
,/jail/track/3aads8
等)。这样,只有当您有机会完全阻止它们时,不良的刮板才会收到“异常输入”的警报。
告他们
认真地:如果您有钱,请与一个了解互联网的方式的好,好,年轻律师谈谈。您确实可以在这里做些事情。根据站点的所在位置,您可以让律师在您所在的国家/地区写上“停止与终止”或类似内容。您可能至少可以吓到这些混蛋。
记录下您的虚拟值的插入。插入明确(但晦涩)指向您的虚拟值。我认为这对电话簿公司来说是很普遍的做法,在德国,我认为在很多情况下,模仿者通过以1:1复制的伪造品而遭到破坏。
这将是一种耻辱,如果这会把你变成搞乱你的HTML代码,拖累SEO,有效性和其他东西(即使是对同一页面的每个请求使用了稍微不同的HTML结构的模板系统可能已经帮助很多反对始终依赖HTML结构和类/ ID名称来获取内容的抓取工具。)
像这样的情况就是版权法的优点。剥夺他人的诚实工作来赚钱是您应该与之抗衡的事情。
实际上,您无法采取任何措施完全防止这种情况发生。抓取者可以伪造其用户代理,使用多个IP地址等,然后以普通用户的身份出现。您唯一可以做的就是在加载页面时使文本不可用-使用图像,Flash或使用JavaScript进行加载。但是,前两个是个坏主意,如果您的某些常规用户未启用JavaScript,则最后一个将是可访问性问题。
如果他们绝对抨击您的网站并浏览所有页面,则可以进行某种速率限制。
虽然有一些希望。抓取工具依赖于您网站数据的格式一致。如果您能以某种方式将其随机化,则可能会破坏其刮板。诸如在每次加载时更改页面元素的ID或类名之类的事情,等等。但这需要做很多工作,我不确定是否值得。即使那样,他们也可能会以足够的奉献精神绕过它。
提供XML API来访问您的数据;以易于使用的方式。如果人们想要您的数据,他们会得到的,您不妨全力以赴。
通过这种方式,您可以有效地提供功能的子集,从而确保刮板至少不会消耗HTTP请求和大量带宽。
然后,您要做的就是说服希望您的数据使用API的人员。;)
好的,正如所有帖子所说,如果您想使其对搜索引擎友好,那么机器人肯定可以抓取。
但是您仍然可以做一些事情,它可能会对60-70%的抓取机器人产生影响。
制作如下所示的检查脚本。
如果特定IP地址的访问速度非常快,则在几次访问(5-10)之后,将其IP地址+浏览器信息放入文件或数据库中。
(这将是一个后台进程,并且始终运行或在几分钟后安排好时间。)制作另一个脚本,该脚本将继续检查那些可疑IP地址。
案例1.如果用户代理是Google,Bing和Yahoo这样的已知搜索引擎(您可以通过搜索来找到有关用户代理的更多信息)。然后,您必须看到http://www.iplists.com/。此列表并尝试匹配模式。如果它看起来像是伪造的用户代理,则要求在下次访问时填写验证码。(您需要对机器人IP地址进行更多研究。我知道这是可以实现的,还可以尝试IP地址的Whois。这可能会有所帮助。)
案例2:搜索机器人没有用户代理:只需在下次访问时填写验证码即可。
较晚的答案-而且这个答案可能不是您想要听到的...
我自己已经写了许多(数十个)不同的专用数据挖掘刮板。(因为我喜欢“开放数据”哲学)。
在其他答案中,这里已经有很多建议- 现在,我将扮演魔鬼的倡导者角色,并将扩大和/或纠正其效力。
第一:
尝试使用一些技术障碍并不值得麻烦,原因是:
纯HMTL最简单的方法是使用结构良好的CSS和CSS类来解析普通HTML页面。例如,足以使用Firebug检查元素,并在我的scraper中使用正确的Xpath和/或CSS路径。
您可以动态生成HTML结构,还可以动态生成CSS类名(以及CSS本身)(例如,通过使用一些随机的类名)-但是
您无法更改每个响应的结构,因为您的普通用户会讨厌您。另外,这将给您(维护)而不是刮板带来更多麻烦。XPath或CSS路径可由抓取脚本根据已知内容自动确定。
Ajax-开始时有点困难,但是很多时候都加快了抓取过程:)-为什么?
当分析请求和响应时,我只是设置了自己的代理服务器(用perl编写),而Firefox使用了它。当然,由于它是我自己的代理服务器-它被完全隐藏了-目标服务器将其视为常规浏览器。(因此,没有X-Forwarded-for和此类标头)。基于代理日志,多数情况下可以确定ajax请求的“逻辑”,例如,我可以跳过大多数html抓取,而仅使用结构良好的ajax响应(大多数为JSON格式)。
因此,ajax并没有太大帮助...
一些更加复杂的页面使用了 大量的javascript函数。
这里可以使用两种基本方法:
这样的抓取速度很慢(与常规浏览器一样完成抓取操作),但是
基于用户代理的过滤完全没有帮助。任何认真的数据挖掘者都会在其刮板上将其设置为正确的数据挖掘者。
需要登录 -没有帮助。击败它的最简单方法(无需任何分析和/或脚本化登录协议)是使用Mozilla以常规用户身份登录网站,然后在运行基于Mozrepl的刮板之后...
请记住,require登录对匿名机器人有帮助,但对于想要抓取您数据的人则无济于事。他只是将自己注册为您的常规用户。
使用框架也不是很有效。许多现场电影服务都使用此功能,因此很难击败它。框架只是另外一个需要分析的HTML / Javascript页面...如果数据值得解决-数据挖掘者将进行所需的分析。
基于IP的限制根本没有效果-这是太多的公共代理服务器,这也是TOR ... :)不会减慢抓取速度(对于真正想要您的数据的人)。
刮除数据隐藏在图像中非常困难。(例如,简单地将数据转换为服务器端的图像)。使用“ tesseract”(OCR)可以有很多帮助-但老实说-数据对于刮板来说一定是值得的麻烦。(很多次都不值得)。
另一方面,您的用户会为此而讨厌您。我自己(即使没有抓取)也讨厌网站不允许复制页面内容到剪贴板(因为信息在图像中,或者(愚蠢的)试图绑定到右键单击某些自定义Javascript事件)的网站: )
最难的是使用Java Applet或Flash的站点,Applet在内部使用安全的https请求本身。但是请三思而后行-您的iPhone用户会多么高兴...;)。因此,目前很少有网站使用它们。我本人,阻止了我浏览器中的所有Flash内容(在常规浏览会话中)-从未使用依赖Flash的网站。
您的里程碑可能是...,所以您可以尝试这种方法-请记住-您可能会失去一些用户。还请记住,某些SWF文件是可反编译的。;)
验证码(很好的验证码-如reCaptcha)很有帮助-但您的用户会讨厌您...-试想一下,当用户需要解决所有显示有关音乐艺术家信息的验证码时,您的用户会如何爱您。
可能不需要继续-您已经了解了。
现在您应该做什么:
切记:如果您另一方面希望以友好的方式将数据发布给常规用户,则几乎不可能隐藏您的数据。
所以,
在尝试使用一些技术障碍之前,请三思而后行。
与其试图阻止数据挖掘者,不如为您的网站可用性增加更多的努力。您的用户会爱上您。通常,花在技术障碍上的时间(和精力)是不值得的-最好花时间建立更好的网站...
另外,数据窃贼与普通窃贼不同。
如果您购买廉价的家庭警报器并添加警告“此房屋已连接到警察”,则许多小偷甚至不会试图闯入。因为他的一个错误举动-他将入狱...
因此,您仅投资几美元,但小偷投资却冒险。
但是数据窃贼没有这种风险。恰恰相反-如果您采取了错误的措施(例如,由于技术障碍而引入了一些BUG),则会失去用户。如果抓取机器人第一次无法使用,则什么也没发生-数据挖掘者将尝试另一种方法和/或调试脚本。
在这种情况下,您需要投资更多-刮板投资少得多。
只是想想您想在哪里投入时间和精力...
ps:英语不是我的母语-请原谅我破碎的英语...
从技术角度来看:只需模拟一下您一次遇到太多查询的情况下Google的行为。那应该停止很多。
从法律角度看:听起来您正在发布的数据不是专有数据。意味着您正在发布名称和统计信息以及其他无法获得版权的信息。
在这种情况下,抓取程序不会通过重新分配有关艺术家姓名等的信息来侵犯版权。但是,当它们将您的网站加载到内存中时,它们可能会侵犯版权,因为您的网站包含可版权保护的元素(例如布局等)。
我建议阅读有关Facebook v。Power.com的文章,并了解Facebook用于阻止屏幕抓取的参数。您可以采取多种合法方法来阻止他人抓取您的网站。他们可能具有深远的影响力和想象力。有时法院会接受这些论点。有时他们没有。
但是,假设您要发布不具版权的公共领域信息,例如名称和基本统计信息...,则应以言论自由和开放数据的名义让其公开。那就是网络的全部意义。
不幸的是,最好的选择是相当手动的:查找您认为表明已被抓取的流量模式,并禁止其IP地址。
由于您是在谈论公共站点,因此使站点搜索引擎更友好也将使站点易于抓取。如果搜索引擎可以抓取并抓取您的网站,那么恶意抓取工具也可以。这是一条细线。
当然可以。为了获得100%的成功,请使您的网站离线。
实际上,您可以做一些使刮刮困难的事情。Google会进行浏览器检查,以确保您不是抓取搜索结果的机器人(尽管像大多数其他东西一样,这也可能被欺骗)。
您可以执行以下操作,从首次连接到站点到随后的点击之间都需要几秒钟的时间。我不确定理想时间是什么时间或确切的时间,但这是另一个想法。
我敢肯定还有其他几位有很多经验的人,但是我希望这些想法至少有所帮助。
您可以采取一些措施来尝试防止屏幕刮擦。有些不是很有效,而另一些(验证码)是有效的,但是却妨碍了可用性。您还必须记住,这可能会阻止合法的网站抓取工具,例如搜索引擎索引。
但是,我假设如果您不希望将其抓取,则意味着您也不希望搜索引擎对其进行索引。
您可以尝试以下操作:
如果必须执行此操作,则可能会使用后三个的组合,因为它们将对合法用户的不便降到最低。但是,您必须接受,您将无法以这种方式阻止所有人,而且一旦有人弄清楚如何解决它,他们将能够永远刮擦它。然后,您可以在发现它们时尝试阻止它们的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");
?>
方法二:
如果无法阻止它们,则将它们拧成一堆,以提供虚假/无用的数据作为响应。
方法三:
阻止常见的抓取用户代理,您将在主要/大型网站中看到此信息,因为当您使用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"
}
快速的解决方法是设置一个诱杀/机器人陷阱。
制作一个页面,如果该页面打开了一定的时间甚至根本没有打开,它会收集某些信息,例如IP和其他信息(您也可以考虑不规则或模式,但根本不必打开此页面)。
在您的页面中为此链接创建一个链接,该页面已被CSS display:none;隐藏;或左:-9999px;positon:absolute; 尝试将其放置在不太可能被忽略的位置,例如您的内容所属的位置,而不是页脚,因为有时漫游器可以选择忽略页面的某些部分。
在您的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中也不会太困难。
一种方法是将内容用作XML属性,URL编码的字符串,带有HTML编码的JSON的预格式化文本或数据URI,然后在客户端上将其转换为HTML。以下是一些这样做的站点:
Skechers: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>
必应新闻:数据网址
<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>
{"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是我所知道的唯一一家。
我很确定这会使他们的工作复杂化。当我由于速率限制而尝试删除受CloudFlare保护的站点的数据时,我也有4个月自动被IP禁止(我使用了简单的AJAX请求循环)。
如果您想查看一个很好的例子,请访问http://www.bkstr.com/。他们使用j / s算法设置cookie,然后重新加载页面,以便页面可以使用cookie验证请求是否正在浏览器中运行。可以通过抓取构建的桌面应用肯定可以通过此方法获得,但是它将停止大多数cURL类型的抓取。