2010-12-31 6 views
1

この質問を再度投稿してください。私はクローラで始まっていますが、インデックスパートにこだわっています。リンクを効率的かつ迅速にインデックスしたいと思います。私はデータベースにリンクを挿入していますが、ユニークなリンクを確認することはオーバーヘッドですので、誰も私にこのより良い方法を提案することができます。私はどのようにしてJavaを使用してWebクローラを構築するのですか


こんにちは私は、全体のウェブサイトをクロールし、「ジヌー」に非常によく似it.Something内のすべてのリンクを取得するウェブサイトのクローラーを構築しようとしています。しかし、私はそれのために行く方法を理解することができません。私は私の心の中に1つのアルゴリズムを持っていますが、それは非常に遅いでしょう、それは以下の言及です。

  1. ホームページのソースを入手してください。
  2. ソースからすべてのアンカータグを取得します。
  3. アンカータグのURLを取得します。
  4. URL が同じサイトまたは外部の サイトに属していることを確認してください。
  5. 上記のプロセスで見つかった のURLを取得し、確認済みのURLに とマークします。
  6. 未記入のURLがなくなるまでこのプロセスを繰り返します。

これは私が思い付いたものの大まかな考えです。しかし、それは非常に遅くなります。だから、誰かが私にいくつかの他のアプローチを提案したり、このアルゴリズムを強化することができます。

よろしく、 Sagar。

答えて

2

説明した方法は、あなたができる唯一の方法です。高速化する唯一の方法は、別々のスレッドを介して複数のURLを並列処理することです。これは比較的容易に、大量に行うことができます。処理するURLへのアクセスを同期させ、結果を保存するだけで済みます。したがって、1000スレッドで並列処理を実行する必要があります。

0

これは学習目的のためのもので、ウェブクローラーhereについて詳しく読むことをお勧めします。これは、あなたが既に持っているより多くの情報/コンテキストを提供します。あなたはそのすべてを実装する必要はありませんが、最も重要なものを選ぶことができます。単純な実装を提供するthis articleを参照してください。

問題を小さな論理チャンクに分割して、それらを並列に実行できるようにします。 HadoopやGridGainなどの実装はMapReduceです。

1

私は3年前にJ2MEで同様のことをしました。アイデアは、すべてのタグとメディアタグを検出する単純なHTMLパーサを実装することでした。すべてのリンクは同期されたコレクションに入れられます。コレクションの要素は、次のURLなどを探索するいくつかのスレッドによって消費されます。 3年前に限られたJ2MEデバイスであった。現在、非常に強力なJava全文検索エンジンであるLuceneが存在する。http://www.codeproject.com/KB/java/JSearch_Engine.aspx

例:私はあなたがクロールのWebページのためのLuceneを使用して構成され、このリンクを読むことをお勧めします

プライベートの静的な無効indexDocs(文字列の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()); 
    } 
} 
関連する問題