Java 控制要在运行时爬网的URL列表

Java 控制要在运行时爬网的URL列表,java,web-crawler,crawler4j,Java,Web Crawler,Crawler4j,在crawler4j中,我们可以覆盖一个函数boolean shouldVisit(WebUrl-url),并通过返回“true”和“false”来控制是否允许对该特定url进行爬网 但是我们可以在运行时添加URL吗?如果是,有什么方法可以做到这一点? 目前,我可以在crawcontroller类中的开始(BasicCrawler.class,numberofcrawler)之前,使用addSeed(String URL)函数在程序开始时添加URL,如果我尝试使用addSeed(String U

在crawler4j中,我们可以覆盖一个函数
boolean shouldVisit(WebUrl-url)
,并通过返回“true”和“false”来控制是否允许对该特定url进行爬网

但是我们可以在运行时添加URL吗?如果是,有什么方法可以做到这一点? 目前,我可以在
crawcontroller
类中的
开始(BasicCrawler.class,numberofcrawler)
之前,使用
addSeed(String URL)
函数在程序开始时添加URL,如果我尝试使用
addSeed(String URL)
添加新URL,则会出现错误。是错误图像


任何帮助将不胜感激,请让我知道,如果任何关于该项目的更多细节需要回答这个问题

您可以随意实现此功能,并使其依赖于不应爬网的URL列表。然后,
shouldVisit
的实现将涉及询问给定URL是否在禁止URL(或允许URL)列表中,并在此基础上返回true或false。

您可以这样做

使用
public void schedule(WebURL)
将url添加到作为
frontier.java
类成员的爬虫边界。但为此,您需要使用
WebURL
类型的url。如果您想从字符串中创建一个
WebURL
。请查看
CrawlController.java
类中的
addSeed()
(以下代码)以了解它是如何将字符串(url)转换为WebURL的

还可以使用现有的frontier实例

希望这有帮助

public void addSeed(String pageUrl, int docId) {
        String canonicalUrl = URLCanonicalizer.getCanonicalURL(pageUrl);
        if (canonicalUrl == null) {
            logger.error("Invalid seed URL: " + pageUrl);
            return;
        }
        if (docId < 0) {
            docId = docIdServer.getDocId(canonicalUrl);
            if (docId > 0) {
                // This URL is already seen.
                return;
            }
            docId = docIdServer.getNewDocID(canonicalUrl);
        } else {
            try {
                docIdServer.addUrlAndDocId(canonicalUrl, docId);
            } catch (Exception e) {
                logger.error("Could not add seed: " + e.getMessage());
            }
        }

        WebURL webUrl = new WebURL();
        webUrl.setURL(canonicalUrl);
        webUrl.setDocid(docId);
        webUrl.setDepth((short) 0);
        if (!robotstxtServer.allows(webUrl)) {
            logger.info("Robots.txt does not allow this seed: " + pageUrl);
        } else {
            frontier.schedule(webUrl); //method that adds URL to the frontier at run time
        }
    } 
public void addSeed(字符串pageUrl,int docId){
字符串canonicalUrl=URLCanonicalizer.getCanonicalURL(pageUrl);
if(canonicalUrl==null){
logger.error(“无效的种子URL:+pageUrl”);
返回;
}
if(docId<0){
docId=docIdServer.getDocId(canonicalUrl);
如果(文档ID>0){
//已看到此URL。
返回;
}
docId=docIdServer.getNewDocID(canonicalUrl);
}否则{
试一试{
addUrlAndDocId(canonicalUrl,docId);
}捕获(例外e){
logger.error(“无法添加种子:+e.getMessage());
}
}
WebURL WebURL=新的WebURL();
setURL(canonicalUrl);
setDocid(docId);
webUrl.setDepth((短)0);
如果(!robotstxtServer.allows(webUrl)){
info(“Robots.txt不允许此种子:“+pageUrl”);
}否则{
frontier.schedule(webUrl);//在运行时将URL添加到frontier的方法
}
} 

是的,我理解你的答案,但我的问题是,如果我一开始就给了一个种子“www.facebook.com”,那么“facebook”域中的所有链接都将从函数
code
(“shouldVisit”)传递,并且根据函数的实现,它们将(不会)被允许,但我可以添加新的种子吗?比如说
code
('www.google.com')介于两者之间,而它正在爬网其URL列表中的
code
(facebook)。你清楚吗?是的,我的答案是相同的。你必须更改函数的实现,以依赖于一些可以更新的数据结构。你看过
controller.addSeed吗("http://www.ics.uci.edu/")
crawler4j网站首页上的示例?看起来你只需要再次调用它-这基本上是一个新的爬网,但我不认为这会有多大区别?是的,我有这个函数,但在运行时调用这个函数会出错。我的意思是,如果我在调用这个函数“controller.start”后调用这个函数(MyCrawler.class,numberOfCrawlers)’,现在开始给出错误。好的,那么也许您应该编辑您的问题以反映您遇到的问题,因为目前没有足够的细节供任何人帮助。