2016-03-07 54 views
0

我正在研究抓取小型網頁目錄的項目,並使用crawler4j實現了抓取工具。我知道RobotstxtServer應該檢查robots.txt文件是否允許/拒絕某個文件,但是我仍然顯示一個不應該被訪問的目錄。crawler4j似乎忽略了robots.txt文件...如何解決它?

我已經閱讀了源代碼和我的代碼多次,但我似乎無法弄清楚爲什麼這是。簡而言之,爲什麼我的程序不能識別robots.txt文件所說的/ donotgohere /文件?

下面是我的程序代碼。任何幫助都是極好的。謝謝!

履帶:

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.txthttp://lyle.smu.edu/robots.txt(這將給出一個HTTP 404)。

您的robots.txt位於這裏http://lyle.smu.edu/~fmoore/robots.txt,但該框架只會查看域根(作爲事實上的標準指定)來查找此文件。出於這個原因,它會忽略在你的情況下宣佈的指令。