【问题标题】:How do we build a website Crawler using Java我们如何使用 Java 构建网站爬虫
【发布时间】:2010-12-31 06:26:03
【问题描述】:

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


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

  1. 获取主页的来源。
  2. 从 来源。
  3. 从 锚标记。
  4. 检查网址是否 属于同一站点或外部 网站。
  5. 获取网址的来源 我们在上述过程中发现和 将这些网址标记为已选中。
  6. 重复该过程,直到出现 没有未标记的网址。

这是我想出的一些粗略的想法。但这会很慢。那么任何人都可以建议我一些其他方法或增强这个算法。

问候, 萨加尔。

【问题讨论】:

    标签: java lucene solr web-crawler


    【解决方案1】:

    您描述的方法几乎是您唯一可以做的事情。使其更快的唯一方法是通过单独的线程并行处理多个 URL。这可以相对容易且大规模地完成:您只需要同步对待处理 URL 池的访问并保存结果,因此让 1000 个线程并行执行应该可以很好地工作。

    【讨论】:

      【解决方案2】:

      三年前我在 J2ME 上做过类似的事情。这个想法是实现一个简单的 HTML 解析器,它将检测所有标签和媒体标签。每个链接都放在一个同步的集合中。集合的元素被许多线程使用,这些线程将探索下一个 URL,依此类推。 那是 3 年前在有限的 J2ME 设备上。现在有 Lucene,它是一个非常强大的 Java 全文搜索引擎。我建议您阅读此链接,其中包含使用 Lucene 进行网页抓取:http://www.codeproject.com/KB/java/JSearch_Engine.aspx

      例子:

      private static void indexDocs(String url) throws Exception {

          //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());
          }
      } 
      

      【讨论】:

        【解决方案3】:

        假设这是出于学习目的,我建议您阅读更多关于网络爬虫here 的内容,这将为您提供比您已有的更多信息/上下文。您无需实现所有这些,但可以选择最重要的一次。通过提供简单实现的this article

        将您的问题分成小的逻辑块,以便您可以并行执行它们。看看MapReduce 的实现,比如 Hadoop 和 GridGain。

        【讨论】:

          【解决方案4】:

          我想,你应该看看Apache Nutch Project

          【讨论】:

            猜你喜欢
            • 2012-02-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多