java多线程下载图片_Java爬虫之多线程下载IMDB中Top250电影的图片

介绍

在博客:Java爬虫之下载IMDB中Top250电影的图片中我们实现了利用Java爬虫来下载图片,但是效率不算太高。本次分享将在此基础上,利用多线程,提高程序运行的效率。

思路

本次分享建立在博客Java爬虫之下载IMDB中Top250电影的图片上,总体的爬虫思路没有变化,只是在此基础上引入多线程。多线程的思路如下:

Java的每个任务类必须实现Runnable接口,因此,我们将新建ImageDownload类来实现Runnable接口。ImageDownload类的构造函数的参数有: url:网站的网址, dir: 图片储存目录。并在run()方法中实现将网页中的图片下载到本地。

在主函数中,调用ImageDownload类,利用多线程实现爬虫下载,提高运行效率。

程序

ImageDownload类的代码完整如下:

package wikiScrape;

import java.io.File;

import java.io.IOException;

import java.net.MalformedURLException;

import java.net.URL;

import java.net.URLConnection;

import org.apache.commons.io.FileUtils;

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.select.Elements;

/* ImageDownload类实现Runnable接口

* ImageDownload类的构造参数: url:网址的网址, dir: 图片存储目录

* ImageDownload类实现了将网页中的图片下载到本地

*/

public class ImageDownload implements Runnable{

private String url;

private String dir;

public ImageDownload(String url, String dir) {

this.url = url;

this.dir = dir;

}

// run()函数: 将网页中的电影图片下载到本地

@Override

public void run(){

// 利用URL解析网址

URL urlObj = null;

try{

urlObj = new URL(url);

}

catch(MalformedURLException e){

System.out.println("The url was malformed!");

}

// URL连接

URLConnection urlCon = null;

try{

// 打开URL连接

urlCon = urlObj.openConnection();

// 将HTML内容解析成UTF-8格式

Document doc = Jsoup.parse(urlCon.getInputStream(), "utf-8", url);

// 提取电影图片所在的HTML代码块

Elements elems = doc.getElementsByClass("ss-3 clear");

Elements pic_block = elems.first().getElementsByTag("a");

for(int i=0; i

// 提取电影图片的url, name

String picture_url = pic_block.get(i).getElementsByTag("img").attr("src");

String picture_name = pic_block.get(i).getElementsByClass("bb").text()+".jpg";

// 用download()函数将电影图片下载到本地

download(picture_url, dir, picture_name);

System.out.println("第"+(i+1)+"张图片下载完毕!");

}

}

catch(IOException e){

System.out.println("There was an error connecting to the URL");

}

}

// download()函数利用图片的url将图片下载到本地

public static void download(String url, String dir, String filename) {

try {

/* httpurl: 图片的url

* dirfile: 图片的储存目录

*/

URL httpurl = new URL(url);

File dirfile = new File(dir);

// 如果图片储存的目录不存在,则新建该目录

if (!dirfile.exists()) {

dirfile.mkdirs();

}

// 利用FileUtils.copyURLToFile()实现图片下载

FileUtils.copyURLToFile(httpurl, new File(dir+filename));

}

catch(Exception e) {

e.printStackTrace();

}

}

}

主函数ImageScraper.java的代码如下:

package wikiScrape;

/* 本爬虫利用多线程爬取http://www.imdb.cn/IMDB250/中Top250的图片

* 先利用Jsoup解析得到该网页中的图片的url

* 然后利用FileUtils.copyURLToFile()函数将图片下载到本地

*/

import wikiScrape.ImageDownload;

import java.util.ArrayList;

import java.util.concurrent.*;

import java.util.Date;

public class ImageScraper {

public static void main(String[] args) {

Date d1 = new Date();

System.out.println("爬虫开始......");

// 爬取的网址列表,一共十个网页

ArrayList urls = new ArrayList();

urls.add("http://www.imdb.cn/IMDB250/");

for(int i=2; i<=10; i++) {

urls.add("http://www.imdb.cn/imdb250/"+ Integer.toString(i));

}

String dir = "E://log/"; // 图片储存目录

// 利用多线程下载每个页面中的图片

ExecutorService executor = Executors.newCachedThreadPool();

// Create and launch 100 threads

for(int i=0; i<10; i++) {

executor.execute(new ImageDownload(urls.get(i), dir));

}

executor.shutdown();

// wait until all tasks are finished

while(!executor.isTerminated()) {

}

System.out.println("程序运行完毕!");

Date d2 = new Date();

// 计算程序的运行时间,并输出

long seconds = (d2.getTime()-d1.getTime())/1000;

System.out.println("一共用时: "+seconds+"秒.");

}

}

运行

运行上述主函数,结果如下:

257004fec70010cef18787aa5173e2b5.png

一共也是下载了244张图片,运行结果与博客:Java爬虫之下载IMDB中Top250电影的图片中的结果一模一样,但是时间却少了一半!可见利用多线程来写爬虫效率相当高!

本次分享到此结束,欢迎大家交流~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值