获取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.傲游.搜狗.世界之窗.效果图如下: 在线预览 ...
随机推荐
- linux_3
1.统计出/etc/passwd文件中其默认shell为非/sbin/nologin的用户个数,并将用户都显示出来 [root@lhq ~]#echo "total:`cat /etc/pa ...
- 基于FMC接口的Kintex-7 XC7K325T PCIeX4 3U PXIe接口卡
一.板卡概述 本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8.64bit DDR3容量 ...
- Solution -「ARC 110E」Shorten ABC
\(\mathcal{Description}\) Link. 给定长度为 \(n\),包含 A, B, C 三种字符的字符串 \(S\),定义一次操作为将其中相邻两个不相同的字符替换为字符集 ...
- tip2:Linux系统相关命令使用
好记忆不如烂笔头,很多东西不常用突然要用就是记得相关的命令但是具体就不确定了,本文记录个人不常用同时偶尔用到但不确定或者记不住的内容. 一.用户管理 这组个人使用频率不高,知道同时记不住具体涉及的系统 ...
- 【Python自动化Excel】pandas操作Excel的“分分合合”
话说Excel数据表,分久必合.合久必分.Excel数据表的"分"与"合"是日常办公中常见的操作.手动操作并不困难,但数据量大了之后,重复性操作往往会令人崩溃. ...
- 施耐德NOE77101后门漏洞分析
固件下载地址: GitHub - ameng929/NOE77101_Firmware 文件目录结构,这里只列出了一些主要的文件信息: ├── bin ├── ftp ├── fw ├── rdt ├ ...
- 一图胜千言,想让数据产生影响力,必须拥有好上手的BI数据分析工具
当杂乱无章的数据,经过数据清洗后,得到了想用的数据,但是查看这些数据通过数据库只能看到数据本身,无法看到其中的规律,可以通过BI数据分析工具,图形化展示数据,使数据更形象化的展现在用户面前,更容易看出 ...
- 关于设备控制器和 I/O 通道的理解
设备控制器 设备控制器是CPU 与 I/O 设备之间的接口,它接收 CPU 发来的命令,去控制 I/O 设备工作,使 CPU 从繁杂的设备控制事务中解放出来. 当 CPU 要操作 I/O 设备时,首先 ...
- 【C# .Net GC】GC内存分配规则
GC 管理内存分配和回收 公共语言运行时的垃圾回收器为应用程序管理内存的分配和释放. https://docs.microsoft.com/zh-cn/dotnet/standard/automati ...
- 【windows 操作系统】异步
转载:https://cloud.tencent.com/developer/article/1744660 二.异步与多线程 1)基本概念 1. 并发:在操作系统中,是指一个时间段中有几个程序都处于 ...