我有一个相当大的音乐网站,里面有一个大型艺术家数据库。我一直在注意其他音乐网站抓取我们网站的数据(我在这里和那里输入虚拟艺术家名称然后谷歌搜索它们)。
如何防止屏幕抓取?它甚至可能吗?
答案 0 :(得分:238)
我会假设您已设置robots.txt
。
正如其他人所提到的,刮刀几乎可以伪造他们活动的每个方面,而且可能很难确定来自坏人的请求。
我会考虑:
/jail.html
。robots.txt
中的页面(敬请尊敬的蜘蛛永远不会访问)。display: none
)隐藏它。/jail.html
。这可以帮助您快速识别来自刮刀的请求,这些请求明显无视您的robots.txt
。
您可能还希望将/jail.html
整个网站设置为与普通网页具有相同,准确的标记,但使用虚假数据(/jail/album/63ajdka
,/jail/track/3aads8
等) 。这样,在你有机会完全阻止它们之前,坏的刮刀不会被警告“异常输入”。
答案 1 :(得分:47)
说真的:如果你有钱,可以和一位了解互联网的好的,年轻的律师交谈。你真的可以在这里做点什么。根据网站的位置,您可以让律师写下停止和放弃。在您的国家停止或等同。你或许可以至少吓唬那些混蛋。
记录虚拟值的插入。插入明确(但模糊地)指向您的虚拟值。我认为这是电话簿公司的常见做法,而在德国,我认为有几个例子,当模仿者被他们以1:1复制的假条目破坏时。
如果这会让你弄乱你的HTML代码,拖累搜索引擎优化,有效性和其他东西(尽管在相同页面的每个请求上使用稍微不同的HTML结构的模板系统)可能已经有所帮助,这将是一种耻辱。 lot 反对总是依赖HTML结构和类/ ID名称来获取内容的抓取工具。)
这样的案例是版权法的好处。剥夺其他人的诚实工作以赚钱是你应该能够反对的事情。
答案 2 :(得分:34)
你真的无法完全阻止这一点。铲运机可以伪造其用户代理,使用多个IP地址等,并以普通用户身份出现。您唯一能做的就是在加载页面时使文本不可用 - 使用图像,flash或使用JavaScript加载它。但是,前两个是糟糕的想法,如果没有为某些普通用户启用JavaScript,最后一个是可访问性问题。
如果他们绝对抨击您的网站并浏览所有网页,您可以进行某种速率限制。
虽然有一些希望。铲运机依赖于您网站的数据采用一致的格式。如果你能以某种方式随机化它可能会破坏他们的刮刀。比如在每次加载时更改页面元素的ID或类名等等。但这是很多工作要做,我不确定它是否值得。即使在那时,他们也可能有足够的奉献精神来解决它。
答案 3 :(得分:30)
提供XML API以访问您的数据;以一种易于使用的方式。如果人们想要你的数据,他们就会得到它,你也可以全力以赴。
通过这种方式,您可以以有效的方式提供功能的子集,确保至少刮刀不会提高HTTP请求和大量带宽。
然后,您所要做的就是说服那些希望您的数据使用API的人。 ;)
答案 4 :(得分:20)
抱歉,这真的很难......
我建议您礼貌地要求他们不要使用您的内容(如果您的内容受版权保护)。
如果是,并且他们没有将其删除,那么您可以采取进一步行动并向他们发送cease and desist letter。
一般来说,无论你采取什么措施来防止刮擦都可能会产生更负面的影响,例如:可访问性,机器人/蜘蛛等
答案 5 :(得分:12)
好的,正如所有帖子所说,如果你想让它对搜索引擎友好,那么机器人可以肯定。
但是你仍然可以做一些事情,它可能对60-70%刮痧机器人有效。
制作如下的检查脚本。
如果特定的IP地址访问速度非常快,那么在几次访问(5-10)后,将其IP地址+浏览器信息放入文件或数据库中。
(这将是一个后台进程并在几分钟后运行或安排。)制作另一个脚本,继续检查那些可疑的IP地址。
案例1.如果用户代理是Google等已知搜索引擎Bing,Yahoo(您可以通过Google搜索找到有关用户代理的更多信息)。然后你必须看到http://www.iplists.com/。此列表并尝试匹配模式。如果它看起来像一个伪造的用户代理,那么请在下次访问时填写CAPTCHA。 (你需要对机器人的IP地址进行更多的研究。我知道这是可以实现的,也可以尝试使用IP地址。这可能会有所帮助。)
案例2.没有搜索机器人的用户代理:只需要在下次访问时填写验证码。
答案 6 :(得分:9)
迟到的答案 - 而且这个答案可能不是你想听到的那个......
我自己已经编写了许多(数十个)不同的专业数据挖掘工具。 (仅仅因为我喜欢"开放数据"哲学)。
以下是其他答案中的许多建议 - 现在我将扮演魔鬼的倡导者角色,并将扩展和/或纠正其有效性。
首先:
尝试使用一些技术障碍并不值得造成这样的麻烦:
普通HMTL - 最简单的方法是解析纯HTML页面,具有明确定义的结构和css类。例如。用Firebug检查元素就足够了,在我的刮刀中使用正确的X路径和/或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小程序或Flash 的网站最难,而小程序在内部使用安全https 请求。但请三思而后行 - 您的iPhone用户会有多开心......;)。因此,目前很少有网站使用它们。我自己,阻止浏览器中的所有Flash内容(在常规浏览会话中) - 并且从不使用依赖Flash的网站。
你的里程碑可能是......,所以你可以尝试这种方法 - 只记得 - 你可能会失去一些用户。还记得,一些SWF文件是可以解压缩的。 ;)
Captcha (好的 - 像reCaptcha)有很多帮助 - 但是你的用户会讨厌你... - 想象一下,当用户需要解决一些验证码时,你的用户会如何爱你页面显示有关音乐艺术家的信息。
可能不需要继续 - 你已经进入了画面。
现在你应该做什么:
请记住:如果您希望将其(以友好的方式)发布给普通用户,则几乎无法隐藏您的数据。
所以,
在尝试使用某些技术障碍之前请三思而后行。
尝试阻止数据挖掘者,只需为您的网站可用性添加更多精力。你的用户会爱你。投入技术障碍的时间(和能量)通常是不值得的 - 更好地花时间制作更好的网站...
此外,数据窃贼不像普通小偷。
如果您购买便宜的家庭警报器并添加警告"此房屋已与警方联系并且#34; - 许多小偷甚至都不会试图闯入。因为他有一个错误的举动 - 他要坐牢......
所以,你只投资几块钱,但小偷投资并冒很大风险。
但数据小偷并没有这样的风险。恰恰相反 - 如果您做出错误的举动(例如,如果您因技术障碍而引入了一些BUG),您将失去用户。如果抓取机器人第一次不起作用,没有任何反应 - 数据挖掘者只会尝试另一种方法和/或调试脚本。
在这种情况下,您需要投入更多资金 - 而且刮刀投资要少得多。
想想你想投入的时间和时间能量...
Ps:英语不是我的母语 - 所以请原谅我破碎的英语......
答案 7 :(得分:8)
不幸的是,您最好的选择是手动:查找您认为表示抓取并禁止其IP地址的流量模式。
由于您正在谈论一个公共网站,然后使网站搜索引擎友好也将使该网站刮不过友好。如果搜索引擎可以抓取并抓取您的网站,那么恶意抓取工具也可以。这是一个很好的行走。
答案 8 :(得分:8)
可能对初学者刮刀有用的事情:
一般有用的事情:
有帮助但会让您的用户讨厌您的事情:
答案 9 :(得分:8)
我已经做了很多网页抓取工作,并根据我觉得烦人的内容在我的博客上总结了一些techniques to stop web scrapers。
这是您的用户和抓取工具之间的权衡。如果你限制IP,使用CAPTCHA,需要登录等,你就会对刮刀造成困难。但这也可能会驱逐你的真正用户。
答案 10 :(得分:8)
从技术角度来看: 只需模拟Google在您一次查询过多查询时所执行的操作。这应该会停止很多。
从法律角度来看: 听起来您发布的数据不是专有的。这意味着您要发布不受版权保护的名称和统计信息以及其他信息。
如果是这种情况,则刮刀不会通过重新分发您的艺术家姓名等信息来侵犯版权。但是,当他们将您的网站加载到内存中时,他们可能会侵犯版权,因为您的网站包含受版权保护的元素(如布局等) )。
我建议阅读Facebook v.Power.com,看看Facebook用来阻止屏幕抓取的论点。有许多法律方法可以阻止某人欺骗您的网站。它们可以是深远的和富有想象力的。有时法院会购买论据。有时候他们没有。
但是,假设您发布的公共域名信息不具有名称和基本统计信息的版权......您应该以自由言论和开放数据的名义进行宣传。也就是说,网络的全部内容。
答案 11 :(得分:7)
当然有可能。要获得100%的成功,请使您的网站脱机。
实际上,您可以执行某些的事情,这会使抓取变得更加困难。 Google会进行浏览器检查,以确保您不是机器人搜索搜索结果(尽管这与其他所有内容一样,都可能会被欺骗)。
您可以执行首次连接到您网站和后续点击之间需要几秒钟的事情。我不确定理想的时间是什么,或者究竟该怎么做,但这是另一个想法。
我确信还有其他几个人有更多的经验,但我希望这些想法至少有所帮助。
答案 12 :(得分:6)
您可以采取一些措施来阻止屏幕抓取。有些不是很有效,而有些(CAPTCHA)则有效,但会阻碍可用性。您还必须牢记,它可能会阻碍合法的网站搜索引擎,例如搜索引擎索引。
但是,我认为如果您不希望它被删除,则意味着您不希望搜索引擎将其编入索引。
以下是您可以尝试的一些事项:
如果我必须这样做,我可能会使用后三者的组合,因为它们可以减少对合法用户造成的不便。但是,你必须接受你不能以这种方式阻止所有人,一旦有人弄清楚如何绕过它,他们将能够永远地刮掉它。然后,您可以尝试阻止他们的IP地址,因为我发现它们。
答案 13 :(得分:6)
这不是你可能想要的答案,但为什么要隐藏你想要公开的内容?
答案 14 :(得分:5)
方法一(仅限小型网站):
提供加密/编码数据。
我使用python(urllib,requests,beautifulSoup等等)浏览网页,发现很多网站提供的加密/编码数据在任何编程语言中都无法解密,因为加密方法不存在。
我在PHP网站上通过加密和最小化输出实现了这一点(警告:这对大型网站来说不是一个好主意)响应总是混乱的内容。
最小化PHP输出的示例(How to minify php page html output?):
<?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"
}
答案 15 :(得分:2)
不是将机器人列入黑名单,也许你应该将它们列入白名单。如果您不想删除前几个引擎的搜索结果,则可以将其用户代理字符串列入白名单,这些字符串通常是公开的。较不道德的机器人倾向于伪造流行的Web浏览器的用户代理字符串。排名前几的搜索引擎应该超过95%的流量。
使用其他海报建议的技术,识别机器人本身应该相当简单。
答案 16 :(得分:2)
快速解决这个问题的方法是设置一个诱饵/僵尸陷阱。
制作一个页面,如果它打开了一定次数甚至根本打开,将收集某些信息,如IP和诸如此类的东西(你也可以考虑不规范或模式,但这个页面不应该是打开了)。
在您的页面中使用CSS display:none隐藏此链接或左:-9999px;当前位置:绝对的;尝试将它放在不太可能被忽略的地方,例如你的内容落在哪里而不是你的页脚,因为有时机器人可以选择忘记页面的某些部分。
在你的robots.txt文件中,为你不想要友情机器人的网页设置一大堆不允许的规则(LOL,就像他们有幸福的面孔!)来收集信息并将此页面设置为其中一个。
现在,如果一个友好的僵尸程序通过它应该忽略该页面。对,但仍然不够好。制作更多这些页面或以某种方式重新路由页面以接受不同的名称。然后将更多不允许的规则放在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"
答案 17 :(得分:1)
您无法停止正常的屏幕抓取。无论好坏,这都是网络的本质。
您可以制作它,这样任何人都无法访问某些内容(包括音乐文件),除非他们以注册用户身份登录。这不是太难to do in Apache。我认为在IIS中也不会太难。
答案 18 :(得分:1)
我同意上面的大部分帖子,并且我想补充一点,您的网站对搜索引擎的友好程度越高,它就越具有可擦除性。您可以尝试做一些非常适合刮刀的事情,但它也可能会影响您的搜索能力......这取决于您希望您的网站在搜索引擎上的排名当然。< / p>
答案 19 :(得分:1)
一种方法是将内容作为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 Web Store:JSON
<script type="text/javascript" src="https://apis.google.com/js/plusone.js">{"lang": "en", "parsetags": "explicit"}</script>
Bing News:数据网址
<script type="text/javascript">
//<![CDATA[
(function()
{
var x;x=_ge('emb7');
if(x)
{
x.src='data:image/jpeg;base64,/*...*/';
}
}() )
Protopage:网址编码字符串
unescape('Rolling%20Stone%20%3a%20Rock%20and%20Roll%20Daily')
TiddlyWiki:HTML实体+预先格式化的JSON
<pre>
{"tiddlers":
{
"GettingStarted":
{
"title": "GettingStarted",
"text": "Welcome to TiddlyWiki,
}
}
}
</pre>
Amazon:延迟加载
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>
如果您在上述任何一个内容中查看来源,您会看到抓取只会返回元数据和导航。
答案 20 :(得分:1)
大多数人已经说过了,但您是否考虑过CloudFlare保护?我的意思是:
其他公司也可能这样做,CloudFlare是我唯一知道的。
我很确定这会使他们的工作复杂化。当我因为速率限制而试图废弃受CloudFlare保护的站点的数据时(我使用简单的AJAX请求循环),我也曾经自动禁用IP 4个月。
答案 21 :(得分:0)
生成HTML,CSS和JavaScript。编写生成器比解析器更容易,因此您可以以不同方式生成每个提供的页面。您不能再使用缓存或静态内容。
答案 22 :(得分:0)
如果您想看一个很好的例子,请查看http://www.bkstr.com/。他们使用j / s算法设置cookie,然后重新加载页面,以便它可以使用cookie来验证请求是否在浏览器中运行。一个专为刮擦而构建的桌面应用程序绝对可以通过这种方式获得,但它会阻止大多数cURL类型的抓取。
答案 23 :(得分:0)
屏幕抓取工具通过处理HTML来工作。如果他们决心获取您的数据,那么您可以在技术上做很多事情,因为人类的眼球可以处理任何事情。从法律上讲,已经有人指出你可能会有一些追索权,这将是我的建议。
但是,您可以使用非基于HTML的表示逻辑隐藏数据的关键部分
请记住,这可能会影响您的搜索排名。
答案 24 :(得分:0)
将您的内容置于验证码背后意味着机器人会发现难以访问您的内容。但是,人类会感到不方便,因此这可能是不可取的。