2016-03-07 3 views
0

Я работаю над проектом, чтобы просканировать небольшой веб-каталог и реализовал искатель с помощью crawler4j. Я знаю, что RobotstxtServer должен проверять, разрешен или запрещен файл robots.txt, но у меня все еще отображается каталог, который не следует посещать.crawler4j, кажется, игнорирует файл robots.txt ... Как его исправить?

Я много раз читал исходный код и код, но не могу понять, почему это так. Короче говоря, почему моя программа не распознает файл/donotgohere/file, о котором говорит файл robots.txt?

Ниже приведен код программы. Любая помощь была бы потрясающей. Спасибо!

Гусеничный:

package crawler_Project1_AndrewCranmer; 
import java.util.Set; 
import java.util.regex.Pattern; 
import java.io.IOException; 
import edu.uci.ics.crawler4j.crawler.Page; 
import edu.uci.ics.crawler4j.crawler.WebCrawler; 
import edu.uci.ics.crawler4j.parser.HtmlParseData; 
import edu.uci.ics.crawler4j.url.WebURL; 

public class MyCrawler extends WebCrawler 
{ 
    private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|gif|jpg|png|mp3|mp3|zip|gz))$"); 

    @Override public boolean shouldVisit(Page referringPage, WebURL url) 
    { 
     String href = url.getURL().toLowerCase(); 
     return !FILTERS.matcher(href).matches() 
       && href.startsWith("http://lyle.smu.edu/~fmoore"); 
    } 

    @Override public void visit(Page page) 
    { 
     String url = page.getWebURL().getURL(); 
     System.out.println("URL: " + url); 
     if(page.getParseData() instanceof HtmlParseData) 
     { 
      HtmlParseData h = (HtmlParseData)page.getParseData(); 
      String text = h.getText(); 
      String html = h.getHtml(); 
      Set<WebURL> links = h.getOutgoingUrls(); 
     } 
    } 
} 

Контроллер:

package crawler_Project1_AndrewCranmer; 
import edu.uci.ics.crawler4j.crawler.CrawlConfig; 
import edu.uci.ics.crawler4j.crawler.CrawlController; 
import edu.uci.ics.crawler4j.fetcher.PageFetcher; 
import edu.uci.ics.crawler4j.robotstxt.RobotstxtConfig; 
import edu.uci.ics.crawler4j.robotstxt.RobotstxtServer; 

public class Controller 
{ 
    public static void main(String[] args) throws Exception 
    { 
     int numberOfCrawlers = 1; 
     String crawlStorageFolder = "/data/crawl/root"; 

     CrawlConfig c = new CrawlConfig(); 
     c.setCrawlStorageFolder(crawlStorageFolder); 
     c.setMaxDepthOfCrawling(-1); //Unlimited Depth 
     c.setMaxPagesToFetch(-1);  //Unlimited Pages 
     c.setPolitenessDelay(200);  //Politeness Delay 

     PageFetcher pf = new PageFetcher(c); 
     RobotstxtConfig robots = new RobotstxtConfig(); 
     RobotstxtServer rs = new RobotstxtServer(robots, pf); 
     CrawlController controller = new CrawlController(c, pf, rs); 

     controller.addSeed("http://lyle.smu.edu/~fmoore"); 

     controller.start(MyCrawler.class, numberOfCrawlers); 

     controller.shutdown(); 
     controller.waitUntilFinish(); 
    } 
} 

ответ

4

crawler4j использует процесс канонизации URL. Согласно веб-сайту robotstxt.org, де-факто стандарт содержит только robots.txt файлов в корне домена. По этой причине crawler4j будет искать только там для robots.txt.

В вашем случае http://lyle.smu.edu/ не предоставляет robots.txt по адресу http://lyle.smu.edu/robots.txt (это даст HTTP 404).

robots.txt находится здесь http://lyle.smu.edu/~fmoore/robots.txt, но инфраструктура будет рассматривать только корень домена (как указывает стандарт де-факто), чтобы найти этот файл. По этой причине он будет игнорировать директивы, объявленные в вашем случае.