2016-01-10 15 views
0

對於excerise,我想製作自己的Web爬網程序,但是我的爬行方法經常被調用。它應該從鏈接數組中的每一個鏈接開始,直到我決定放棄整個程序,但它僅適用於該數組中的第一個元素,所以它只是在沒有任何進展的情況下前後移動。我怎樣才能解決這個問題?Recurrency在Web Crawler項目中效果不佳

Crawler.java

package regularmikey.mikecrawler; 

import java.io.IOException; 

import org.jsoup.HttpStatusException; 
import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 

public class Crawler implements Runnable { 

    private Elements links; 
    private Document doc; 
    private String start_url; 


    public Crawler(){}; 
    public Crawler(String url){start_url = url;}; 


    public void crawl(String url) { 

     try { 
      System.out.println(url); 
      doc = Jsoup.connect(url).get(); 

      String title = doc.title(); 
      System.out.println("title : " + title); 

      links = doc.select("a[href]"); 
      for (Element link : links) { 
       if(AdressValidator.validAddress(link.attr("href"))) { 
       crawl(link.attr("href")); 
       } 
      } 
     } catch (org.jsoup.UnsupportedMimeTypeException e) { 

      e.printStackTrace(); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } 

    } 


    public void run() { 

      crawl(start_url); 

    } 
} 

App.java

package regularmikey.mikecrawler; 

public class App 
{ 
    public static void main(String[] args) 
    { 
     Thread thread = new Thread(new Crawler("http://facebook.com")); 
     thread.run(); 

    } 
} 

回答

1

您可以創建已經到達的URL列表。

private List<String> urls = new ArrayList<String>(); 

//some code 

for (Element link : links) { 
      if(!urls.contains(link.attr("abs:href"))){ 
       urls.add(link.attr("abs:href")); 
       crawl(link.attr("abs:href")); 
      } 
} 

編輯:用@PallyP完成答案

0

試着改變你的

crawl(link.attr("href"))

crawl(link.attr("abs:href"))

添加abs:前綴將返回絕對URL(例如, 「http://facebook.com」)

0

class Crawler私有成員由每個(遞歸改寫)調用crawl()

private Elements links; 
private Document doc; 

public void crawl(String url) { 

    try { 
     // ... 
     doc = Jsoup.connect(url).get(); 
     links = doc.select("a[href]"); 

      crawl(link.attr("href")); 
    } 
} 

這意味着,如果crawl()回報,linksdoc遞歸調用不會恢復到其以前的值。

這應該首先通過linksdoc的局部變量在crawl()之內解決。