在采集数据时,经常会遇到一些较大的文件,如包含大量文本信息的HTML文件、大小超过10M的图片、PDF和ZIP等文件。在默认情况下,Jsoup最大只能获取1M的文件。因此,直接使用Jsoup请求包含大量文本信息的HTML文件,将导致获取的内容不全;请求大小超过1M的图片和ZIP等文件,将导致文件无法查看或解压。但在Jsoup中,可以使用maxBodySize(int bytes)设置请求文件大小限制,来避免这种问题的出现。例如,使用程序3-13下载SpringBoot.pdf(大小为9.5M) 时,Integer.MAX_VALUE为设置的请求文件大小。
//程序3-13
public class JsoupConnectBodySize {
public static void main(String[] args) throws IOException {
String url = "https://www.leichuangkj.com/SpringBoot.pdf";
//超时时间设置长一些,下载大文件
Connection.Response response = Jsoup.connect(url).maxBodySize(Integer.MAX_VALUE).method(Connection.Method.GET).ignoreContentType(true).execute();
//如果响应成功,则执行下面的操作
if (response.statusCode() == 200) {
//响应转化成输出流
BufferedInputStream bufferedInputStream = response.bodyStream();
//保存图片
saveFile(bufferedInputStream,"/Users/steven/Documents/代码/project/spider/src/main/java/com/file/SpringBoot.pdf");
}
}
/**
* 保存文件
* @param inputStream
* @param savePath
*/
static void saveFile(BufferedInputStream inputStream, 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 = inputStream.read(buffer, 0, 1024)) != -1) {
bufferedOut.write(buffer, 0, len);
}
//缓冲流释放与关闭
bufferedOut.flush();
bufferedOut.close();
}
}