先贴代码:
from urllib import request
from lxml import etree
from time import localtime
from os import getcwddef Get_Image():url=r'https://cn.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=zh-CN'for res0 in etree.HTML(request.urlopen(url).read()).xpath("//url/text()"):passwith open(r"{0}\{1}.jpg".format(getcwd(),str(localtime()[:-6])[1:-1].replace(",","-")),"wb") as file:file.write(request.urlopen(r"https://cn.bing.com"+res0).read())if __name__ == '__main__':Get_Image()
看不懂了是不是?眼花了?
好吧,因为我省行数,写在一块了,待会出一个优美一点的
开始吧!
所需模块:
urllib中的request,用于发送Web请求
lxml中的etree,用于解析图片所在网站
time中的localtime,用于获取当前时间,命名图片
os中的getcwd,用于获取当前目录,保存图片
代码实现原理:
1.访问bing.com的API接口
2.解析数据,找到图片的相对地址
3.通过相对地址找到图片的网址,把它下载下来
第一步,导入模块,不用多说,没有的安装上
第二步,访问API接口
url是https://cn.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=zh-CN
请求参数:
format:返回的数据文件格式,由json或者xml文档,我这里选择xml文档,更适合解析
idx:相当于请求哪个图片,填0就是今天的,填1就是昨天的,以此类推
n:请求图片的数量,1就是今天的,2就是今天和昨天的
mkt:默认填zh-CN
打开这个网页,你会看到:
文档置顶的一句话:
This XML file does not appear to have any style information associated with it. The document tree is shown below.
意思是:“此 XML 文件似乎没有任何与此相关的样式信息。文档树如下所示。"
报错:是因为浏览器的编码格式错误,
可以看到:
编码格式是UTF-8,到时候解析用这个就行了
好了,贴代码
模块
from urllib import request
from lxml import etree
from time import localtime
from os import getcwd
先来个函数
def Get_Image():
在里面写这些:
1
'''获取壁纸的相对地址'''url=r'https://cn.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=zh-CN'res0=request.urlopen(url).read()res1=etree.HTML(res0)res2=res1.xpath("//url/text()")for res3 in res2:pass
获取壁纸的相对地址:
访问API接口,获取数据,解析,通过for循环取出地址
相当于上面的:
url=r'https://cn.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=zh-CN'for res0 in etree.HTML(request.urlopen(url).read()).xpath("//url/text()"):pass
结果为:
/th?id=OHR.GiantManta_ZH-CN0594951444_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp
2
'''合成绝对地址,并获取图片'''res4=request.urlopen(r"https://cn.bing.com"+res3)res5=res4.read()
作用顾名思义
我把这一步放在了file.write()中
3
'''获取当前时间'''str1=localtime()str2=str1[:-6]str3=str(str2)[1:-1]str4=str3.replace(",","-")
这一步是获取当地时间的元组,截取年月日,转成字符串,再去除括元组的逗号、括号
相当于:
str(localtime()[:-6])[1:-1].replace(",","-")
每一步结果为:
time.struct_time(tm_year=2021, tm_mon=8, tm_mday=19, tm_hour=18, tm_min=51, tm_sec=3, tm_wday=3, tm_yday=231, tm_isdst=0)
(2021, 8, 19)
2021, 8, 19
2021- 8- 19
4
'''写入文件'''with open(r"{0}\{1}.jpg".format(getcwd(),str4),"wb") as file:file.write(res5)
这不用多说
获取当前目录,写入以当前日期为名字的图片
5
if __name__ == '__main__':Get_Image()
注意,这一步不是在函数内进行的
没了
再贴一下完整代码:
from urllib import request
from lxml import etree
from time import localtime
from os import getcwddef Get_Image():'''获取壁纸的相对地址'''url=r'https://cn.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=zh-CN'res0=request.urlopen(url).read()res1=etree.HTML(res0)res2=res1.xpath("//url/text()")for res3 in res2:pass'''合成绝对地址,并获取地址'''res4=request.urlopen(r"https://cn.bing.com"+res3)res5=res4.read()'''获取当前时间'''str1=localtime()str2=str1[:-6]str3=str(str2)[1:-1]str4=str3.replace(",","-")'''写入文件'''with open(r"{0}\{1}.jpg".format(getcwd(),str4),"wb") as file:file.write(res5)if __name__ == '__main__':Get_Image()
这个和开头的那段效果一样
效果:
当然,也可以把图片的二进制数据保存至数据库中