我想扫描一些网站以查找损坏的链接,最好使用 Java。任何提示我该如何开始这样做?
(我知道有一些网站这样做,但我想制作自己的个性化日志文件)
我想扫描一些网站以查找损坏的链接,最好使用 Java。任何提示我该如何开始这样做?
(我知道有一些网站这样做,但我想制作自己的个性化日志文件)
编写网络爬虫并不像读取静态 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 更快,并且您无论如何都不需要解析页面。)。
<a>
标签,获取其内容并尝试连接到它。如有必要,如果 URL from<a>
属于您的站点,则递归重复。确保将您已处理的 URL 存储在地图中,这样您就不会多次执行此操作。
编写一个递归检查链接的函数。伪代码:
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 来完成传递给下一个递归的链接。