zoukankan      html  css  js  c++  java
  • 自己圈养小爬虫(四)——下载图片

    提取出图片链接存入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;
    }
    View Code

    通过HttpURLConnectio请求连接,它可以实现更复杂的请求。如果只是简单请求的话,可以使用InputStream is = this.url.openStream();

    测试,成功!

    期间有一个小插曲,因为想要读取出图片的大小,最开始用的是openStream()这种方法,但是openStream()没有直接读取整个文件的方法,只能把数据存入缓冲区。然后我就很贱的在之前尝试读取了一下长度,结果和读取文件一样,读取一次之后,读取的指针就往下移了设置的缓冲区的大小。

    后果就是所有下载的图片都无法打开,原因是无法读取到文件头。因为我在第一次读取长度的时候读取到了,然后没有保存,这么弱智的错误害的我找了很长时间的问题。

    不明白的查询下InputStream的操作就懂了。

  • 相关阅读:
    Cookie 干货
    element-ui 框架中使用 NavMenu 导航菜单组件时,点击一个子菜单会出现多个子菜单同时展开或折叠?
    数组遍历的方法
    前端网页字体
    样式小收藏:完成、错误、提示动态图标样式
    多语言网站利器 rel="alternate" hreflang="x"
    网页中文章显示一部分,然后“查看全文”
    仿水滴筹中快捷留言祝福、随机生成祝福
    TypeScript知识点
    前端项目经验
  • 原文地址:https://www.cnblogs.com/mnight/p/3677652.html
Copyright © 2011-2022 走看看