我们在做抓取网页的爬虫时经常需要把网页的图片信息也一起下载下来,但是一篇文章往往有很多的图片,如果只是用单线程去抓取图片,那效率显然比较低,这个时候可以考虑使用多线程来下载图片,今天就用JAVA语言来实现一个使用多线程同时下载网页中所有图片的功能。好了,废话不多说,直接进入正题吧!
下载图片源代码
DownloadImages.java
/** * 堆代码 duidaima.com * 处理内容中包含的图片信息 * @param content */ private List<String> handleImages(String articleUrl, Element content) { List<String> newImgUrls = new Vector<>(); ExecutorService threadPool = Executors.newFixedThreadPool(MAX_IMAGE_NUM);//newCachedThreadPool(); Set<String> imgUrls = new HashSet<>();//图片去重 content.select("img").forEach(elem -> imgUrls.add(elem.absUrl("src"))); imgUrls.forEach(imgUrl -> threadPool.execute(()-> { if(newImgUrls.size() < MAX_IMAGE_NUM) { String newUrl = downloadImageAndUploadToCloud(imgUrl, articleUrl); if (newUrl != null && newImgUrls.size() < MAX_IMAGE_NUM) newImgUrls.add(newUrl); } })); //等待所有线程执行完毕并返回结果 try { threadPool.shutdown(); threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); } catch (InterruptedException e) { log.error("Download images interrupted", e); } threadPool.shutdownNow(); return newImgUrls; }
总结:
以上就是在JAVA中使用多线程技术实现同时下载多张图片的功能,若有不妥之处,还请指正,谢谢。