我正在开发一个抓取小型网络目录的项目,并使用crawler4j实现了一个抓取工具。我知道RobotstxtServer应该检查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();
}
}
答案 0 :(得分:4)
crawler4j
使用网址规范化过程。根据{{3}}网站,事实上的标准,仅在域根上指定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
,但框架只会查看域根(如事实上的标准所指定)来查找此文件。因此,它将忽略在您的情况下声明的指令。