抓取具有特定前缀的网址

时间:2014-09-14 08:05:19

标签: java web-crawler crawler4j

我想抓取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;
}

但是,这似乎不起作用,因为抓取工具也会访问其他网址。

我能提出什么建议?

感谢您的回答!

2 个答案:

答案 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));
}