0

在 crawler4j 中,我们可以重写一个函数boolean shouldVisit(WebUrl url)并通过返回“true”和“false”来控制是否应该允许抓取特定的 url。

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

任何帮助将不胜感激,如果需要有关项目的更多详细信息来回答问题,请告诉我。

4

2 回答 2

1

你可以这样做。

用于public void schedule(WebURL url)将 URL 添加到作为Frontier.java类成员的爬虫边界。但为此,您需要拥有 type 的 url 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
        }
    } 
于 2012-07-19T06:39:00.863 回答
0

大概您可以随心所欲地实现此功能,并使其依赖于不应被抓取的 URL 列表。的实现shouldVisit将涉及询问给定的 URL 是否在您的禁止 URL(或允许的 URL)列表中,并在此基础上返回 true 或 false。

于 2012-07-14T09:37:29.147 回答