【学习笔记】Java网络爬虫实战——使用Jsoup下载图片/PDF/压缩文件

        今天博主在学习研究Java网络爬虫时总体过了一遍Jsoup的相关知识,因此对部分知识点进行了总结梳理。
        在使用Jsoup下载图片、PDF和压缩文件等文件时,需要将响应转化成输出流。转化成输出流的目的是增强写文件的能力,即以字节为单位写入到指定文件。

相关代码如下所示:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.jsoup.Connection;
import org.jsoup.Connection.Method;
import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;

public class JsoupConnectInputstream {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		String imageUrl = "https://pics2.baidu.com/feed/"
				+ "838ba61ea8d3fd1fbd5a89ffb395331997ca5f81.jpeg?"
				+ "token=356d8430ac041f2c1a62dc7630578813&s=3FF6109F040264E404BCEBFB0300702F";
		Connection connect = Jsoup.connect(imageUrl);
		Response response = connect.method(Method.GET).ignoreContentType(true).execute();
		System.out.println("文件类型为:" + response.contentType());
		// 响应转换成输入流
		BufferedInputStream bufferedInputStream = response.bodyStream();
		// 保存图片到项目文件夹HelloMaven下的image文件夹中
		saveImage(bufferedInputStream, "image/1.jpg");
	}
	/**
	 * saveImage保存图片操作
	 * @param 输入流
	 * @param 保存的文件目录
	 * @throws IOException
	 */
	static void saveImage(BufferedInputStream in, String savePath) throws IOException {
		byte[] buffer = new byte[1024];
		int len = 0;
		// 创建缓冲流
		FileOutputStream fileOutStream = new FileOutputStream(new File(savePath));
		BufferedOutputStream bufferedOut = new BufferedOutputStream(fileOutStream);
		// 图片写入
		while((len = in.read(buffer, 0, 1024)) != -1) {
			bufferedOut.write(buffer, 0, len);
		}
		// 缓冲流释放与关闭
		bufferedOut.flush();
		bufferedOut.close();
	}
}

        其中,针对图片和PDF等文件,在执行URL请求获取Response时,必须通过ignoreContentType(boolean ignoreContentType)方法设置忽略响应内容的类型,否则会报错。
        关于图片写入这部分代码块,read函数返回的是缓冲数组中实际上读入的字节数。

// 图片写入
		while((len = in.read(buffer, 0, 1024)) != -1) {
			bufferedOut.write(buffer, 0, len);
		}

public abstract int read():
        读取一个byte数据,返回值是高位补0的int类型值。若返回值为-1,说明未读取到任何字节,此时读取工作结束。
在这里插入图片描述

运行结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42506411/article/details/106932898