如何用python实现自动换壁纸?

@TOC

前言

本案例仅用于技术学习

每天与电脑为伴,天天看着默认的桌面屏幕,作为喜新厌旧的我怎么能忍?搜索桌面壁纸,随意的挑选了一个网址,开始爬取图片之旅。

一、明确一个大方针

中心主旨还是获取网页信息---提取图片信息---保存图片
使用到的库有requests,获取网页信息,BeautifulSoup库提取网页信息,re匹配图片个数字段,os保存文件

二、分析网页

http://desk.zol.com.cn/ 目标网页

1.查看页面结构

在这里插入图片描述

网站将图片按照分类分别存放,设置了小专题,每个专题内有不同个数的图片。选择风景分类,查看每个专题排列规则。


在这里插入图片描述

在这里插入图片描述

观察发现每个专题对应每个

  • 标签,图片的个数在span标签下。点开li标签,可以看到a标签中有属性href,点击链接,进入专题,说明这个链接是专题的链接。


    在这里插入图片描述

    在专题内查看图片,通过查看上下张图片,同一个专题内的图片是按照顺序命名的,这样我们就知道了如何找到专题内图片的网址。
    在这里插入图片描述

    接下来需要找到当前图片的地址,查看a标签的id命名,找到当前图片,发现有img标签,点击网址,确实是我们要找的图片。

    三、开始动手吧

    1.获取网页信息

    这里直接从风景开始,如果需要其他分类可以修改网址或循环获取。

    url="http://desk.zol.com.cn/fengjing"
    html = getHtml(url)  #获取网页信息
    getPicUrl(html,5)     #获取图片并保存,传入要抓取的图片数量
    

    2.获取图片地址

    图片在专题中保存着,所以需要先获取专题url,向专题url发送请求,获取专题的网址信息,在信息中找到图片地址。这里获取了图片张数,使用专题内第一张图片的数字递增寻找下一张,但是实际网站图片不是按照递增保存的,会导致部分图片找不到。


    在这里插入图片描述

    3.全部代码

    import os
    import requests
    import re
    from bs4 import BeautifulSoup
    
    
    def getHtml(url):
        try:
            r=requests.get(url,timeout=30)
            r.raise_for_status()
            r.encoding=r.apparent_encoding
            return r.text
        except Exception as e:
            print("网址不正确")
            print(e)
    
    
    def getPicUrl(html,picn):
        try:
            soup=BeautifulSoup(html,'html.parser')
            lis=soup.find_all('li',"photo-list-padding")
            #遍历标题
            for li in lis:
                if (picn != 0) & (len(lis) != 0):
                    des=li.a.span.text
                    print(des)
                    '''正则表达式获取描述中的图片张数'''
                    pattern = re.compile(r".*?(\d+).*")
                    res = re.findall(pattern, des)
                    n=int(str(res[0]))
                    '获取专题网址链接'
                    href = li.a.attrs['href']
                    href1 = href.split('_')[0]
                    href2 = href.split('_')[1]
                    '''跟据获取的图片数量拼接网址'''
                    '''按照递增顺序获取图片,获取的第一张图片id不是最小的'''
                    for i in range(n):
                        h = int(href2)+i
                        url = "http://desk.zol.com.cn"+href1+'_'+str(h)+'_2.html'
                        print(url)
                        pichtml = getHtml(url)
                        '''网址存在的情况下保存图片'''
                        if pichtml is not None:
                            soup2 = BeautifulSoup(pichtml, 'html.parser')
                            imgurl = soup2.find(id='bigImg').attrs['src']
                            print(imgurl)
                            savePic(imgurl)
                            picn=picn-1
                        if picn == 0:
                            break
                else:
                    print("收集完成")
                    break
        except Exception as e:
            print(e)
    
    
    def savePic(url):
            '''保存到文件中'''
            root = "D:/Program/picture/"
            path = root + url.split('/')[-1]
            try:
                if not os.path.exists(path):
                    r = requests.get(url)
                    with open(path, 'wb') as f:
                        f.write(r.content)
                        f.close()
                        print('保存成功')
                else:
                    print('已存在')
            except Exception as e:
                print('保存失败,失败原因为:')
                print(e)
    
    
    def main():
        url="http://desk.zol.com.cn/fengjing"
        html = getHtml(url)
        getPicUrl(html,5)
    
    
    main()
    

    总结

    运行代码后会自动抓取指定数量的图片,抓取完成后会自动停止。目前的不足之处有:1.专题内部分图片抓取不到 2.抓取不能接着上一次停下的位置继续 3.循环抓取不同分类

  • 你可能感兴趣的:(如何用python实现自动换壁纸?)