【问题标题】:Transferring one object between classes using crawler4j使用 crawler4j 在类之间传输一个对象
【发布时间】:2016-03-08 16:39:42
【问题描述】:

我是一个使用 crawler4j 构建块构建的简单网络爬虫。我正在尝试在爬虫爬行时构建字典,然后在构建和解析文本时将其传递给我的主(控制器)。既然我的 MyCrawler 对象不是在我的主类中创建的(使用 MyCrawler.class 作为第一个参数),我该怎么做?另外,我无法更改 controller.start 方法。我希望爬虫完成后能够使用爬虫中创建的字典。

我能想到的最好方法是让 controller.start 采用预定义和创建的 MyCrawler 对象,但我可以看到没有办法做到这一点。

下面是我的代码。非常感谢您的帮助!

爬虫:

public class MyCrawler extends WebCrawler
{
    private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|gif|jpg|png|mp3|mp3|zip|gz))$");
    public ArrayList<String> dictionary = new ArrayList<String>();

    @Override public boolean shouldVisit(Page referringPage, WebURL url)
    {
        String href = url.getURL().toLowerCase();
        return !FILTERS.matcher(href).matches()
                && href.startsWith("http://lyle.smu.edu/~fmoore"));
    }

    @Override public void visit(Page page)
    {
        String url = page.getWebURL().getURL();
        System.out.println("URL: " + url);
        if(page.getParseData() instanceof HtmlParseData)
        {
            HtmlParseData h = (HtmlParseData)page.getParseData();
            String text = h.getText();

            String[] words = text.split(" ");
            for(int i = 0;i < words.length;i++)
            {
                if(!words[i].equals("") || !words[i].equals(null) || !words[i].equals("\n"))
                    dictionary.add(words[i]);
            }

            String html = h.getHtml();
            Set<WebURL> links = h.getOutgoingUrls();

            System.out.println("Text length: " + text.length());
            System.out.println("Html length: " + html.length());
            System.out.println("Number of outgoing links: " + links.size());
            System.out.println(text);
        }
    }
}

控制器:

public class Controller 
{
    public ArrayList<String> dictionary = new ArrayList<String>();

    public static void main(String[] args) throws Exception
    {
        int numberOfCrawlers = 1;
        String crawlStorageFolder = "/data/crawl/root";

        CrawlConfig c = new CrawlConfig();
        c.setCrawlStorageFolder(crawlStorageFolder);
        c.setMaxDepthOfCrawling(-1);    //Unlimited Depth
        c.setMaxPagesToFetch(-1);       //Unlimited Pages
        c.setPolitenessDelay(200);      //Politeness Delay

        PageFetcher pf = new PageFetcher(c);
        RobotstxtConfig robots = new RobotstxtConfig();
        RobotstxtServer rs = new RobotstxtServer(robots, pf);
        CrawlController controller = new CrawlController(c, pf, rs);

        controller.addSeed("http://lyle.smu.edu/~fmoore");

        controller.start(MyCrawler.class, numberOfCrawlers);        

        controller.shutdown();
        controller.waitUntilFinish();
    }
}

【问题讨论】:

    标签: java web-crawler crawler4j


    【解决方案1】:

    WebCrawlerFactory 创建您的MyCrawler 对象。这应该可以解决问题(至少从 4.2 版开始)。但是你的dictionary 应该支持并发访问(一个简单的ArrayList 不支持!)

    // use a factory, instead of supplying the crawler type to pass the dictionary
    controller.start(new WebCrawlerFactory<MyCrawler>() {
        @Override
        public MyCrawler newInstance() throws Exception {
            return new MyCrawler(dictionary);
        }
    }, numberOfCrawlers);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多