Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用特定前缀对URL进行爬网_Java_Web Crawler_Crawler4j - Fatal编程技术网

Java 使用特定前缀对URL进行爬网

Java 使用特定前缀对URL进行爬网,java,web-crawler,crawler4j,Java,Web Crawler,Crawler4j,我只想使用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().toLowe

我只想使用
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(crawler1域)配置的


看看crawler4j的示例源代码,这里设置了crawlerDomains:

基本上,您可以有一个前缀数组,其中包含要爬网的允许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(crawler1域)配置的


查看crawler4j的示例源代码,这里设置了crawlerDomains:

查看下面的代码。这可能对你有帮助

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

请看下面的代码。这可能对你有帮助

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

当您提供正确的URL(带有特定前缀的URL)时,会发生什么情况?当您提供正确的URL(带有特定前缀的URL)时,会发生什么情况?它们会工作吗?