如何防止网站刮取?

我有一个相当大的音乐网站,有一个很大的艺术家数据库。我一直注意到其他音乐网站在窃取我们网站的数据(我在这里和那里输入假艺人的名字,然后进行谷歌搜索)。

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

129215 次浏览

对不起,这真的很难做到……

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

如果是并且他们没有删除它,那么你可以采取进一步的行动,并向他们发送禁止函

一般来说,无论你做什么来防止抓取可能最终会产生更负面的影响,例如可访问性,机器人/蜘蛛等。

不幸的是,您最好的选择是手动的:寻找您认为指示抓取和禁止其IP地址的流量模式。

既然你谈论的是一个公共网站,那么让网站对搜索引擎友好也会让网站对抓取友好。如果一个搜索引擎可以抓取和刮除你的网站,那么恶意刮除者也可以。这是一条微妙的界线。

你真的没有什么办法可以完全防止这种情况。刮刮者可以伪造他们的用户代理,使用多个IP地址等,并以正常用户的身份出现。你唯一能做的就是让文本在页面加载时不可用——用图像、flash或JavaScript加载。然而,前两个都是糟糕的想法,如果JavaScript没有为一些常规用户启用,最后一个将是可访问性问题。

如果他们对你的网站进行了猛烈的攻击,并且浏览了你所有的页面,你可以做一些速率限制。

不过还是有希望的。刮刮器依赖于您的网站的数据是一致的格式。如果你能随机分配,它可能会打碎他们的刮刀。比如在每次加载时更改页面元素的ID或类名等。但这需要做很多工作,我不确定是否值得。即便如此,只要有足够的投入,他们可能就能解决这个问题。

当然,这是可能的。为了100%的成功,让你的网站离线。

在现实中,你可以做一些一些的事情,使刮痧有点困难。谷歌进行浏览器检查,以确保您不是一个抓取搜索结果的机器人(尽管这和大多数其他事情一样,可以被欺骗)。

你可以做一些事情,比如在第一次连接到你的网站和随后的点击之间需要几秒钟。我不确定理想的时间是什么,也不知道具体怎么做,但这是另一个想法。

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

将你的内容放在验证码后面意味着机器人将很难访问你的内容。然而,人类会不方便,所以这可能是不可取的。

我同意上面的大部分帖子,我想补充的是,你的网站对搜索引擎越友好,它就越容易被抓取。你可以尝试做一些让刮刀器更难的事情,但它也可能影响你的搜索能力……当然,这取决于你想让你的网站在搜索引擎上排名有多好。

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

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

然后,您所要做的就是说服想要您的数据的人使用API。;)

我假定你已经设置了robots.txt

正如其他人所提到的,刮刮器可以伪造其活动的几乎每个方面,并且可能很难识别来自坏人的请求。

我会考虑:

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

这可能会帮助你快速识别来自scraper公然无视你的robots.txt的请求。

你可能还想让你的/jail.html成为一个完整的网站,它拥有与正常页面相同的、精确的标记,但使用假数据(/jail/album/63ajdka/jail/track/3aads8等)。这样,在你有机会完全阻止它们之前,糟糕的抓取程序不会被提醒“异常输入”。

好吧,正如所有帖子所说,如果你想让它对搜索引擎友好,那么机器人肯定会刮。

但你仍然可以做一些事情,它可能适用于60% - 70%的抓取机器人。

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

如果一个特定的IP地址访问非常快,那么在几次访问(5-10次)后,将其IP地址+浏览器信息保存在文件或数据库中。

下一步

(这将是一个后台进程,并一直运行或在几分钟后调度。)制作另一个脚本,继续检查那些可疑的IP地址。

案例1。如果用户代理是一个已知的搜索引擎,如谷歌,必应雅虎(你可以通过谷歌搜索找到更多关于用户代理的信息)。然后你必须看到http://www.iplists.com/。这个列表,并尝试匹配模式。如果它看起来像一个伪造的用户代理,那么要求在下次访问时填写验证码。(你需要多研究一下机器人的IP地址。我知道这是可以实现的,也尝试了IP地址的whois。这是有帮助的。)

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

屏幕抓取器通过处理HTML来工作。如果他们决定要获取你的数据,从技术上讲你也无能为力,因为人的眼球可以处理任何东西。法律上已经指出,你可能有一些追索权,这是我的建议。

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

  • 为每个艺术家/专辑生成闪光文件,等等。
  • 为每个艺术家内容生成一个图像。也许只是一个艺术家名字的图像,等等就足够了。通过将文本呈现到服务器上的JPEG/PNG文件并链接到该图像来实现这一点。

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

起诉他们。

说正经的:如果你有钱,就找个懂网络的年轻律师谈谈。你真的可以在这里有所作为。根据网站所在地的不同,你可以请律师写一份终止协议。在你的国家停止或类似的行为。你至少能吓到那些混蛋。

记录插入的虚拟值。插入明确(但模糊)指向你的虚拟值。我认为这是电话簿公司的普遍做法,在德国,我想已经有几个例子,抄袭者通过1:1复制的虚假条目被破获。

如果这会让你弄乱HTML代码,拖低SEO,有效性和其他事情,这将是一种耻辱(即使一个模板系统在每个相同页面的请求上使用略微不同的HTML结构,可能已经帮助很多对抗总是依赖HTML结构和类/ID名称来获取内容的scraper)。

这类案件正是版权法所擅长的。剽窃别人的诚实工作来赚钱是你应该能够反对的事情。

  1. 不,不可能停止(以任何方式)
  2. 拥抱它。为什么不发布为RDFa,成为超级搜索引擎友好,并鼓励重复使用数据?人们会感谢你,并在适当的时候提供信用(以musicbrainz为例)。

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

你可以做一些事情来防止屏幕抓取。有些不是很有效,而另一些(验证码)是,但阻碍可用性。你必须记住,它也可能阻碍合法的网站刮刀,如搜索引擎索引。

然而,我认为如果你不希望它被删除,这意味着你也不希望搜索引擎索引它。

这里有一些你可以尝试的方法:

  • 在图像中显示文本。这是相当可靠的,对用户来说比验证码的痛苦要小,但这意味着他们不能剪切和粘贴,也不能很好地缩放或访问。
  • 使用验证码并要求在返回页面之前完成验证码。这是一种可靠的方法,但也是强加给用户的最大痛苦。
  • 要求用户在查看页面之前注册一个帐户,并确认他们的电子邮件地址。这将是相当有效的,但不是完全的-屏幕刮板可能会建立一个帐户,并巧妙地编程他们的脚本来登录他们。
  • 如果客户端的user-agent字符串为空,则阻止访问。站点抓取脚本通常是惰性编程,不会设置用户代理字符串,而所有的web浏览器都会设置。
  • 当您发现已知的屏幕刮板用户代理字符串时,可以设置一个黑名单。同样,这只会帮助那些惰性编码的;一个知道自己在做什么的程序员可以设置一个user-agent字符串来模拟web浏览器。
  • 经常更改URL路径。当您更改它时,请确保旧的继续工作,但只在一个用户可能打开浏览器的情况下工作。很难预测新的URL路径会是什么。如果URL是硬编码的,这将使脚本很难获取它。最好使用某种脚本来完成此操作。

如果我必须这样做,我可能会结合使用后三种方法,因为它们最大限度地减少了对合法用户的不便。然而,你必须接受这样的事实:你不可能用这种方式屏蔽所有人,一旦有人想出了绕过它的方法,他们就可以永远地刮掉它。我猜你可以在发现他们的时候屏蔽他们的IP地址。

你不能停止正常的屏幕抓取。不管是好是坏,这就是网络的本质。

可以使得没有人可以访问某些东西(包括音乐文件),除非他们作为注册用户登录。这并不太难。我想在IIS中也不会太难。

与其将机器人列入黑名单,不如将它们列入白名单。如果你不想让你的搜索结果失去前几个引擎,你可以把他们的用户代理字符串列入白名单,这通常是广为人知的。不那么道德的机器人倾向于伪造流行网络浏览器的用户代理字符串。排名靠前的几个搜索引擎应该会为你带来95%以上的流量。

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

生成HTML, CSS和JavaScript。编写生成器比编写解析器更容易,因此可以以不同的方式生成每个服务页面。这样就不能再使用缓存或静态内容了。

如果你想看一个很好的例子,查看http://www.bkstr.com/。他们使用j/s算法来设置cookie,然后重新加载页面,以便它可以使用cookie来验证请求是否正在浏览器中运行。一个为抓取而构建的桌面应用程序绝对可以做到这一点,但它会阻止大多数cURL类型的抓取。

从技术角度来看: 只需模拟谷歌在一次使用太多查询时的情况。

从法律角度来看: 听起来你发布的数据并不是私有的。这意味着你发布的名字、数据和其他信息是不受版权保护的。< / p >

如果是这种情况,刮刮器通过重新分发您的艺术家姓名等信息并没有侵犯版权。然而,当他们将你的网站加载到内存中时,他们可能侵犯了版权,因为你的网站包含了可版权的元素(如布局等)。

我建议你阅读Facebook诉Power.com的文章,看看Facebook如何阻止屏幕抓取。有很多合法的方法可以阻止别人窃取你的网站。他们可以影响深远,富有想象力。有时法院会相信这些论点。有时他们不会。

但是,假设你发布的是不受版权保护的公共领域信息,比如名字和基本数据……你应该以言论自由和开放数据的名义让它随风而逝。这就是网络的意义所在。

我做了很多网络搜索,并在我的博客上总结了一些我觉得讨厌的阻止网络抓取的技术

这是你的用户和刮刀者之间的权衡。如果你限制IP,使用验证码,要求登录,等等,你会给刮刀器带来困难。但这也可能会赶走真正的用户。

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

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

通常会有帮助的事情:

  • 每周改变你的布局
  • robots . txt

有帮助但会让你的用户讨厌你的东西:

  • 验证码

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

  • < p > 斯凯奇: 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 Web Store: JSON

    <script type="text/javascript" src="https://apis.google.com/js/plusone.js">{"lang": "en", "parsetags": "explicit"}</script>
    
  • Bing News: data URL

    <script type="text/javascript">
    //<![CDATA[
    (function()
    {
    var x;x=_ge('emb7');
    if(x)
    {
    x.src='data:image/jpeg;base64,/*...*/';
    }
    }() )
    
  • Protopage: URL Encoded Strings

    unescape('Rolling%20Stone%20%3a%20Rock%20and%20Roll%20Daily')
    
  • TiddlyWiki : HTML Entities + preformatted JSON

       <pre>
    {&quot;tiddlers&quot;:
    {
    &quot;GettingStarted&quot;:
    {
    &quot;title&quot;: &quot;GettingStarted&quot;,
    &quot;text&quot;: &quot;Welcome to TiddlyWiki,
    }
    }
    }
    </pre>
    
  • Amazon: Lazy Loading

    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: Namespaced XML + Custom MIME type + Custom File extension

       <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>
    

If you view source on any of the above, you see that scraping will simply return metadata and navigation.

快速解决这个问题的方法是设置一个陷阱。

  1. 制作一个页面,如果它被打开了一定的次数,甚至打开了所有,将收集某些信息,如IP和诸如此类的(你也可以考虑不规则或模式,但这个页面不应该被打开)。

  2. 在你的页面中创建一个链接,该链接隐藏在CSS display中:none;或左:-9999 px;阵地:绝对;试着把它放在不太可能被忽略的地方,比如你的内容落在下面,而不是你的页脚,因为有时机器人可以选择忘记页面的某些部分。

  3. 在robots.txt文件中,设置一大堆不允许规则,让你不想让友好的机器人(LOL,就像他们有快乐的脸一样!)收集信息,并将此页设置为其中之一。

  4. 现在,如果一个友好的机器人通过,它应该忽略那个页面。对,但这还不够好。多做几个这样的页面,或者以某种方式重新路由一个页面以接受不同的名称。然后在robots.txt文件中,在你想忽略的页面旁边放置更多禁止这些陷阱页面的规则。

  5. 收集这些机器人或进入这些页面的任何人的IP,不要禁止他们,但要在您的内容中显示面条文本,如随机数字,版权通知,特定的文本字符串,显示可怕的图片,基本上任何阻碍您的好内容。你也可以设置指向一个页面的链接,这将花费很长时间来加载ie。在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"

注意:由于这个答案的完整版本超过了Stack Overflow的长度限制,你需要head to GitHub来阅读扩展版本,有更多的技巧和细节。


为了阻止刮取(也称为WebscrapingScreenscrapingWeb数据挖掘网络收集,或Web数据提取),它有助于了解这些刮刀是如何工作的,并且

.

.

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

  • 蜘蛛,如谷歌's bot或网站复制器,如HTtrack,它们递归地跟踪链接到其他页面以获取数据。它们有时用于有目标的抓取以获得特定的数据,通常与HTML解析器结合使用以从每个页面提取所需的数据。

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

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

    例如:如果你的网站有一个搜索功能,这样的scraper可能会提交一个搜索请求,然后从结果页HTML中获得所有的结果链接及其标题,以便专门获得搜索结果链接及其标题。这些是最常见的

  • 屏幕抓取,基于eg。PhantomJS,它们在真正的浏览器中打开你的网站,运行JavaScript, AJAX等,然后从网页中获得所需的文本,通常通过:

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

    • 对呈现的页面进行截图,然后使用OCR从截图中提取所需的文本。这是很少见的,只有真正想要你的数据的专用抓取器才会设置这个。

    • 李< / ul > < / >
    • 网络抓取服务,如ScrapingHub和服。事实上,有些人的工作是弄清楚如何抓取您的站点并提取内容供其他人使用。

      毫不奇怪,专业的抓取服务是最难阻止的,但是如果你让如何抓取你的网站变得困难和耗时,这些(以及付钱给他们这样做的人)可能不会费心去抓取你的网站

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

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

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

    这些不同类型的刮板之间有很多重叠,即使它们使用不同的技术和方法,许多刮板也会表现相似。

    这些建议主要是我自己的想法,我在编写scraper时遇到的各种困难,以及来自互联网的一些信息和想法。

    如何停止刮痧

    你不能完全阻止它,因为无论你做什么,坚定的刮削者仍然可以找到如何刮。然而,你可以通过做一些事情来停止大量的抓取:

    监控你的日志&交通模式;如果看到异常活动,请限制访问:

    定期检查您的日志,如果有不寻常的活动表明自动访问(scraper),例如来自同一IP地址的许多类似操作,您可以阻止或限制访问。

    具体来说,有以下几点:

    • < p > 速度限制:

      只允许用户(和刮码器)在特定时间内执行有限数量的操作-例如,只允许每秒从任何特定IP地址或用户进行少量搜索。这会减慢刮刀的速度,使其失效。如果操作完成得太快或比真实用户快,你也可以显示验证码

    • < p > 检测异常活动:

      如果您看到不寻常的活动,例如来自特定IP地址的许多类似请求,某人正在查看过多的页面或执行不寻常的搜索次数,您可以阻止访问,或为后续请求显示验证码

    • < p > 不要只是监控&速率限制IP地址-使用其他指标:

      如果你想阻止或限制速率,不要只是在每个ip地址的基础上做;您可以使用其他指标和方法来识别特定的用户或刮客。一些可以帮助您识别特定用户/刮刀者的指标包括:

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

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

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

      举个例子,如果你从一个IP地址收到许多请求,所有请求都使用相同的用户代理,屏幕大小(由JavaScript决定),用户(在这种情况下是scraper)总是以相同的方式定期点击按钮,这可能是一个屏幕scraper;并且您可以暂时阻止类似的请求(例如。阻止所有来自该特定IP地址的用户代理和屏幕大小的请求),这样你就不会给该IP地址上的真实用户带来不便,例如。在共享互联网连接的情况下。

      您还可以更进一步,因为您可以识别类似的请求,即使它们来自不同的IP地址,这表明分布式抓取(使用僵尸网络或代理网络的抓取)。如果你收到很多其他方面相同的请求,但它们来自不同的IP地址,你可以阻止。同样,要注意不要无意中屏蔽了真正的用户。

      这对于运行JavaScript的屏幕抓取器非常有效,因为你可以从中获得大量信息。

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

      要求注册&登录

      需要帐户创建,以查看您的内容,如果这对您的网站是可行的。这对刮刀者来说是一个很好的威慑,但对真正的用户来说也是一个很好的威慑。

      • 如果您需要帐户创建和登录,您可以准确地跟踪用户和刮刀动作。通过这种方式,您可以轻松地检测到特定的帐户正在被用于抓取,并禁止它。像速率限制或检测滥用(例如在短时间内进行大量搜索)这样的事情变得更容易,因为您可以识别特定的刮码器,而不仅仅是IP地址。

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

      • 需要一个电子邮件地址进行注册,并通过发送一个必须打开的链接来验证该电子邮件地址,以便激活帐户。每个电子邮件地址只允许一个帐户。

      • 在注册/帐户创建过程中需要验证码解决。

      要求创建账户来查看内容将会赶走用户和搜索引擎;如果你需要创建帐户才能查看文章,用户就会去其他地方。

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

      有时,刮刮器将从web托管服务(如Amazon web services或GAE或vps)运行。对于来自云托管服务使用的IP地址的请求,限制访问您的网站(或显示验证码)。

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

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

      如果阻塞,则使错误消息不可描述

      如果你阻止/限制进入,你应该确保你没有告诉刮板是什么原因导致了堵塞,从而给他们如何修理刮板的线索。所以一个坏主意是显示错误页面的文本如下:

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

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

      相反,显示一个友好的错误消息,不告诉刮刀是什么原因造成的。像这样的东西要好得多:

      • 对不起,出了点问题。如果问题仍然存在,您可以通过helpdesk@example.com联系技术支持。

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

      使用验证码,如果你怀疑你的网站正在被一个刮板访问。

      验证码(“完全自动化的测试,以区分计算机和人类”)是非常有效的阻止刮刀。不幸的是,它们也非常容易激怒用户。

      因此,当你怀疑可能是刮板,并想要停止刮板时,它们很有用,而不会阻止访问,以防它不是刮板而是真正的用户。如果你怀疑是刮板,你可能要考虑在允许访问内容之前显示验证码。

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

      • 不要自己动手,使用谷歌's reCaptcha:这比你自己实现一个验证码要容易得多,它比你自己想出的一些模糊和扭曲的文本解决方案(用户通常只需要在一个框上打勾)更用户友好,而且它也比你站点提供的一个简单的图像更难让脚本人员解决

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

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

      将文本内容作为图像提供

      您可以将文本呈现到图像服务器端,并将其显示出来,这将阻碍简单的抓取程序提取文本。

      然而,这对屏幕阅读器、搜索引擎、性能和几乎所有其他方面都不利。在一些地方,这也是非法的(由于交通不便,例如。美国残疾人法案),它也很容易通过一些OCR来规避,所以不要这样做。

      你可以用CSS精灵做类似的事情,但也会遇到同样的问题。

      不要暴露你的完整数据集:

      如果可行,不要为脚本/机器人提供获取所有数据集的方法。举个例子:你有一个新闻网站,上面有很多单独的文章。你可以让这些文章只能通过网站搜索来访问,并且,如果你没有一个所有的网站上的文章和它们的url列表,这些文章将只能通过使用搜索功能来访问。这意味着,一个脚本想要从你的网站上删除所有的文章,就必须搜索所有可能出现在你的文章中的短语,这将非常耗时,效率极低,并有可能使刮板放弃。

      以下情况将无效:

      • 机器人/脚本并不需要完整的数据集。
      • 你的文章来自一个类似example.com/article.php?articleId=12345的URL。这(和类似的事情)将允许刮削器简单地遍历所有__abc1并以这种方式请求所有文章。
      • 还有其他方法可以最终找到所有的文章,例如编写一个脚本来跟踪文章中的链接,这些链接指向其他文章。
      • 搜索像“and”或“the”这样的词几乎可以揭示一切,所以这是需要注意的。(您可以通过只返回前10或20个结果来避免这种情况)。
      • 你需要搜索引擎来找到你的内容。

      不要公开你的api、端点和类似的东西:

      确保不公开任何api,即使是无意的。例如,如果您正在使用AJAX或来自Adobe Flash或Java applet(上帝禁止!)的网络请求来加载数据,那么从页面查看网络请求并找出这些请求的去向,然后逆向工程并在scraper程序中使用这些端点是很简单的。确保您混淆了端点,并使它们难以被其他人使用,如前所述。

      为了阻止HTML解析器和抓取器:

      由于HTML解析器的工作原理是基于HTML中的可识别模式从页面中提取内容,因此我们可以有意地改变这些模式,以破坏这些刮削器,甚至破坏它们。这些技巧大部分也适用于其他抓取工具,如蜘蛛和屏幕抓取工具。

      频繁更改HTML

      通过从HTML页面的特定可识别部分提取内容,可以直接处理HTML的刮削程序。例如:如果你网站上的所有页面都有一个id为article-contentdiv,其中包含文章的文本,那么写一个脚本来访问你网站上的所有文章页面,并提取每个文章页面上article-content div的内容文本,voilà,刮板有你网站上的所有文章,格式可以在其他地方重用。

      如果您频繁更改HTML和页面的结构,这样的刮刀将不再工作。

      • 您可以经常更改HTML中元素的id和类,甚至可以自动更改。因此,如果你的div.article-content变成类似div.a4c36dda13eaf0的东西,并且每周都改变,刮刀最初会工作良好,但一周后会损坏。确保改变你的ids / classes的长度,否则scraper将使用div.[any-14-characters]来找到所需的div。也要注意其他类似的漏洞。

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

      需要注意的事项:

      • 实现、维护和调试将非常繁琐和困难。

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

      • 聪明的scraper仍然能够通过推断实际内容的位置来获得您的内容,例如。要知道页面上的一大块文字很可能就是真正的文章。这使得它仍然可以找到&从页面中提取所需的数据。Boilerpipe做到了这一点。

      从本质上讲,要确保脚本不容易为每个类似的页面找到实际所需的内容。

      有关如何在PHP中实现这一点的详细信息,请参见如何防止依赖XPath的爬虫获取页面内容

      根据用户的位置更改HTML

      这有点类似于前面的技巧。如果您根据用户的位置/国家(由IP地址决定)提供不同的HTML,这可能会破坏传递给用户的刮码器。例如,如果有人正在编写一个移动应用程序,从你的网站抓取数据,它最初会工作得很好,但当它实际分发给用户时就会中断,因为这些用户可能在不同的国家,因此获得不同的HTML,嵌入式scraper并不是为消费而设计的。

      经常改变你的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隐藏它,并用假数据填充它,从而毒害了scraper。下面是如何更改搜索结果页面:

      <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.)
      

      一个为了获得所有搜索结果而编写的scraper会像任何其他页面上的真实搜索结果一样,选择这个链接,寻找所需的内容。一个真正的人根本不会看到它(由于它被CSS隐藏),也不会访问这个链接。一个真正的和理想的蜘蛛,如谷歌的将不会访问该链接,因为你不允许/scrapertrap/在你的robots.txt。

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

      • 不要忘记在robots.txt文件中禁用honeypot (/scrapertrap/),这样搜索引擎机器人就不会落入其中。

      • 您可以/应该将此方法与前面关于频繁更改HTML的技巧结合起来。

      • 也要经常改变,因为刮刀者最终会学会避免它。更改蜜罐URL和文本。还想考虑更改用于隐藏的内联CSS,并使用ID属性和外部CSS代替,因为刮削器将学会避免任何具有style属性的CSS用于隐藏内容。也尝试只启用它有时,所以刮刀工作最初,但一段时间后中断。这也适用于前面的技巧。

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

      如果发现刮板,提供虚假和无用的数据

      如果你发现明显是刮板,你可以提供虚假和无用的数据;这将破坏刮刀从你的网站得到的数据。你还应该让人们无法区分这些虚假数据和真实数据,这样信息搜集者就不知道他们被骗了。

      举个例子:你有一个新闻网站;如果你检测到一个刮刀,而不是阻止访问,提供假的,随机生成的文章,这将毒害刮刀得到的数据。如果你让虚假数据与真实数据难以区分,就会让信息搜集者很难得到他们想要的东西,也就是真实的数据。

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

      通常,惰性编写的scraper不会在请求时发送User Agent报头,而所有浏览器和搜索引擎蜘蛛都会。

      如果收到的请求中没有User Agent报头,则可以显示验证码,或者简单地阻止或限制访问。(或者提供如上所述的虚假数据,或者其他东西..)

      欺骗它是微不足道的,但作为一种针对编写糟糕的scraper的措施,它是值得实现的。

      如果用户代理是普通的刮板代理,则不接受请求;黑名单由刮刀器使用

      在某些情况下,scraper将使用没有真正的浏览器或搜索引擎爬行器使用的用户代理,例如:

      • “Mozilla”(仅此而已。我看到了一些关于刮痧的问题。一个真正的浏览器永远不会只使用它)
      • “Java 1.7.43_u43”(默认情况下,Java的HttpUrlConnection使用类似的东西。)
      • “BIZCO EasyScraping Studio 2.0”
      • “wget”,“curl”,“libcurl”,…(Wget和cURL有时用于基本的抓取)

      如果您发现某个特定的User Agent字符串被站点上的scraper使用,而不是真正的浏览器或合法的爬行器使用,您也可以将其添加到黑名单中。

      如果它不请求资源(CSS,图像),它就不是一个真正的浏览器。

      真正的浏览器会(几乎总是)请求和下载图像和CSS等资源。HTML解析器和抓取器不会,因为它们只对实际的页面及其内容感兴趣。

      您可以将请求记录到您的资产中,如果您看到许多仅针对HTML的请求,那么它可能是一个scraper。

      请注意,搜索引擎机器人、老式移动设备、屏幕阅读器和配置错误的设备也可能不会请求资产。

      使用并要求cookie;使用它们来跟踪用户和刮刀动作。

      您可以要求启用cookies以查看您的网站。这将阻止经验不足和新手刮刀作家,但很容易为刮刀发送饼干。如果你确实使用并需要它们,你可以用它们来跟踪用户和刮刀操作,从而实现限速、阻止或显示每个用户而不是每个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解析器提取数据变得非常困难,因为编写scraper的人将不得不逆向工程您的JavaScript(您也应该混淆)。

      • 你可能想要定期改变你的混淆方法,以打破那些已经发现它的刮刮器。

      不过,这样做也有一些缺点:

      • 实现、维护和调试将非常繁琐和困难。

      • 它将无效的scraper和屏幕抓取器,实际上运行JavaScript,然后提取数据。(大多数简单的HTML解析器不运行JavaScript)

      • 如果实际用户禁用了JavaScript,它将使您的站点无法使用。

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

      非技术:

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

      • 找律师

      • 让你的数据可用,提供一个API:

        您可以使您的数据易于获取,并要求归因和链接回到您的网站。

      杂项:

      • 也有商业刮除保护服务,如Cloudflare的反刮除或Distill Networks(关于它如何工作的详细信息这里),它们做这些事情,以及为您提供更多信息。

      • 在真实用户的可用性和防刮擦性之间找到平衡:你所做的每件事都会以某种方式对用户体验产生负面影响,找到妥协。

      • 不要忘记你的手机网站和应用程序。如果你有一个移动应用程序,它也可以被屏幕抓取,并且可以检查网络流量以确定它使用的REST端点。

      • 刮刮器可以刮其他刮刮器:如果有一个网站的内容是从你的网站上刮下来的,其他刮刮器就可以刮那个网站的内容。

      进一步阅读:

迟到的回答——而且这个答案可能不是你想听到的……

我自己已经编写了许多(几十个)不同的专业数据挖掘抓取器。(只是因为我喜欢“开放数据”哲学)。

这里已经有许多建议在其他答案- 现在我要扮演魔鬼代言人的角色和将扩展和/或纠正他们的有效性。

第一:

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

试图使用一些技术障碍是不值得的麻烦,导致:

  • 对你的老用户来说,就是让他们的用户体验变差
  • 到常规的和受欢迎的机器人(搜索引擎)
  • 等等……

纯html -最简单的方法是解析纯HTML页面,使用定义良好的结构和css类。例如,这是足够的检查元素与Firebug,并使用正确的xpath,和/或CSS路径在我的刮刀。

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

  • 您希望以一致的方式将信息呈现给常规用户
  • 例如,再一次分析页面结构来设置刮刀就足够了。
  • ,它可以通过分析一些“已知内容”自动完成
    • 某人已经知道(通过早先的搜集),例如:
    • 关于"菲尔·柯林斯"的信息
    • 足够显示“phil collins”页面,并(自动)分析页面的结构“today”:)
    • 李< / ul > < / >

    你不能为每一个回应都改变结构,因为你的老用户会讨厌你。而且,这样会给您(保养)带来更多的麻烦,而不是给刮板带来麻烦。XPath或CSS路径由抓取脚本从已知内容自动确定。

    Ajax -开始时有点难,但很多时候加速了刮痧过程:)-为什么?

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

    所以,ajax没有多大帮助…

    一些更复杂的页面使用< em > < / em >多 javascript函数打包

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

    • 解包和理解JS,并创建一个遵循Javascript逻辑的scraper(艰难的方式)
    • 或者(最好自己使用)-只是使用Mozilla和Mozrepl进行刮取。例如,真正的抓取是在全功能javascript支持的浏览器中完成的,它被编程为点击正确的元素,并直接从浏览器窗口抓取“解码”的响应。

    这样的刮取速度很慢(刮取是在普通浏览器中完成的),但它确实很慢

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

    基于用户代理的过滤根本没有帮助。任何认真的数据挖掘者都会在他的scraper中将其设置为正确的值。

    需要登录 -没有帮助。最简单的方法打败它(没有任何分析和/或脚本登录协议)只是登录到网站作为普通用户,使用Mozilla,然后运行基于Mozrepl的刮刀…

    记住,需要登录有助于匿名机器人,但无助于那些想要刮取你的数据的人。他只是把自己注册为普通用户。

    使用框架也不是很有效。这是许多现场电影服务使用,它不是很难被击败。帧只是另一个需要分析的HTML/Javascript页面…如果数据值得麻烦,数据挖掘器将进行所需的分析。

    基于ip的限制根本无效-这里有太多的公共代理服务器,还有TOR…:)它不会减慢抓取(对于真的想要你的数据的人)。

    非常困难的是抓取隐藏在图像中的数据。(例如,简单地将数据转换为图像服务器端)。使用“tesseract”(OCR)可以帮助很多次,但老实说,数据必须值得刮刀的麻烦。(很多时候这并不值得)。

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

    最难的是使用Java applet或flash和applet 内部使用secure https请求自身的站点。但是仔细想想——你的iPhone用户会有多开心……,)。因此,目前很少有网站使用它们。我自己,在我的浏览器中屏蔽所有flash内容(在常规浏览会话中)-并且从不使用依赖flash的网站。

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

    验证码(像reCaptcha这样的好方法)帮助很大,但是你的用户会讨厌你…-想象一下,当你的用户需要在所有显示音乐艺术家信息的页面上解决一些验证码时,他们会多么喜欢你。

    可能不需要继续了——你已经了解了。

    现在你应该做的是:

    记住:几乎不可能隐藏你的数据,如果你在另一边想要发布它们(以友好的方式)给你的普通用户。

    所以,

    • 使您的数据易于访问-通过一些API
      • 这样可以方便地访问数据
      • 例如,卸载你的服务器从抓取-对你有好处
      • 李< / ul > < / >
      • 设置正确的使用权限(例如必须引用出处)
      • 请记住,许多数据是不受版权保护的——而且很难保护它们
      • 添加一些虚假数据(就像你已经做的那样)并使用合法工具
        • 正如其他人所说,发送一封“停止函”
        • 其他法律行动(起诉或喜欢)可能太昂贵且难以获胜(特别是针对非美国网站)
        • 李< / ul > < / >

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

        与其试图阻止数据挖掘者,不如在你的网站可用性上投入更多精力。你的用户会喜欢你的。投入在技术障碍上的时间(精力)通常是不值得的——花时间做一个更好的网站更好…

        此外,数据窃贼与普通小偷不同。

        如果你买了一个便宜的家庭警报器,并加上一个警告“这所房子与警方有联系”——许多小偷甚至不会试图闯入。因为他只要走错一步,就会进监狱。

        所以,你投资的钱不多,但小偷投资的风险很大。

        但数据窃贼没有这样的风险。恰恰相反——如果你走错了一步(例如,如果你因为技术障碍引入了一些BUG),你就会失去你的用户。如果抓取机器人第一次不工作,什么也不会发生——数据挖掘者只是尝试另一种方法和/或调试脚本。

        在这种情况下,你需要更多的投资,而刮板投资得更少。

        想想你想把时间花在什么地方。能源……

        Ps:英语不是我的母语——所以请原谅我的蹩脚英语…

< p > 方法一(小型场地适用):
提供加密/编码的数据。
我使用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");
?>
< p > 方法二:
如果你不能阻止他们,那就给他们提供虚假/无用的数据作为回应 < p > 方法三:
阻止常见的抓取用户代理,你会在主要/大型网站中看到这一点,因为你的user - agent不可能使用“python3.4”来抓取它们 < p > 方法四:
确保所有的用户标题都是有效的,我有时提供尽可能多的标题,使我的刮板看起来像一个真实的用户,其中一些甚至不是真实或有效的像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"
}

大多数已经说过了,但是你考虑过CloudFlare的保护吗?我的意思是:

image description

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

我很确定这会使他们的工作复杂化。我还曾经因为速率限制而试图废弃一个受CloudFlare保护的网站的数据(我使用了简单的AJAX请求循环),导致IP被自动禁用了4个月。