java buffer 保存图片_JAVA+Windows每日爬取必应壁纸

 我是小羊同学,一个兢兢业业的程序员

一、Jsoup的简单使用

  Jsoup是一款Java的HTML解析器,主要用来对HTML解析。就像我们熟知的dom4j一样,都是文档解析器,只不过后者主要用来解析XML文件。
  配置好Jsoup的jar包,我们来看一下它简单的使用。

import java.io.IOException;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;public class JsoupTest {  public static void main(String[] args) throws IOException {  //发送get请求获取必应首页文档对象    Document doc=Jsoup.connect("https://cn.bing.com").get();  //使用选择器选取类名为a11yhide的h1元素    Elements elements=doc.select("h1.a11yhide");    System.out.println("类名为a11yhide的h1标签的数量:"+elements.size());  //获取第一个元素    Element element=elements.get(0);    String text=element.text();    System.out.println(text);  }}

Jsoup提供select方法来帮助我们筛选想要的节点,该方法返回Elements对象,Elements类继承List,本质是一种线性数据结构,所以该对象具有List的相关方法。Document类继承Elenent类,Element类继承Node类。输出结果:

6da20e59640a87de1bd0690fbc76123f.png

浏览器打开必应首页按F12查看DOM结构:0c3d7d2784f33155f1b0b33630bb44dd.png  我们可以使用Jsoup获取必应首页背景图的URL:首先查看图片URL所在节点:7907ce34ab9f84f7c40343dd7aa8cd03.png  背景图的URL在标签内的标签中, id为“bgLink”。代码:

import java.io.IOException;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;public class Bing {  public static void main(String[] args) throws IOException {    Document doc=Jsoup.connect("https://cn.bing.com").get();    Element imageLink=doc.getElementById("bgLink");  //获取绝对路径    String imageURL=imageLink.absUrl("href");    System.out.println(imageURL);  }}

结果:739cc743d55aaedac6f5228e73803ca5.png
将结果输入浏览器地址栏即可访问,也可通过IO流下载到本地。

二、每天定时获取必应每日一图

获取当天保存的文件名

  因为要自动获取,首先要保证每天保存到本地的文件不能重名,下面是获取当天保存的文件名的方法,以当天日期为文件名。

  /**   * 获取自定义的时间戳   * @author luckyriver   *    * @return 当天日期的字符串形式.如:当天为6月20日,则返回 “06-28”   */public static String getSaveName() {    SimpleDateFormat formater = new SimpleDateFormat("MM-dd");    formater.applyPattern("MM-dd");    String saveName=formater.format(new Date());    return saveName;  }

当然你也可以用Java提供的UUID等作为文件名,保证文件名称的唯一性是最终目的,要不文件会被覆盖。

根据URL下载资源到本地:

  /**   * 拷贝URL资源到本地   *    * @author luckyriver   *    * @param url URL的字符串形式   * @param file  将要保存的文件   */public static void URLToFile(String url,File file){    URL imageURL=null;    InputStream is=null;    try {      //以必应首页图片为例      imageURL = new URL(url);      is=imageURL.openConnection().getInputStream();//得到输入流    } catch (Exception e1) {      e1.printStackTrace();    }    //建立缓冲输入流,包装得到的普通输入流    try(BufferedInputStream bif=new BufferedInputStream(is);              //建立缓冲输出流,包装文件输出流      BufferedOutputStream bof=          new BufferedOutputStream(new FileOutputStream(file)))    {//读写流程      int len;      byte[] buffer=new byte[1024*10];          while (-1!=(len=bif.read(buffer))) {            bof.write(buffer, 0, len);          }          bof.flush();    } catch (Exception e) {      e.printStackTrace();    }  }

我们知道文件后缀为.jpg,但是那是我们能看见罢了,我们要尽量提高代码复用性。

获取文件后缀:

/**   * 根据URL获取资源文件后缀名   * @author luckyriver   * @param url 目标URL   * @return 后缀名 如".jpg", ".html"   */  public static String getSuffix(URL url){    String suffix="";    try {      String type=url.openConnection().getContentType().split(";")[0];      suffix="."+type.split("/")[1];    } catch (IOException e) {      e.printStackTrace();    }    return suffix;  }

使用Jsoup获取必应首页背景图的URL:

/**   * 获取必应每日一图的URL   * @author luckyriver   * @return URL的字符串形式,失败则返回""   */  public static String getBingImageURL() {    Document doc;    String imageURL="";    try {      doc = Jsoup.connect("https://cn.bing.com").get();      Element imageLink=doc.getElementById("bgLink");      imageURL=imageLink.absUrl("href");    } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }    return imageURL;  }

最后的测试:

public static void main(String[] args) throws MalformedURLException {      URL imageURL=new URL(getBingImageURL());      String FileName=getSaveName()+getSuffix(imageURL);//"07-08.jpeg"      File parent=new File("D:\\desktop\\images\\");//保存路径      if (!parent.exists()) {        parent.mkdirs();      }      URLToFile(imageURL, new File(parent,FileName));//获取文件  }

打开对应路径查看:02500dd2612671378e1ca5712efa5363.png

完整代码如下:

import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.MalformedURLException;import java.net.URL;import java.text.SimpleDateFormat;import java.util.Date;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;public class Bing {  /**   * 获取自定义的时间戳   * @author luckyriver   *    * @return 当天日期的字符串形式.如:当天为6月20日,则返回 “06-28”   */  public static String getSaveName() {    SimpleDateFormat formater = new SimpleDateFormat("MM-dd");    formater.applyPattern("MM-dd");    String saveName=formater.format(new Date());    return saveName;  }  /**   * 拷贝URL资源到本地   * @param url URL的字符串形式   * @param file  将要保存的文件   */  public static void URLToFile(URL url,File file){    InputStream is=null;    try {      //以必应首页图片为例      is=url.openConnection().getInputStream();//得到输入流    } catch (Exception e1) {      e1.printStackTrace();    }    //建立缓冲输入流,包装得到的普通输入流    try(BufferedInputStream bif=new BufferedInputStream(is);              //建立缓冲输出流,包装文件输出流      BufferedOutputStream bof=          new BufferedOutputStream(new FileOutputStream(file)))    {//读写流程      int len;      byte[] buffer=new byte[1024*10];          while (-1!=(len=bif.read(buffer))) {            bof.write(buffer, 0, len);          }          bof.flush();    } catch (Exception e) {      e.printStackTrace();    }  }  /**   * 根据URL获取资源文件后缀名   * @author luckyriver   * @param url 目标URL   * @return 后缀名,失败则返回""。如  ".jpg", ".html"   */  public static String getSuffix(URL url){    String suffix="";    try {      String type=url.openConnection().getContentType().split(";")[0];      suffix="."+type.split("/")[1];    } catch (IOException e) {      e.printStackTrace();    }    return suffix;  }  /**   * 获取必应每日一图的URL   * @author luckyriver   * @return URL的字符串形式,失败则返回""   */  public static String getBingImageURL() {    Document doc;    String imageURL="";    try {      doc = Jsoup.connect("https://cn.bing.com").get();      Element imageLink=doc.getElementById("bgLink");      imageURL=imageLink.absUrl("href");    } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }    return imageURL;  }  /**  *测试  *  */  public static void main(String[] args) throws MalformedURLException {      URL imageURL=new URL(getBingImageURL());      String FileName=getSaveName()+getSuffix(imageURL);//"07-08.jpeg"      File parent=new File("D:\\desktop\\images\\");//保存路径      if (!parent.exists()) {        parent.mkdirs();      }      URLToFile(imageURL, new File(parent,FileName));//获取文件  }}

实现每天定时爬取

  上面的代码我们每天都要手动执行,考虑每天定时自动执行爬取:
一开始想到了Java提供的Timer类,但是不能因为每天爬一张图就让JVM一直跑着啊!
  回想刚开始学java,记事本里写完的代码要在命令行窗口编译运行,又因为我操作系统为Windows,自然想到写个简单的bat文件,然后设置系统定时任务。
但是,我们的类里面用到了第三方jar包,在命令行窗口编译会报错:9343d37d5a329a66b520ffd0d631d0be.png

解决方法:

1.下载并解压使用的Jsoup包bacadc6281f3779966484c23d08f7f47.png
2.把我们的Bing.java文件放在解压后的路径下:a42ef66f4d1bfccaa6eec8dd1a13ccd5.png
删除之前的文件夹,然后在该目录下打开命令行窗口(shift+鼠标右键),编译并运行:4a9f7dfc782af1f185074426e0f148d5.png98ada17f2ace0a41f07a1bf0455799e7.png
查看结果:c282710bfa60d86f406cb4aa0578f8ac.png

编写简单bat文件执行.class文件
@echo off
set CLASSPATH=%CLASSPATH%
set PATH=%PATH%
set JAVA_HOME=%JAVA_HOME%
d:
cd D:\desktop\reptile\jsoup-1.12.1\
start java Bing
exit
@pause
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

整个过程就是设置java环境变量,然后执行cmd命令,进入.class文件所在文件夹,执行java Bing 语句,保存为.bat文件。
  这时,我们只要点击这个bat文件,就会爬取图片。b546b4d3bcfc3e8f1a0e98c6a53e1153.png

设置Windows定时任务

以Win10为例,设置系统定时任务,每天定时执行我们写好的bat文件
  进入计算机管理:cdcd3fdfab8c28a955cd496e550e7b74.png
  点击任务计划程序,创建任务:fbfa54354190f0f861b212841c5e3eac.png
  设置名称,触发器,操作,条件等信息:fccb1ca2b22e091b59f198349a0fdbed.png
新建操作选择我们写好的bat文件ba88760d1b2406cf3d55b5564cfbc481.png
到时电脑只要开机联网,就可以定时自动爬取,附近几十天爬取的背景图:

4c139e3b1ef432c024ce3c18f0048987.png

33b73dde283a073e8d705c2deacdc548.png

基于springboot的JWT令牌权限验证技术简单实现

5839dd1b08a00fe37f2e60197d70db5f.png

TIOBE 11 月编程语言:Java 首次跌出前二,Python 势不可挡

38e9bafdf9128d7b7da2b760d90bdcf6.png

据说是程序员才看懂的段子。。。

c6710c65f25e0376398a0534b1a98221.png

java项目整合-澳洲OmiPay聚合支付

9882c1cdbf87f21e60891e5b6d85f690.png

end

648c9e7496bd04ce351db61e3037b840.png

*版权声明:转载文章和图片均来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。

89024597ed77d7b6428cad14812a0145.gif

好文!必须在看
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值