【问题标题】:Crawl urls with a certain prefix抓取带有特定前缀的网址
【发布时间】:2014-09-14 08:05:18
【问题描述】:

我只想用 crawler4j 抓取某些具有特定前缀的 URL。

例如,如果 URL 以 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;
}

但是,这似乎不起作用,因为爬虫还会访问其他 URL。

有什么推荐的吗?

感谢您的回答!

【问题讨论】:

  • 当您提供正确的网址(带有特定前缀的网址)时会发生什么,它们是否有效?

标签: java web-crawler crawler4j


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    看看下面的代码。它可能会帮助你。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      • 2021-09-26
      • 2013-11-28
      相关资源
      最近更新 更多