爬网带有特定前缀的URL



我只想使用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));
}

相关内容

  • 没有找到相关文章

最新更新