再次发布这个问题。我已经开始使用爬虫了,但我仍然坚持使用索引部分。我想要一种有效而快速的方法来索引链接。目前我正在做的是我将链接插入数据库,但检查唯一链接是开销,所以任何人都可以建议我做任何更好的方法。
您好我正在尝试构建一个网站抓取工具,它将抓取整个网站并获取其中的所有链接。这与“XENU”非常相似。但我无法弄清楚如何去做。我脑子里有一个算法但是速度很慢,下面会提到。
这是我想出的一些粗略概念。但它会很慢。所以任何人都可以建议我采用其他方法或增强这种算法。
此致 萨加尔。
答案 0 :(得分:2)
您所描述的方法几乎是您唯一可以做的事情。使其更快的唯一方法是通过单独的线程并行处理多个URL。这可以相对容易和大规模地完成:您只需要同步访问要处理的URL的池并保存结果,因此并行执行1000个线程应该可以正常工作。
答案 1 :(得分:1)
三年前我在J2ME上做过类似的事情。我们的想法是实现一个简单的HTML解析器,它将检测所有标签和媒体标签。每个链接都放在同步集合中。集合的元素由许多线程使用,这些线程将探索下一个URL等等。 那是3年前在有限的J2ME设备上。现在有一个非常强大的java全文搜索引擎Lucene。我建议您阅读此链接,其中包括使用Lucene进行网页抓取:http://www.codeproject.com/KB/java/JSearch_Engine.aspx
示例:
private static void indexDocs(String url)抛出异常{
//index page
Document doc = HTMLDocument.Document(url);
System.out.println("adding " + doc.get("path"));
try {
indexed.add(doc.get("path"));
writer.addDocument(doc); // add docs unconditionally
//TODO: only add HTML docs
//and create other doc types
//get all links on the page then index them
LinkParser lp = new LinkParser(url);
URL[] links = lp.ExtractLinks();
for (URL l : links) {
//make sure the URL hasn't already been indexed
//make sure the URL contains the home domain
//ignore URLs with a querystrings by excluding "?"
if ((!indexed.contains(l.toURI().toString())) &&
(l.toURI().toString().contains(beginDomain)) &&
(!l.toURI().toString().contains("?"))) {
//don't index zip files
if (!l.toURI().toString().endsWith(".zip")) {
System.out.print(l.toURI().toString());
indexDocs(l.toURI().toString());
}
}
}
} catch (Exception e) {
System.out.println(e.toString());
}
}
答案 2 :(得分:0)
假设这是出于学习目的,我建议您阅读有关网络抓取工具here的更多信息,这将为您提供比现有更多的信息/背景信息。你不需要实现所有这些,但可以选择最重要的onces。通过提供简单实现的this article。
将您的问题划分为小的逻辑块,以便您可以并行执行它们。查看Hadoop和GridGain等MapReduce实现。
答案 3 :(得分:0)
我想,你应该看看Apache Nutch Project。