Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 使用多线程的Web抓取_Java_Multithreading_Web Scraping - Fatal编程技术网

Java 使用多线程的Web抓取

Java 使用多线程的Web抓取,java,multithreading,web-scraping,Java,Multithreading,Web Scraping,我写了一个代码在IMDB上查找一些电影名称,但如果我正在搜索“哈利波特”,我会找到不止一部电影。我想使用多线程,但我对这方面的知识不多 我正在使用策略设计模式在更多的网站中搜索,例如在我的代码中的一个方法中 for (Element element : elements) { String searchedUrl = element.select("a").attr("href");

我写了一个代码在IMDB上查找一些电影名称,但如果我正在搜索“哈利波特”,我会找到不止一部电影。我想使用多线程,但我对这方面的知识不多

我正在使用策略设计模式在更多的网站中搜索,例如在我的代码中的一个方法中

            for (Element element : elements) {
            String searchedUrl = element.select("a").attr("href");
            String movieName = element.select("h2").text();
            if (movieName.matches(patternMatcher)) {
                Result result = new Result();
                result.setName(movieName);
                result.setLink(searchedUrl);
                result.setTitleProp(super.imdbConnection(movieName));
                System.out.println(movieName + " " + searchedUrl);
                resultList.add(result);
            }
        }
对于每个元素(即电影名称),它将在IMDB上创建一个新连接,以便在
super.imdbConnection(movieName)
行上查找收视率和其他内容

问题是,我希望同时拥有所有连接,因为在发现的5-6部电影中,这个过程将比预期的要长得多

我不是要代码,我想要一些想法。我曾想过创建一个实现Runnable的内部类,并使用它,但我觉得这没有任何意义

如何重写该循环以使用多线程


我使用Jsoup进行解析,元素和元素都来自该库。

最简单的方法是
parallelStream()


元素来自哪个库?另外,我们如何知道
super.imdbConnection(…)
do?元素来自Jsoup,对此表示抱歉。另外,imdbConnection是另一种方法,它建立到IMDB的连接,并查找分级、描述、预告片和流派。我没有任何东西可以在那里做得更快:(.我将编辑我的问题并指定,对不起,它就像一个符咒:)。我想我会开始学习流和更多的多线程!多谢各位@我更新了我的答案。我添加了使用线程的方法。另外,使用线程的方法也有很多种。再次感谢您!另外,感谢您对第二个问题的评论。@Lez,欢迎光临。如果你很难理解,尽管问吧。
List<Result> resultList = elements.parallelStream()
                                  .map(e -> {
            
                                      String searchedUrl = element.select("a").attr("href");
                                      String movieName = element.select("h2").text();

                                      if(movieName.matches(patternMatcher)){

                                          Result result = new Result();
                                          result.setName(movieName);
                                          result.setLink(searchedUrl);
                                          result.setTitleProp(super.imdbConnection(movieName));
                                          
                                          System.out.println(movieName + " " + searchedUrl);

                                          return result;

                                      }else{
                                          return null;
                                      }

                                  }).filter(Objects::nonNull)
                                  .collect(Collectors.toList());
List<Element> elements = new ArrayList<>();

//create a function which returns an implementation of `Callable`
//input: Element
//output: Callable<Result>
Function<Element, Callable<Result>> scrapFunction = (element) -> new Callable<Result>() {

    @Override
    public Result call() throws Exception{

        String searchedUrl = element.select("a").attr("href");
        String movieName = element.select("h2").text();
        if(movieName.matches(patternMatcher)){

            Result result = new Result();
            result.setName(movieName);
            result.setLink(searchedUrl);
            result.setTitleProp(super.imdbConnection(movieName));
            
            System.out.println(movieName + " " + searchedUrl);

            return result;

        }else{
            return null;
        }

    }

};

//create a fixed pool of threads
ExecutorService executor = Executors.newFixedThreadPool(elements.size());

//submit a Callable<Result> for every Element
//by using scrapFunction.apply(...)
List<Future<Result>> futures = elements.stream()
                                        .map(e -> executor.submit(scrapFunction.apply(e)))
                                        .collect(Collectors.toList());

//collect all results from Callable<Result>
List<Result> resultList = futures.stream()
                                .map(e -> {
                                    try{
                                        return e.get();
                                    }catch(Exception ignored){
                                        return null;
                                    }
                                }).filter(Objects::nonNull)
                                .collect(Collectors.toList());