2016-04-20 3 views
1

Я занимаюсь разработкой веб-искателя, но я застрял, потому что я не могу получить все достижимые ссылки, вот мой код:Web Crawler с помощью jsoup

public class SNCrawler extends Thread { 

    Specific s; 

    HashSet<String> hs = new HashSet<String>(); 
    public SNCrawler(Specific s) 
    { 
     this.s = s; 
    } 

    public void crawl(String url) throws IOException { 

     Document doc = Jsoup.connect(url).get(); 
     Elements links = doc.select("a"); 

     for (Element link : links) 
     { 
      if(isSuitable(link.attr("href")) && !hs.contains(link.attr("abs:href"))) 
      { 
       hs.add(link.attr("href")); 
       crawl(link.attr("href")); 

      } 
     } 

    } 

    public boolean isSuitable(String site) 
    { 
     boolean myBool = false; 
     if(site.startsWith("http://www.svensktnaringsliv.se/") && !SNFilter.matcher(site).matches()) 
      if(site.contains(".pdf")) { 
       hs.add(site); 
       myBool=true; 
      }else{ 
       hs.add(site); 
       myBool=true; 
      } 
     return myBool; 

    } 

    private static final Pattern SNFilter = Pattern.compile(".*((/staff/|medarbetare|play|/member_organizations/|/sme_committee/|rm=print|/contact/|/brussels-office/|/about-us|/newsletter/|/advantagesweden/|service=print|#)).*"); 

    @Override 
    public void run() 
    { 
     try { 
      crawl("http://www.svensktnaringsliv.se/english/"); 
      for(String myS : hs) 
      { 
       System.out.println(myS); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

, когда программа достигает this часть сайта это Безразлично получить какую-либо ссылку с там, одними и теми же вещами для this страницы, оттуда я получаю только 2 или 3 ссылки, я посмотрел на коде в течение многих часов, но наклоняет действительно figute его, почему я застрял

+0

Я не использовал jsoup раньше, так что не могу дать вам ответ, я боюсь, но было интересно, почему вы не просто использовать что-то вроде регулярных выражений и ПГПС 'preg_match_all'. '/ <А \ с HREF = [" || '] ([A-Za-Z0-9 \ - \/\.?: \ \ # \ \ & \% \ =] +) (*.)? [ «|| '] /' должен захватить все ссылки в документе. Вы можете использовать 'curl' или даже просто' file_get_contents', если сервер разрешает его, помогите в этом [здесь] (http://stackoverflow.com/questions/3488425/php-ini-file-get-contents-external-url) –

+0

Извините, это более точный шаблон (или так я нашел) '/ ] * href = [\" || \ '] ([^ \ "\'] *) [\" || \ '] [ ^>] *>/ixgU' –

ответ

1

когда программа достигает этой части веб-сайта, она не получает никаких ссылок оттуда

Функция сканирования должна работать с абсолютными URL-адресами только. Попробуйте функцию ниже вместо:

public void crawl(String url) throws IOException { 
    Document doc = Jsoup.connect(url).get(); 
    Elements links = doc.select("a"); 

    for (Element link : links) { 
     String foundUrl = link.attr("abs:href").toLowerCase(); 

     if(isSuitable(foundUrl) && (!hs.contains(foundUrl))) { 
      hs.add(foundUrl); 
      crawl(foundUrl); 
     } 
    } 
}