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

时间:2012-07-14 09:32:03

标签: java web-crawler crawler4j

在crawler4j中,我们可以覆盖函数boolean shouldVisit(WebUrl url),并通过返回'true'和'false'来控制是否允许抓取特定的url。

但是我们可以在运行时添加URL吗?如果是的话,有什么方法可以做到这一点? 目前,我可以在addSeed(String url)start(BasicCrawler.class, numberOfCrawlers)之前使用CrawlController函数在程序开头添加网址,如果我尝试使用addSeed(String url)添加新网址,则会给出错误。 Here是错误图片。

如果有任何关于项目的更多细节需要回答这个问题,那么任何帮助都会很感激。

2 个答案:

答案 0 :(得分:1)

你可以这样做。

使用public void schedule(WebURL url)将网址添加到作为Frontier.java类成员的抓取工具边界。但为此,您需要输入WebURL类型的网址。如果你想从你的字符串中取出WebURL。请查看addSeed()类中的CrawlController.java(下面的代码),了解它如何将字符串(url)转换为WebURL。

也使用现有的边界实例。

希望这会有所帮助..

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

答案 1 :(得分:0)

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