我们如何使用Java构建网站Crawler

时间:2010-12-31 06:26:03

标签: java lucene solr web-crawler

再次发布这个问题。我已经开始使用爬虫了,但我仍然坚持使用索引部分。我想要一种有效而快速的方法来索引链接。目前我正在做的是我将链接插入数据库,但检查唯一链接是开销,所以任何人都可以建议我做任何更好的方法。


您好我正在尝试构建一个网站抓取工具,它将抓取整个网站并获取其中的所有链接。这与“XENU”非常相似。但我无法弄清楚如何去做。我脑子里有一个算法但是速度很慢,下面会提到。

  1. 获取主页的来源。
  2. 从中获取所有锚标记     资源。
  3. 从中获取网址     锚标记。
  4. 检查网址     属于同一网站或外部     站点。
  5. 获取网址的来源     我们在上面的过程中找到了     将这些网址标记为已选中。
  6. 重复此过程,直到有         没有未标记的网址。
  7. 这是我想出的一些粗略概念。但它会很慢。所以任何人都可以建议我采用其他方法或增强这种算法。

    此致 萨加尔。

4 个答案:

答案 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