如何使用Java搜索网站的断开链接?

时间:2011-07-13 20:33:51

标签: java web-crawler broken-links

我想扫描一些寻找断链的网站,最好使用Java。任何提示我怎么能开始这样做?

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

3 个答案:

答案 0 :(得分:3)

编写Web爬虫并不像只读取静态HTML那么简单,如果页面使用JavaScript来修改DOM,那么它就会变得复杂。您还需要查找您已经访问过的页面,即Spider Traps?如果该站点是纯静态HTML,那就去吧......但是如果站点使用Jquery并且很大,那么期望它很复杂。

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

您可以使用Heritrix然后解析它的crawl.log获取404。 Heritrix doc on crawl.log

如果你大多数都是自己写的:

您可以使用HTMLUnit(它有一个JavaScript引擎)来加载页面,然后查询DOM对象以获取链接。然后将每个链接放在“未访问”的队列中,然后从未访问的队列中拉出链接以获取要加载的下一个URL,如果页面无法加载,则报告它。

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

为避免在将网站添加到未访问的队列之前,请检查网站是否在安全域列表中。如果要确认关闭域链接是否正常,请将它们保留在offDomain队列中。然后使用URL.getContent(url)从此队列加载每个链接以查看它们是否有效(比使用HTMLUnit更快,并且无论如何都不需要解析页面。)。

答案 1 :(得分: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来完成传递给下一次递归的链接。

答案 2 :(得分:0)

  1. 使用某些HTTP客户端加载网站首页
  2. 解析HTML(因为它不是格式良好的XML,您可能需要首先清理它。使用像tagsoup这样的东西)
  3. 对于每个<a>标记,获取其内容并尝试连接到该标记。
  4. 如果<a>中的网址属于您的网站,请根据需要以递归方式重复。请确保将已处理的网址存储在地图中,这样就不会多次执行此操作。

相关问题