Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java搜索网站的断开链接?_Java_Web Crawler_Broken Links - Fatal编程技术网

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

如何使用Java搜索网站的断开链接?,java,web-crawler,broken-links,Java,Web Crawler,Broken Links,我想扫描一些网站寻找断开的链接,最好使用Java。有什么提示吗?我该怎么做 (我知道有些网站可以这样做,但我想制作自己的个性化日志文件)编写一个递归检查链接的函数。 伪代码: function checklinks(String url){ try{ content=HTTP.getContents(url); String[] links=content.getAllRegexMatches('href="(http://.*?)"');

我想扫描一些网站寻找断开的链接,最好使用Java。有什么提示吗?我该怎么做


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

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

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来完成传递到下一个递归的链接

  • 使用一些HTTP客户机为Java加载网站首页
  • 解析HTML(由于它不是格式良好的XML,您可能需要首先清理它。使用tagsoup之类的东西)
  • 对于每个
    标记,获取其内容并尝试连接到它
    如有必要,如果
    中的URL属于您的站点,请递归重复此操作。确保在地图中存储您已经处理过的URL,这样您就不会不止一次了。

    编写web爬虫程序并不像读取静态HTML那么简单,如果页面使用JavaScript修改DOM,那么它会变得复杂。你还需要寻找你已经访问过的网页,也就是蜘蛛陷阱?如果网站是纯静态HTML,那么就去吧。。。但是如果站点使用Jquery并且很大,那么它可能会很复杂

    如果你的站点都是静态的,很小,没有JS或者JS很少,那么使用已经列出的答案

    您可以使用404的crawl.log,然后在以后对其进行解析

    或者如果你自己写的最多:

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

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


    要避免离开您的站点,请在将URL添加到未访问队列之前检查URL是否位于安全域列表中。如果要确认域外链接正常,请将它们保留在域外队列中。然后稍后使用URL.getContent(URL)加载此队列中的每个链接,以查看它们是否有效(比使用HTMLUnit更快,而且您无需解析页面)。

    foreach(链接作为字符串链接)
    他们什么时候把它添加到Java中的?还要确保如果有外部链接,你不会处理整个internet。@Alex,这是从伪Java 1开始添加的。0@OscarRyz似乎他们也在那里添加了
    函数
    。。。还是1.2版?这些网站是否使用AJAX?您可以使用
    HttpURLConnection
    类和
    JTidy
    下载/解析整个(X)HTML代码,但对于动态AJAX网站来说并不是那么简单。对于这种情况,您可以查看SeleniumJavaAPI。