1

我只想抓取具有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。

有什么建议吗?

我很感激你的回答!

4

2 回答 2

4

基本上,您可以拥有一组前缀,其中包含您想要抓取的允许 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

于 2014-09-16T09:23:39.873 回答
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));
}
于 2014-09-18T05:21:29.233 回答