我只想使用crawler4j
进行爬网,即某些具有特定前缀的URL。
因此,例如,如果URL以http://url1.com/timer/image
开头,则它是有效的。例如:http://url1.com/timer/image/text.php
。
此URL无效: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;
}
然而,这似乎不起作用,因为爬网程序还会访问其他URL。
有什么我可以推荐的吗?
我很感激你的回答!
基本上,您可以拥有一个前缀数组,其中包含要爬网的允许URL。在你的方法内部,只要遍历数组,只要它带有你允许的任何前缀,就会返回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
查看下面的代码。它可能对你有帮助。
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));
}