java 读取url下载图片_Java简单实现解析网页和URL下载图片

问题:从指定网址上下载图片到本机。

要求:

通过解析页面,分析出指定图片,并且下载。注意:不是指定图片地址。

图片对应的网址:http://origin.cpc.ncep.noaa.gov/products/people/mchen/CFSv2FCST/monthly/ 要求,下载其中的SST这一列的全部图片。

下载前对图片是否已经存在要做判断。

提示:java解析网址用jsoup

1. 提前说明:本文使用maven完成,因为用到了Jsoup,pom文件中肯定要引啦。此外我还引入了log4j、slf4j-log4j12、commons-net。

口说无凭,pom.xml文件如下(dependencies部分)

log4j

log4j

1.2.17

org.slf4j

slf4j-log4j12

1.7.7

commons-net

commons-net

3.6

org.jsoup

jsoup

1.10.2

2. 全部引入后,配置log4j文件,将其放到 \src\main\resources目录下,取名log4j.properties(没有引入log4j、slf4j-log4j12的此步忽略)

log4j.properties配置文件如下:

log4j.rootLogger=INFO,Console,File

#定义日志输出目的地为控制台

log4j.appender.Console=org.apache.log4j.ConsoleAppender

log4j.appender.Console.Target=System.out

#可以灵活地指定日志输出格式,下面一行是指定具体的格式

log4j.appender.Console.layout = org.apache.log4j.PatternLayout

log4j.appender.Console.layout.ConversionPattern=[%d{yyyy-MM-dd HH\:mm} %c] - %m%n

#文件大小到达指定尺寸的时候产生一个新的文件

log4j.appender.File = org.apache.log4j.RollingFileAppender

#指定输出目录

log4j.appender.File.File = logs/info.log

#定义文件最大大小

log4j.appender.File.MaxFileSize = 10MB

# 输出所有日志,如果换成DEBUG表示输出DEBUG以上级别日志

log4j.appender.File.Threshold = ALL

log4j.appender.File.layout = org.apache.log4j.PatternLayout

log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

3. 开始撸码

1 packagecom.url;2

3 importorg.jsoup.Jsoup;4 importorg.jsoup.nodes.Document;5 importorg.jsoup.nodes.Element;6 importorg.jsoup.select.Elements;7 importorg.slf4j.Logger;8 importorg.slf4j.LoggerFactory;9

10 import java.io.*;11 importjava.net.HttpURLConnection;12 importjava.net.MalformedURLException;13 importjava.net.URL;14 importjava.net.URLEncoder;15

16 /**

17 *@author清风明月18 * @description19 * @date 2019/7/14 14:0820 */

21 public classParseUrl {22 private static final Logger logger = LoggerFactory.getLogger(ParseUrl.class);23 private static final String HTTP_URL = "https://origin.cpc.ncep.noaa.gov/products/people/mchen/CFSv2FCST/monthly/";24 private static final String IMAGE_PATH = "E:\\Projects\\image";25

26 public static voidmain(String[] args) {27 try{28 Document document =Jsoup.connect(HTTP_URL).get();29 Element table = document.getElementsByTag("table").get(0);30 Elements trs = table.select("tr");31 for (int i = 2; i < trs.size(); i++) {32 Element td = trs.get(i).select("td").get(1);33 Elements a = td.select("a[href^=images]");34 String image = a.attr("href");35 String imgUrl = HTTP_URL +image;36 downImages(imgUrl);37 }38 logger.info("本组图片已全部保存到" +IMAGE_PATH);39 } catch(IOException e) {40 e.printStackTrace();41 logger.error("读取页面内容失败");42 }43 }44

45 /**

46 *@param[imgUrl]47 *@returnvoid48 *@author清风明月49 * @date 2019/7/16 13:5950 */

51 private static voiddownImages(String imgUrl) {52 File imgFilePath = newFile(IMAGE_PATH);53 //如果目录不存在,创建目录

54 if (!imgFilePath.exists()) {55 boolean mkdir =imgFilePath.mkdir();56 logger.info(mkdir ? "程序已自动创建目录" : "");57 }58 //拼接image下载地址

59 String beforeUrl = imgUrl.substring(0, imgUrl.lastIndexOf("/") + 1);60 String imgName = imgUrl.substring(imgUrl.lastIndexOf("/") + 1);61 String newImgName =imgName;62

63 try{64 newImgName = URLEncoder.encode(imgName, "UTF-8");65 } catch(UnsupportedEncodingException e) {66 logger.error("图片名称有误");67 e.printStackTrace();68 }69 imgUrl = beforeUrl +newImgName;70 try{71 //获取下载地址

72 URL url = newURL(imgUrl);73 InputStream in = null;74 OutputStream out = null;75 try{76 //链接网络地址,创建连接对象

77 HttpURLConnection connection =(HttpURLConnection) url.openConnection();78 //建立到远程对象的实际连接

79 connection.connect();80 //连接成功

81 if (connection.getResponseCode() ==HttpURLConnection.HTTP_OK) {82 //获取链接的输入流

83 in =connection.getInputStream();84 //创建下载到本地的文件

85 File imgFile = newFile(IMAGE_PATH, imgName);86 if(imgFile.exists()) {87 logger.info(imgName + " 该图片已存在");88 } else{89 //写入文件

90 out = newFileOutputStream(imgFile);91 byte[] buf = new byte[1024];92 intlen;93 while ((len = in.read(buf)) != -1) {94 out.write(buf, 0, len);95 }96 out.flush();97 //断开连接

98 connection.disconnect();99 logger.info(imgName + "下载成功");100 }101 } else{102 logger.warn("连接失败");103 }104

105 } catch(IOException e) {106 logger.error("下载图片失败");107 e.printStackTrace();108 } finally{109 try{110 if (out != null) {111 out.close();112 }113

114 if (in != null) {115 in.close();116 }117 } catch(IOException e) {118 logger.error("读写流关闭出现异常");119 e.printStackTrace();120 }121 }122 } catch(MalformedURLException e) {123 logger.error("网址格式错误");124 e.printStackTrace();125 }126 }127 }

至此,大功告成。

最后给各位提两点建议(包括我):

调用close()方法前,手动加上flush()方法,并且close()方法尽量放在finally中,不要偷懒。否则有可能出现文件(包括图片、word文档等)下载完成却无法打开的情况;

如果下载的文件只有1KB,建议查看URL是否正确(例如https://少了s);

“我将永远忠于自己,披星戴月奔向理想和你”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值