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

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

现在想用java来重构一下。

抓取图片的思路

首先获取网页源码

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

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

使用python实现抓取

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

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

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

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

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

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

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

pictureData = requests.get(imgDownloadUrl) #根据下载链接获取图片数据
with open(imgName,"wb") as f:
f.write(pictureData.content)
f.flush()
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的类型。

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

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

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

//解析html
Document document = Jsoup.parse(html);
//获取图片title
Element element = document.select("a[class=title]").first();
if(null == element){
System.out.println("没有获取到图片标题");
return;
}
String pictureTitle = element.text();
System.out.println(pictureTitle);
//获取图片下载地址
element = document.select("link[rel=preload]link[id=preloadBg]").first();
assert element != null;
String pictureDownloadUrl = element.attr("href");
System.out.println(pictureDownloadUrl);
//获取图片描述
element = document.select("meta[property=og:description]").first();
assert element != null;
System.out.println(element.attr("content")); //获取图片的版权信息
element = document.select("div[class=copyright]div[id=copyright]").first();
assert element != null;
System.out.println(element.text());
图片下载

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

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

//下载图片
LocalDate date = LocalDate.now();
//构造图片存放的本地路径
String imgLocalPath = basePath+ date.toString() + imageType; requestBuilder.uri(new URI(pictureDownloadUrl))
.GET();
CompletableFuture<Path> future = client.sendAsync(requestBuilder.build(), HttpResponse.BodyHandlers.ofFile(Paths.get(imgLocalPath)))
.thenApply(HttpResponse::body);
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. go基础——for语法

    package main import "fmt" /* for循环:某些代码会多次的执行 */ func main() { for i := 1; i <= 3; i++ ...

  2. Python篇函数总结【输出函数】

    1.raw_input("\n\nPress the enter key to exit.") 以上代码中 ,"\n\n"在结果输出前会输出两个新的空行.一旦用 ...

  3. Vue.use初探

    Vue.use 问题 相信很多人在用Vue使用别人的组件时,会用到 Vue.use(). 例如:Vue.use(VueRouter).Vue.use(MintUI). 但是用 axios时,就不需要用 ...

  4. 降维处理PCA

    要理解什么是降维,书上给出了一个很好但是有点抽象的例子. 说,看电视的时候屏幕上有成百上千万的像素点,那么其实每个画面都是一个上千万维度的数据:但是我们在观看的时候大脑自动把电视里面的场景放在我们所能 ...

  5. python生成器对象&常见内置函数

    内容概要 异常捕获(补充) for循环本质 生成器 yield 和 return优缺点 笔试题 常用内置函数 内容详细 一.异常捕获补充 try: print(name) except NameErr ...

  6. tar压缩打包实用命令总结

    一.tar常用命令参数 用法:tar [参数] [文件] -v 显示指令执行过程 -c 创建压缩文件 -x 解压文件 -z 通过gzip指令处理文件 -f 指定文件 -C 解压文件到指定目录 -t - ...

  7. python.36的特性新定义初学者必看课程

    一.Python3.6新特性 1.新的格局化字符串办法 <p "="">新的格局化字符串办法,即在一般字符串前增加 f 或 F 前缀,其效果相似于str.fo ...

  8. Cesium 加载地形数据

    1.注册Cesium Ion账号,注册地址:Sign In | Cesium ion 否则,加载数据会报错{code: "InvalidCredentials", message: ...

  9. IDEA 端口占用,启动失败,提示Web server failed to start. Port 8080 was already in use.

    问题描述: 使用IDEA开发Spring Boot项目,今天启动提示端口占用,导致启动失败!(我昨天也是用的这个端口,可以正常启动) *************************** APPLI ...

  10. 为什么我建议在复杂但是性能关键的表上所有查询都加上 force index

    最近,又遇到了慢 SQL,简单的看了下,又是因为 MySQL 本身优化器还有查询计划估计不准的问题.SQL 如下: select * from t_pay_record WHERE (( user_i ...