Python实战:爬取Bing每日壁纸
正所谓内行看门道,外行看热闹,想要看懂本文需要一些Python语言基础,我会尽量把事情说的清楚,并且在文章最后放程序链接,方便大家交流学习。
0、准备
首先你要有一个Python环境,搭建教程网上很多,这里不再赘述。本次我们将使用网络编程中常用的requests、beautifulsoup库实现。
pip install requests bs4
待安装完成后就可以开始下一步了。
1 | import requests |
上述代码用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 | picName = pageBs.select('a.title')[0].text |
2、编码
我们已经获取到了我们所需的全部信息,现在我们可以开始编写代码了。
1 | def getBingPic(): |
大部分代码在上面已经讲述过其含义,这里就不重复了。我们得到网址和图片名后还需要一个下载器才能把图片下载到本地,好在使用requests库下载文件是很便捷的,这里给出一个简单的下载器例子(还写过一个复杂的下载器打算单开一篇文章介绍):
1 | def downloader(srcUrl, dstPath, name): |
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放进系统的计划任务中定时运行,自动获取每天的壁纸。