2017-07-04 12 views
0

私はjavaでWebクローラを作成するチュートリアルに従っています。コードを実行すると、crawledURLnullになります。 ***不正な形式のURL:無限ループではnullです。なぜ私のcrawledURLがnullですか?

誰も私に説明することができますなぜこれが起こっているのですか?ここで

は、全体のコードです:

import java.util.*; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
import java.io.*; 
import java.net.*; 

public class WebCrawler { 

public static Queue<String> Queue = new LinkedList<>(); 
public static Set<String> marked = new HashSet<>(); 
public static String regex = "http[s]://(\\w+\\.)*(\\w+)"; 

public static void bfsAlgorithm(String root) throws IOException { 

    Queue.add(root); 

    while (!Queue.isEmpty()) { 

     String crawledURL = Queue.poll(); 
     System.out.println("\n=== Site crawled : " + crawledURL + "==="); 

     //Limiting to a 100 websites here 

     if(marked.size() > 100) 
      return; 

     boolean ok = false; 
     URL url = null; 
     BufferedReader br = null; 

     while (!ok) { 
      try { 
       url = new URL(crawledURL); 
       br = new BufferedReader(new InputStreamReader(url.openStream())); 
       ok = true; 

      } catch (MalformedURLException e) { 
       System.out.println("*** Malformed URL :" + crawledURL); 
       crawledURL = Queue.poll(); 
       ok = false; 

      } catch (IOException ioe) { 
       System.out.println("*** IOException for URL :" + crawledURL); 
       crawledURL = Queue.poll(); 
       ok = false; 


     } 

    } 

     StringBuilder sb = new StringBuilder(); 

     while((crawledURL = br.readLine()) != null) { 
      sb.append(crawledURL); 
     } 

     crawledURL = sb.toString(); 
     Pattern pattern = Pattern.compile(regex); 
     Matcher matcher = pattern.matcher(crawledURL); 


     while (matcher.find()){ 

      String w = matcher.group(); 

      if (!marked.contains(w)) { 
       marked.add(w); 
       System.out.println("Site added for crawling : " + w); 
       Queue.add(w); 
      } 
     } 

    } 

} 


public static void showResults() { 
    System.out.println("\n\nResults :"); 
    System.out.print("Web sites craweled: " + marked.size() + "\n"); 

    for (String s : marked) { 
     System.out.println("* " + s); 
    } 

} 

public static void main(String[] args) { 

    try { 

     bfsAlgorithm("http://www.ssaurel.com/blog"); 
     showResults(); 

    } catch (IOException e) { 

     //TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

}

+0

https://docs.oracle.com/javase/7キューは空です/docs/api/java/util/Queue.html#poll() – Lemonov

+0

ありがとうございますが、なぜ私のキューは空ですか?チュートリアルでは、 –

答えて

0
while (!Queue.isEmpty()) { 
    String crawledURL = Queue.poll(); 
... 
     } catch (MalformedURLException e) { 
      crawledURL = Queue.poll(); 

あなたがチェックしていない二回目は

+0

ありがとうございます。私は正確にチュートリアルに従っており、ビデオeverythihgはうまくいきます。なぜ私はこのエラーをキャッチしているのか理解しようとしているのです。 –

+0

また、不正なURL:null loop- –

+1

に進む前に '===サイトクロール済み:http://www.ssaurel.com/blog ==='も表示します。たとえば、while()の前に、 1つのURLを持つキュー、あなたはそれを抽出し、今は空のキュー()を持っています。あなたはこのURLのエラーを受け取り、空のキュー(null!)から次の要素を取り出し、それを使用しようとしました。 while(!ok && crawledUrl!= null) – rustot

関連する問題