自己圈养小爬虫(四)——下载图片
提取出图片链接存入IMAGE_LIST中之后,下面就需要从中提取链接并下载。
但是在下载的时候发现很多小图片都是logo或者表情,浪费磁盘空间,而且效率底下。所以设置了一个最小大小限制,小于这个大小的图片将会跳过。
DownImage.java主要方法如下:
public boolean saveImage(String url){ System.out.println("开始下载:" + url); if(url == null){ return false; } try { this.url = new URL(url); urlConnection = (HttpURLConnection)this.url.openConnection(); if(urlConnection.getResponseCode() == 200){ if(urlConnection.getContentLength() < Config.MIN_SIZE){ System.out.println("下载图片过小,抛弃:" + urlConnection.getContentLength()); return false; } inputStream = urlConnection.getInputStream(); fileName =url.substring(url.lastIndexOf("/") + 1); File file = new File(Config.IMAGE_PATH , fileName); outputStream = new BufferedOutputStream(new FileOutputStream(file)); while((imageLenght = inputStream.read(imageBuffer)) > 0){ outputStream.write(imageBuffer, 0, imageLenght); } System.out.println("下载完成:" + fileName); } } catch (Exception e) { // TODO Auto-generated catch block return true; }finally{ try { if(outputStream != null) outputStream.close(); if(inputStream != null) inputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return true; }
通过HttpURLConnectio请求连接,它可以实现更复杂的请求。如果只是简单请求的话,可以使用InputStream is = this.url.openStream();
测试,成功!
期间有一个小插曲,因为想要读取出图片的大小,最开始用的是openStream()这种方法,但是openStream()没有直接读取整个文件的方法,只能把数据存入缓冲区。然后我就很贱的在之前尝试读取了一下长度,结果和读取文件一样,读取一次之后,读取的指针就往下移了设置的缓冲区的大小。
后果就是所有下载的图片都无法打开,原因是无法读取到文件头。因为我在第一次读取长度的时候读取到了,然后没有保存,这么弱智的错误害的我找了很长时间的问题。
不明白的查询下InputStream的操作就懂了。