我想扫描一些寻找断链的网站,最好使用Java。任何提示我怎么能开始这样做?
(我知道有些网站会这样做,但我想创建自己的个性化日志文件)
答案 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)
<a>
标记,获取其内容并尝试连接到该标记。 如果<a>
中的网址属于您的网站,请根据需要以递归方式重复。请确保将已处理的网址存储在地图中,这样就不会多次执行此操作。