我想抓取crawler4j
,某些具有特定前缀的网址。
例如,如果网址以http://url1.com/timer/image
开头,则该网址有效。例如:http://url1.com/timer/image/text.php
。
此网址无效:http://test1.com/timer/image
我试图像这样实现它:
public boolean shouldVisit(Page page, WebURL url) {
String href = url.getURL().toLowerCase();
String adrs1 = "http://url1.com/timer/image";
String adrs2 = "http://url2.com/house/image";
if (!(href.startsWith(adrs1)) || !(href.startsWith(adrs2))) {
return false;
}
if (filters.matcher(href).matches()) {
return false;
}
for (String crawlDomain : myCrawlDomains) {
if (href.startsWith(crawlDomain)) {
return true;
}
}
return false;
}
但是,这似乎不起作用,因为抓取工具也会访问其他网址。
我能提出什么建议?
感谢您的回答!
答案 0 :(得分:4)
基本上,您可以拥有一系列前缀,用于保存您要抓取的允许的网址。在你的方法内部只是遍历数组返回true,只要它与你允许的任何前缀一起使用。这意味着您不必列出任何您不想抓取的域名。
public boolean shouldVisit(Page page, WebURL url) {
String href = url.getURL().toLowerCase();
// prefixes that you want to crawl
String allowedPrefixes[] = {"http://url1.com", "http://url2.com"};
for (String allowedPrefix : allowedPrefixes) {
if (href.startsWith(allowedPrefix)) {
return true;
}
}
return false;
}
您的代码无效,因为您的情况不正确:
(!(href.startsWith(adrs1)) || !(href.startsWith(adrs2))
另一个原因是您可能没有配置crawlerDomains
。它是在应用程序启动期间通过调用CrawlController#setCustomData(crawler1Domains);
查看crawler4j的示例源代码,在此处设置crawlerDomains:MultipleCrawlerController.java#79
答案 1 :(得分:1)
请看下面的代码。它可能对你有所帮助。
public boolean shouldVisit(Page page,WebURL url) {
String href = url.getURL().toLowerCase();
String adrs1 = "http://url1.com/timer/image";
String adrs2 = "http://url2.com/house/image";
return !FILTERS.matcher(href).matches() && (href.startsWith(adrs1) || href.startsWith(adrs2));
}