从必应(bing)首页抓取他的每日一图

以前上学时,曾经用python写过一个每天抓取bing每日一图的小工具。

现在想用java来重构一下。

抓取图片的思路

首先获取网页源码

从网页源码中,我们可以找到图片的下载链接以及图片的描述信息。

利用下载链接我们就能得到相应的图片。

使用python实现抓取

我们使用python中的requests库来获取网页源码,然后利用正则表达式从网页源码中搜索出图片的下载链接。

  1. res = requests.get(url) #获取网页源码,并利用正则表达式找到与bing每日一图有关的参数
  2. pattern = re.compile(r"(\/th\?id=(.+?)\.jpg)")
  3. # pattern = re.compile(r"\/th\?id=(.+)(\.jpg)")
  4. result = pattern.search(res.text) #从源码中获取bing大图的图片链接
  5. imgLinkParam = result.group(0).split("&")
  6. imgDownloadUrl = url+"&".join(imgLinkParam)

拿到图片的下载地址后,还需要从网页中找出图片的标题。

这里我们使用BeautifulSoup库来解析网页。

找到所有class="title"的a节点,取找到的a第一个节点,他的内容就是图片的标题。

  1. soup = BeautifulSoup(res.text,'lxml') #使用bs4来解析对应的html文件
  2. #print(soup)
  3. # imageInfo = soup.find_all(name="a",attrs={"id":"sh_cp","class":"sc_light"})
  4. imageInfo = soup.find_all(name="a", attrs={"class":"title"})
  5. imageDescription=imageInfo[0].contents[0] #获取对图片的描述

最后我们根据图片链接,将图片下载到本地

  1. pictureData = requests.get(imgDownloadUrl) #根据下载链接获取图片数据
  2. with open(imgName,"wb") as f:
  3. f.write(pictureData.content)
  4. f.flush()
  5. log_write(logName,"图片保存成功")

如何使用java重构代码

思路与前面python的实现大致相同,先获取bing首页html内容,然后解析html,获取需要的内容。然后下载图片

首先,发送请求与根据链接下载图片文件需要构造http请求,这里我们使用java 11自带的HttpClient来发送http请求。

HttpClient的使用参考Java11新特性之HttpClient小试牛刀_java_脚本之家 (jb51.net)

获取并首页html内容

使用HttpClient,首先利用建造者(builder)模式创建一个HttpRequest,然后创建一个HttpClient来发送http请求,并指定响应Response的类型。

  1. HttpRequest.Builder requestBuilder = HttpRequest.newBuilder();
  2. requestBuilder.uri(new URI(baseUrl));
  3. requestBuilder.GET();
  4. HttpClient client = HttpClient.newHttpClient();
  5. HttpResponse<String> response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString());
  6. String html = response.body();
解析html

我们使用jsoup库来对获取的html进行解析。然后使用select方法,按照类似jquery的操作方式,获取html中指定的节点。

我们要获取的与图片有关的信息包括:图片的标题(title),下载地址,图片描述(Description),图片的版权信息

  1. //解析html
  2. Document document = Jsoup.parse(html);
  3. //获取图片title
  4. Element element = document.select("a[class=title]").first();
  5. if(null == element){
  6. System.out.println("没有获取到图片标题");
  7. return;
  8. }
  9. String pictureTitle = element.text();
  10. System.out.println(pictureTitle);
  11. //获取图片下载地址
  12. element = document.select("link[rel=preload]link[id=preloadBg]").first();
  13. assert element != null;
  14. String pictureDownloadUrl = element.attr("href");
  15. System.out.println(pictureDownloadUrl);
  16. //获取图片描述
  17. element = document.select("meta[property=og:description]").first();
  18. assert element != null;
  19. System.out.println(element.attr("content"));
  20. //获取图片的版权信息
  21. element = document.select("div[class=copyright]div[id=copyright]").first();
  22. assert element != null;
  23. System.out.println(element.text());
图片下载

拿到图片链接之后,可以使用httpClient来下载图片到本地

在java11中,httpClient支持异步请求,这里使用异步请求来下载图片。

  1. //下载图片
  2. LocalDate date = LocalDate.now();
  3. //构造图片存放的本地路径
  4. String imgLocalPath = basePath+ date.toString() + imageType;
  5. requestBuilder.uri(new URI(pictureDownloadUrl))
  6. .GET();
  7. CompletableFuture<Path> future = client.sendAsync(requestBuilder.build(), HttpResponse.BodyHandlers.ofFile(Paths.get(imgLocalPath)))
  8. .thenApply(HttpResponse::body);
  9. System.out.println(future.get());//get得到的是图片在本地的存放路径

获取bing首页的每日一图的更多相关文章

  1. 获取Bing每日图片API接口

    bing图片每日更新,对于这一点感觉挺不错的,如果能够把bing每日图片作为博客背景是不是很不错呢?首先我们进入Bing首页,会发现自动转到中国版.不过这没关系,中国版更符合国情,速度也比国际版快一些 ...

  2. 如何获取 bing 每日壁纸(超高清版)

    目录 需求描述 实现方式 简单粗暴 如何下载 如何更高清 排坑指南 初级 优点 给有好奇心的孩子 进阶 接口 自动保存 网站集成 爬虫 需求描述 必应作为一个在壁纸圈做搜索引擎最优秀的站点,其每日壁纸 ...

  3. 每日设置Bing首页图片为壁纸

    闲来无事,手痒痒要做一个什么小工具. 于是乎便有了本文. 当有一个想法的时候,首先免不了网上搜索一番以便看一下有木有网友有过类似的想法. 很显然--有! 因此本文大代码是从几个地方搜索,然后组合的. ...

  4. 使用nginx代理跨域,使用nginx代理bing的每日一图

    前言 自从搞清楚了跨域原理后一直自鸣得意,感觉跨域没啥问题了.而事实上对关于跨域的几个header的理解也有限,但那又如何,我能做到跨域就行了.今天想把博客背景图改成bing的每日一图,发现遇到跨域问 ...

  5. 获取Bing每日壁纸用作首屏大图

    获取Bing每日壁纸用作首屏大图 Bing 搜索每天都会更换一张精美的图片作为壁纸,除了特殊时候不太好看外(比如春节那几天),没多大问题.移动端还有上每日故事,与图片现配.现在我的博客首屏图片就是Bi ...

  6. 获取bing图片并自动设置为电脑桌面背景(C++完整开源程序)

    众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸. 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是: 上网,搜索bing 找 ...

  7. 【开源程序(C++)】获取bing图片并自动设置为电脑桌面背景

    众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸. 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是: 上网,搜索bing 找 ...

  8. 获取bing图片并自动设置为电脑桌面背景(使用 URLDownloadToFile API函数)

    众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸. 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是: 上网,搜索bing 找 ...

  9. 基于jQuery的网站首页宽屏焦点图幻灯片

    今天给大家分享一款基于jQuery的网站首页宽屏焦点图幻灯片.这款焦点图适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗.效果图如下: 在线预览 ...

随机推荐

  1. iOS 获取通讯录中联系人的所有属性 by - zfqj

    1 ABAddressBookRef addressBook = ABAddressBookCreate(); 2 3 CFArrayRef results = ABAddressBookCopyAr ...

  2. Docker部署lnmp 实战 (多注意配置文件,不管访问试试换个浏览器)

    Docker部署LNMP环境 关闭防火墙,设置自定义网络 systemctl stop firewalld systemctl disable firewalld setenforce 0 docke ...

  3. IP地址与子网划分

    IP地址与子网划分 目录 IP地址与子网划分 一.IP地址(Internet Protocol Address) 1.IP地址的表示 2.IP地址的组成 3.IP地址的分类 (1)A类IP地址 (2) ...

  4. docker基础——3.存储卷

    把宿主机的目录或文件链接到容器的目录或文件,可以避免写时复制对高I/O操作的影响,也避免容器销毁时数据丢失. 1. 只指定容器的目录位置,-v docker run -it --name bbox1 ...

  5. ansible-playbook实现MySQL的二进制部署

    1.ansible服务器配置 1.1 安装ansible # yum -y install ansible 1.2 配置主机清单文件 # vi /etc/ansible/hosts [local] 1 ...

  6. requests库session保持持久会话

      requests中cookie的原理 http://blog.csdn.net/zhu_free/article/details/50563756   requests - cookies的实现例 ...

  7. [文档]运维故障报告template

    RCA的基本概念 根本原因分析技术(root cause analysis,RCA). IOWA州立大学质量管理学院认为,很多公司在设备发生故障后,都能够很快修复, 但难以发现故障的根本原因,所以此故 ...

  8. 使用ensp模拟器中的防火墙(USG6000V)配置NAT(网页版)

    使用ensp模拟器中的防火墙(USG6000V)配置NAT(网页版)一.NAT介绍NAT(Network Address Translation,网络地址转换):简单来说就是将内部私有地址转换成公网地 ...

  9. Renix软件如何建立OSPF邻居——网络测试仪实操

    OSPF可以通过OSPF向导的方式方便的创建OSPF邻居, 也可以通过纯手工的方式创建OSPF邻居, 本文介绍的是纯手工的方式创建. 在工作中, 推荐使用OSPF向导的方式来创建, 会比较简单和高效. ...

  10. python+pytest(2)-HTTP协议基础

    HTTP协议介绍 简介 HTTP 即 HyperText Transfer Protocol(超文本传输协议),是互联网上应用最为广泛的一种网络协议.所有的 WWW 文件都必须遵守这个标准. 设计 H ...