我不是在谈论提取文本或下载网页。但是我看到人们下载整个网站,例如,有一个名为“example”的目录,它甚至没有链接到网站上,我怎么知道它在那里?如何下载网站的“所有”页面?我该如何防范?
例如,apache中有“目录列表”,如果已经有索引文件,我如何获取根目录下的目录列表?
这个问题不是特定于语言的,我很乐意只提供一个解释执行此操作的技术的链接或详细的答案。
好的,一一回答你的问题;你怎么知道网站上有一个“隐藏的”(未链接的)目录?好吧,您不知道,但是您可以检查最常见的目录名称,无论它们返回 HTTP 200 还是 404... 使用几个线程,您甚至可以每分钟检查数千个。话虽如此,您应该始终考虑您针对特定网站发出的请求数量及其处理的流量,因为对于中小型网站,这可能会导致连接问题甚至是短暂的 DoS,其中当然是不可取的。您也可以使用搜索引擎搜索未链接的内容,它可能是由搜索引擎意外发现的,可能有来自另一个站点的链接等(例如 google site:targetsite.com 将列出所有索引页面)。您如何下载网站的所有页面已经得到解答,基本上您转到基本链接,解析指向现场内容的链接、图像和其他内容的 html 并跟随它。此外,您解构指向其目录的链接并检查索引。您还将暴力破解公共目录和文件名。
好吧,除非您限制用户体验,否则您实际上无法有效地防范机器人。例如,您可以限制每分钟的请求数;但是如果你有 ajax 站点,一个普通用户也会产生大量的请求,所以这真的不是一个可行的方法。您可以仅检查用户代理和白名单“常规”浏览器,但是大多数抓取脚本会将自己标识为常规浏览器,因此也对您没有太大帮助。最后,您可以将 IP 列入黑名单,但这不是很有效,有很多代理、洋葱路由和其他方法可以更改您的 IP。
只有在以下情况下,您才会获得目录列表:a)服务器配置中不禁止它,并且 b)没有默认索引文件(默认为 apache index.html 或 index.php)。
实际上,最好不要让爬虫更容易,因此请确保您的网站搜索功能已正确清理等(它不会返回空查询的所有记录,如果您使用LIKE
mysql 语法,它会过滤 % 符号...)。当然,如果合适,可以使用 CAPTCHA,但它必须正确实施,而不是简单的“什么是 2 + 2”或普通字体中的几个字母与纯背景。
另一种防止抓取的保护措施可能是使用引用检查来允许访问网站的某些部分;但是最好只禁止访问您不希望在服务器端公开的网站的任何部分(.htaccess
例如使用)。
最后,根据我的经验,scraper 将仅具有基本的 js 解析功能,因此在 javascript 中实现某种检查可能会起作用,但是在这里您也将排除所有关闭 js 的网络访问者(并且使用 noscript 或类似的浏览器插件)或使用过时的浏览器。
要完全“下载”一个网站,您需要一个网络爬虫,除了跟踪网址之外,它还会保存其内容。该应用程序应该能够:
搜索“网络爬虫”应该会为您提供大量示例。
我不知道您可以采取哪些对策来避免这种情况:在大多数情况下,您希望机器人抓取您的网站,因为这是搜索引擎了解您网站的方式。
我想您可以查看流量日志,如果您(通过 ip 地址)识别出一些屡犯者,您可以将他们列入黑名单以阻止访问服务器。