在整个过程中主要操作先获取图片地址,然后再下载到本地。
第一步,获取图片:
在获取图片过程中使用Jsoup提供的select选择器,[src$=.jpg]指的是匹配以“.jpg”结尾的元素。
Jsoup也提供了一些其他的匹配:
[attr^=value]:利用匹配属性值开头查找元素。
[attr$=value]:
利用匹配属性值结尾查找元素。
[attr*=value]
: 利用匹配属性值包含属性值来查找元素。
[attr~=regex]
: 利用属性值匹配正则表达式来查找元素。
public static void parseUrl(String urlPath,String dir) throws IOException{
Document doc = Jsoup.connect(urlPath).timeout(1000000).get();
Elements es=doc.select("a[href]"); //带有href属性的a元素
Elements pngs = doc.select("img[src$=.png]"); //扩展名为.png的图片
Elements jpgs = doc.select("img[src$=.jpg]"); //扩展名为.jpg的图片
Elements gifs = doc.select("img[src$=.gif]"); //扩展名为.gif的图片
createDirectory(dir); //如果目录不存在,则创建目录
downLoad(jpgs,dir);
}
在获取图片资源之后需要将该资源进行下载保存,但是在这之前先要创建保存目录:
//创建目录
public static void createDirectory(String dir){
File directory=new File(dir);
directory.mkdirs();
//director.mkdir()方法只能创建一级目录,其父级目录必须存在,否则会有异常
//使用mkdirs()方法可以创建多层级目录
}
然后需要对需要下载到本地图片资源进行创建:
在该过程中主要给图片命名,以及添加后缀(具体后缀从资源地址获取)。
//提取图片
public static void downLoad(Elements element,String dir){
for(Element link:element){
String imagesPath = link.attr("src");
System.out.println(imagesPath);
String[] arr=imagesPath.split("\\.");
String suffix=arr[arr.length-1];
try {
getImages(imagesPath, dir+"0000"+ ++COUNT +"."+suffix);
} catch (Exception e) {
continue;
}
}
}
最后保存图片:
public static void getImages(String urlPath,String fileName) throws Exception{
URL url=new URL(urlPath);
//http协议连接对象
HttpURLConnection con=(HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.setReadTimeout(6*10000);
if(con.getResponseCode()<10000){
InputStream inputStream=con.getInputStream();
byte[] data=readStream(inputStream);
if(data.length>(1024*10)){
FileOutputStream outputStream=new FileOutputStream(fileName);
outputStream.write(data);
outputStream.close();
}
}
}
//读取url中数据,并以字节的形式返回
public static byte[] readStream(InputStream inputStream) throws Exception{
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len=-1;
while((len=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
outputStream.close();
inputStream.close();
return outputStream.toByteArray();
}