获取bing首页的每日一图
从必应(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首页的每日一图的更多相关文章
- 获取Bing每日图片API接口
bing图片每日更新,对于这一点感觉挺不错的,如果能够把bing每日图片作为博客背景是不是很不错呢?首先我们进入Bing首页,会发现自动转到中国版.不过这没关系,中国版更符合国情,速度也比国际版快一些 ...
- 如何获取 bing 每日壁纸(超高清版)
目录 需求描述 实现方式 简单粗暴 如何下载 如何更高清 排坑指南 初级 优点 给有好奇心的孩子 进阶 接口 自动保存 网站集成 爬虫 需求描述 必应作为一个在壁纸圈做搜索引擎最优秀的站点,其每日壁纸 ...
- 每日设置Bing首页图片为壁纸
闲来无事,手痒痒要做一个什么小工具. 于是乎便有了本文. 当有一个想法的时候,首先免不了网上搜索一番以便看一下有木有网友有过类似的想法. 很显然--有! 因此本文大代码是从几个地方搜索,然后组合的. ...
- 使用nginx代理跨域,使用nginx代理bing的每日一图
前言 自从搞清楚了跨域原理后一直自鸣得意,感觉跨域没啥问题了.而事实上对关于跨域的几个header的理解也有限,但那又如何,我能做到跨域就行了.今天想把博客背景图改成bing的每日一图,发现遇到跨域问 ...
- 获取Bing每日壁纸用作首屏大图
获取Bing每日壁纸用作首屏大图 Bing 搜索每天都会更换一张精美的图片作为壁纸,除了特殊时候不太好看外(比如春节那几天),没多大问题.移动端还有上每日故事,与图片现配.现在我的博客首屏图片就是Bi ...
- 获取bing图片并自动设置为电脑桌面背景(C++完整开源程序)
众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸. 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是: 上网,搜索bing 找 ...
- 【开源程序(C++)】获取bing图片并自动设置为电脑桌面背景
众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸. 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是: 上网,搜索bing 找 ...
- 获取bing图片并自动设置为电脑桌面背景(使用 URLDownloadToFile API函数)
众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸. 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是: 上网,搜索bing 找 ...
- 基于jQuery的网站首页宽屏焦点图幻灯片
今天给大家分享一款基于jQuery的网站首页宽屏焦点图幻灯片.这款焦点图适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗.效果图如下: 在线预览 ...
随机推荐
- 一键部署lnmp
一键部署lnmp 提前将nginx .mysql .php 所需安装包都放在/opt目录下 脚本启动结束时,重启一下nginx 服务,就能在火狐浏览器更新出php测试页 脚本如下:(脚本里的软件 ...
- 第10讲:Flink Side OutPut 分流
Flink系列文章 第01讲:Flink 的应用场景和架构模型 第02讲:Flink 入门程序 WordCount 和 SQL 实现 第03讲:Flink 的编程模型与其他框架比较 第04讲:Flin ...
- Hadoop文件操作常用命令
1.创建目录 #hdfs dfs -mkidr /test 2.查询目录结构 #hdfs dfs -ls / 子命令 -R递归查看//查看具体的某个目录:例如#hdfs dfs -ls /test 3 ...
- ASP.NET Core 6框架揭秘实例演示[01]: 编程初体验
作为<ASP.NET Core 3框架揭秘>的升级版,<ASP.NET Core 6框架揭秘>提供了很多新的章节,同时对现有的内容进行大量的修改.虽然本书旨在对ASP.NET ...
- netty系列之:不用怀疑,netty中的ByteBuf就是比JAVA中的好用
目录 简介 ByteBuf和ByteBuffer的可扩展性 不同的使用方法 性能上的不同 总结 简介 netty作为一个优秀的的NIO框架,被广泛应用于各种服务器和框架中.同样是NIO,netty所依 ...
- Solution -「AGC 034C」Tests
\(\mathcal{Description}\) Link. 给定非负整数序列 \(\{l_n\},\{r_n\},\{b_n\},X\),求最小的 \(s\),使得存在非负整数序列 \(\ ...
- 关于mybatis,需要掌握的基础
目录 ❀ 总结 mybatis,需要掌握的基础如下: 1.了解ORM 思想.ORM思想的作用.映射配置的两种方式 2.MyBatis开发流程(基本使用) 3.日志框架 4.了解mybatis生命周期并 ...
- Dubbo源码剖析六之SPI扩展点的实现之getExtensionLoader
Dubbo SPI机制之三Adaptive自适应功能 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中,示例案例中自定义了扩展接口而不是使用Dubbo已提供的扩展接口.在案例中,主程序分 ...
- HTTP协议和HTTPS协议的那些事
文章目录 HTTPS VS HTTP HTTPS=HTTP+加密+证书+完整性保护 加密 对称加密 非对称加密 混合加密 证书 完整性保护 HTTPS并不能取代HTTP SSL是把双刃剑 HTTPS的 ...
- react 也就这么回事 01 —— React 元素的创建和渲染
React 是一个用于构建用户界面的 JavaScript 库 它包括两个库:react.js 和 react-dom.js react.js:React 的核心库,提供了 React.js 的核心功 ...