我正在开发一个网站,并且非常关注有人会屏幕抓取我的数据
这个没必要太在意。如果你的数据存在于互联网上,任何人想要获取它都是不可阻挡的。你加入越多的限制,就会越有可能破坏合法用户的体验,而合法用户应该是你受众中的大多数。这样还会使代码更难维护。
如果有未来回答的想法,我会发布对应的对策。
根据tor网络组件的设计,接收者无法确定请求者是原始来源还是中继请求。
你在Google上看到的行为可能是由不同的安全措施引起的。Google会检测登录用户是否更改了IP,并在必要时展示验证码,以防止有害拦截,并且允许已经认证的用户在真正更改IP(通过重新登录ISP等)后继续会话。
我知道这篇文章有点老了,但是我从谷歌搜索中找到了它,所以我想在这里解决一下问题的根本关注点。我开发网络应用程序,但我也滥用和利用其他人的东西。我可能是你想要阻止的那个人。
在这里检测Tor流量真的不是你想要走的路线。你可以通过解析请求头来检测大量的开放代理服务器,但你还有Tor、高匿名代理、Socks代理、直接面向垃圾邮件营销者的廉价VPN、僵尸网络和无数其他突破速率限制的方法。你也
如果你的主要担忧是DDoS效应,不用担心。真正的DDoS攻击需要肌肉或某些漏洞,这会给你的服务器带来压力。无论你有什么类型的网站,你都会受到蜘蛛的访问以及寻找漏洞的坏人的扫描。这是生活的事实。事实上,这种逻辑在服务器上几乎从来没有很好地扩展,并且可能成为单点故障,使你容易受到真正的DDoS攻击。
这也可能成为你的最终用户(包括友好的机器人)的单点故障。如果一个合法的用户或客户被阻止,你就会面临客户服务的噩梦,如果错误的爬虫被阻止,你就要和你的搜索流量说再见了。
如果你真的不想让任何人获取你的数据,有一些事情可以做。如果它是一个博客内容或其他东西,我通常建议要么不用担心,或者只需要摘要RSS提要,如果你需要提要的话。被抓取的博客内容的危险在于,很容易将文章的完全复制品发送垃圾邮件链接并对其进行排名,从而将原始文章排除在搜索结果之外。同时,因为这样做非常容易,人们不会花费精力来针对特定站点进行目标定向,而是可以批量抓取RSS提要。
如果您的网站更像是具有动态内容的服务,那就是另一回事了。我实际上会抓取很多类似这样的网站来“窃取”大量结构化专有数据,但是有一些选项可以使其更加困难。您可以限制每个IP的请求次数,但是使用代理轻松绕过此限制。相对简单的混淆可以提供一些真正的保护。如果您尝试从Google搜索结果中爬取信息或者从YouTube下载视频,您会发现反向工程有很多要做的工作。我都做过这些事情,但是99%的人失败了,因为他们缺乏相关知识。他们可以抓取代理以绕过IP限制,但是他们没有破解任何加密。
作为一个例子,据我所记,谷歌的搜索结果页面会带有混淆的JavaScript代码,在页面加载时注入到DOM中,然后设置一些令牌,因此您必须解析它们。然后使用这些令牌进行Ajax请求,返回混淆的JS或JSON,解码以构建结果等等。作为开发人员,这并不难做到,但绝大多数潜在的盗贼无法处理它。大多数能够处理的人也不会付出努力。我这样做是为了包装谷歌等真正有价值的服务,但对于大多数其他服务,我只会转向一些更容易攻击的提供者。希望这对任何遇到此类问题的人有所帮助。
我认为过于强调了阻止决心坚定且技术熟练的用户从网站上爬取信息是“不可能”的。@Drew Noakes指出,该网站包含的信息在聚合后具有一定的“价值”。如果一个网站的聚合数据可以被无限制的匿名用户轻松访问,那么是的,防止爬取可能几乎是“不可能”的。
我建议解决的问题不是如何阻止用户爬取聚合数据,而是采用什么方法将聚合数据从公共访问中删除;从而消除爬虫的目标,而无需做到“不可能”的防止爬取。
聚合数据应该像专有公司信息一样对待。一般情况下,专有公司信息不会以聚合或原始形式公开提供给匿名用户。我认为,防止有价值数据的获取的解决方案是限制和约束对数据的访问,而不是在向用户呈现数据时防止其被爬取。
1] 用户账户/访问 - 永远不应该有人在给定时间段内访问所有数据(数据/域特定)。用户应该能够访问与他们相关的数据,但从问题中可以清楚地看出,没有用户有合法目的来查询所有聚合数据。如果不知道网站的具体情况,我怀疑一个合法的用户可能只需要一些小的子集数据在某个时间段内。请求显著超过典型用户需求的应该被阻止或者限制,以使抓取变得极其耗时,并且抓取的数据可能已经过时。
2] 运营团队经常监控指标以确保大型分布式和复杂系统的健康状况。不幸的是,很难确定间歇性问题的原因,甚至很难确定是否存在问题,而不是正常的操作波动。运营团队经常处理从许多指标中获取的统计分析历史数据,并将它们与当前值进行比较,以帮助识别系统健康状况的显着偏差,无论是系统正常运行时间、负载、CPU利用率等。
同样,用户请求的数据量显著高于正常水平可能有助于识别可能正在抓取数据的个人;这种方法甚至可以自动化,并进一步扩展到跨多个帐户查找指示抓取的模式。用户1抓取10%,用户2抓取接下来的10%,用户3抓取接下来的10%,等等...像这样(和其他)的模式可能提供单个个人或利用多个帐户的组对系统进行恶意使用的强烈指标。3] 不要直接向最终用户提供原始聚合数据。具体情况很重要,但简单来说,数据应该驻留在后端服务器上,并利用某些特定领域的API进行检索。再次强调,我假设您不仅仅是提供原始数据,而是响应用户对数据子集的请求。例如,如果您拥有特定地区详细人口统计数据,则合法的最终用户只会对该数据的子集感兴趣。例如,最终用户可能想知道与父母一起居住在多单元住房中的青少年家庭的地址或特定城市或县的数据。这样的请求需要处理聚合数据以生成最终用户感兴趣的结果数据集。从众多可能的输入查询的各种排列组合中抓取每个结果数据集并重新构建完整的聚合数据将是难以承受的。网络爬虫还受到网站安全性的限制,考虑到请求/时间的数量、结果数据集的总数据大小和其他潜在标记。一个开发良好的API结合特定领域的知识将是确保API足够全面以服务于其目的但不过于通用以返回大型原始数据转储的关键。
将用户账户纳入网站,为用户建立使用基准线,识别和限制偏离典型使用模式的用户(或其他缓解方法),并创建一个界面以请求处理/消化结果集(而不是原始聚合数据),这将为有意窃取您的数据的恶意个体创造重大复杂性。防止网站数据被抓取可能是不可能的,但“不可能”是建立在聚合数据容易被抓取者访问的前提下的。你不能抓取你看不到的东西。因此,除非你的聚合数据是原始未经处理的文本(例如图书馆电子书),否则终端用户不应该访问原始聚合数据。即使在图书馆电子书的例子中,如果请求完整书籍的数量超出了可接受的使用模式,也应该被阻止或限制。您可以使用TorDNSEL - https://www.torproject.org/projects/tordnsel.html.en来检测Tor用户。
您可以直接使用这个命令行/库 - https://github.com/assafmo/IsTorExit。