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

2022-01-13  本文已影响0人  小张是个测试

@TOC

前言

本案例仅用于技术学习

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

一、明确一个大方针

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

二、分析网页

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

1.查看页面结构

在这里插入图片描述

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


在这里插入图片描述
在这里插入图片描述

观察发现每个专题对应每个<li class="photo-list-padding">标签,图片的个数在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.循环抓取不同分类

上一篇 下一篇

猜你喜欢

热点阅读