Python从Bing壁纸的API接口保存图片

先贴代码:

from urllib import request
from lxml import etree
from time import localtime
from os import getcwd

def 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()"):
        pass
    with 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 getcwd

def 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()

这个和开头的那段效果一样


效果:

 当然,也可以把图片的二进制数据保存至数据库中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值