2

我想扫描一些网站以查找损坏的链接,最好使用 Java。任何提示我该如何开始这样做?

(我知道有一些网站这样做,但我想制作自己的个性化日志文件)

4

3 回答 3

3

编写网络爬虫并不像读取静态 HTML 那样简单,如果页面使用 JavaScript 修改 DOM,那么它会变得复杂。您还需要查找您已经访问过的页面,即蜘蛛陷阱?如果站点是纯静态 HTML,那么就去吧……但是如果站点使用 Jquery 并且很大,那么预计它会很复杂。

如果您的网站都是静态的、小型的并且很少或没有 JS,那么请使用已经列出的答案。

或者

您可以使用Heritrix,然后将它的 crawl.log 解析为 404。 crawl.log 上的 Heritrix 文档

或者,如果您最喜欢自己编写:

您可以使用HTMLUnit(它有一个 JavaScript 引擎)之类的东西来加载页面,然后查询 DOM 对象以获取链接。然后将每个链接放入“未访问”队列中,然后从未访问队列中提取链接以获取下一个要加载的 url,如果页面加载失败,请报告。

为避免重复页面(蜘蛛陷阱),您可以散列每个链接并保留访问页面的 HashTable(请参阅CityHash)。在将链接放入未访问队列之前,请对照已访问的哈希表检查它。

为避免离开您的站点,请在将 URL 添加到未访问队列之前检查该 URL 是否位于安全域列表中。如果您想确认域外链接是否良好,则将它们保留在域外队列中。然后稍后使用 URL.getContent(url) 加载此队列中的每个链接以查看它们是否工作(比使用 HTMLUnit 更快,并且您无论如何都不需要解析页面。)。

于 2011-07-13T21:13:53.977 回答
0
  1. 使用 Java 的一些 HTTP 客户端加载网站首页
  2. 解析 HTML(因为它不是格式良好的 XML,你可能需要先清理它。使用 tagoup 之类的东西)
  3. 对于每个<a>标签,获取其内容并尝试连接到它。

如有必要,如果 URL from<a>属于您的站点,则递归重复。确保将您已处理的 URL 存储在地图中,这样您就不会多次执行此操作。

于 2011-07-13T20:43:28.653 回答
0

编写一个递归检查链接的函数。伪代码:

function checklinks(String url){
     try{
         content=HTTP.getContents(url);
         String[] links=content.getAllRegexMatches('href="(http://.*?)"');
         foreach(links as String link)
              checklinks(link)
     } catch (Exception e) {
         System.out.println("Link "+url" failed");
     }
}

根据链接,您必须通过添加相对于当前 URL 的 url 来完成传递给下一个递归的链接。

于 2011-07-13T20:41:23.057 回答