发布于 

Python实战:爬取Bing每日壁纸

“ Bing搜索的背景每天都会更新一张质量很高的摄影作品,每次看到都想把它下载收藏起来,这次我们就来尝试使用Python编写一个程序,保存Bing的每日壁纸。 ”

正所谓内行看门道,外行看热闹,想要看懂本文需要一些Python语言基础,我会尽量把事情说的清楚,并且在文章最后放程序链接,方便大家交流学习。

0、准备

首先你要有一个Python环境,搭建教程网上很多,这里不再赘述。本次我们将使用网络编程中常用的requests、beautifulsoup库实现。

pip install requests bs4

待安装完成后就可以开始下一步了。

1
2
3
4
5
6
7
import requests
from bs4 import BeautifulSoup

url = "https://cn.bing.com/"
page = requests.get(url) # 打开一个网址
pageBs = BeautifulSoup(page.content, "html.parser") # 使用bs加载
print(pageBs.prettify()) # 格式化输出网页源码

上述代码用requests访问了bing官网,并使用bs4解析后格式化输出出来。因为我们需要用到bs4的css选择器功能,这里把它的常见用法也列举一下:

方式 例子 解释
tage div 选择所有<div>元素
.class .video 选择class="video"的所有元素。
#id #id1 选择id="id1"的所有元素。
[attribute] [name] 选择含有name属性的所有元素。

同时查找时可以相互组合,不在同一节点用空格隔开,同一节点不需要。例如上个例子中查找class="hp_body"的<div>只需使用:

1
print(pageBs.select("div.hp_body"))

1、寻找目标

我们打开bing官网,按F12打开开发者工具,选择元素界面,按Ctrl+Shift+S,选择一块背景,这样在元素界面可以大致定位出该元素所在的位置。

从这里我们可以直接看到该图片的网址,该图片在<div>且class="img_cont"的标签的style属性中,我们尝试使用css选择器查找一次:

1
picDiv = pageBs.select("div.img_cont")[0]["style"]

可以看到我们已经成功选出我们想要的部分了,但是仍然有些不需要的被选了出来,我们可以对其再进行修饰修饰:

1
picUrl = picDiv[picDiv.find("(") + 1:picDiv.find("&")]

我们现在已经获取到了图片的地址,现在我们还希望寻找一下图片的名字,它就隐藏在这个html中。

看来我们不光找到了图片名,还顺便找到了作者的名字。获取它们的代码这里就直接给出:

1
2
picName = pageBs.select('a.title')[0].text
picAuthor = pageBs.select('div.copyright#copyright')[0].text

2、编码

我们已经获取到了我们所需的全部信息,现在我们可以开始编写代码了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def getBingPic():
url = "https://cn.bing.com/"

page = requests.get(url)
pageBs = BeautifulSoup(page.content, "html.parser")

picDiv = pageBs.select("div.img_cont")[0]["style"]
picUrl = picDiv[picDiv.find("(") + 1:picDiv.find("&")]

picName = pageBs.select('a.title')[0].text
picAuthor = pageBs.select('div.copyright#copyright')[0].text

res = {"URL":picUrl, "NAME":picName, "AUTHOR":picAuthor}
return res

大部分代码在上面已经讲述过其含义,这里就不重复了。我们得到网址和图片名后还需要一个下载器才能把图片下载到本地,好在使用requests库下载文件是很便捷的,这里给出一个简单的下载器例子(还写过一个复杂的下载器打算单开一篇文章介绍):

1
2
3
4
5
6
7
8
9
def downloader(srcUrl, dstPath, name):
fullname = os.path.join(dstPath, name)
with closing(requests.get(srcUrl, stream=True)) as response:
print("%s"%name,end="")
with open(fullname, "wb") as file:
for data in response.iter_content(chunk_size=50 * 1024):
file.write(data)
print(".",end="")
print("完成!")

3、优化

  • 通过一段时间的使用发现图片的清晰度一直是1920X1080,但有的时候服务器上是有更清晰的图片存在的,这里从网上找到了一种方法:把图片链接中的1920x1080替换成UHD就可以获取最大清晰度的图片了,经测试每张图片都有几M大小,应该是清晰度比较高了。方法如下:
1
picUrl = picUrl.replace("1920x1080", "UHD")
  • 为了方便管理下载的文件统一命名为时间+图片名+作者名,并且防止名称中出现一些无法作为文件名的符号,还进行了字符串替换:
1
fileName = time.strftime("%Y-%m-%d ", time.localtime()) + (pic["NAME"] + " (" + pic["AUTHOR"] + ")").replace('/', chr(ord('/')+65248)).replace('\t', ' ') + ".jpg"
  • 为了方便大家交流学习,源文件下载地址如下,链接里附带了个bat文件供直接双击运行,可以把bat放进系统的计划任务中定时运行,自动获取每天的壁纸。

https://github.com/ss302810694/bing-spider

END
关注我的公众号:嵌入式技术栈

本站由 @44 使用 Stellar 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处及作者。
本页面访问 次 | 总访客 人 | 共计访问 次 |

沪ICP备2023014561号-1