美文网首页
Python 爬取 simpledesktops 壁纸图片

Python 爬取 simpledesktops 壁纸图片

作者: 良人_Coder | 来源:发表于2019-10-11 18:10 被阅读0次

    env : python 3.7
    data : 2019/09/26
    author : lrcoder


    爬取 simpledesktops 壁纸图片

    先贴码

    from urllib import request
    import requests
    from lxml import etree
    import os
    
    # 将爬虫需要的请求头抽取出来
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36',
        'Referer': 'http://simpledesktops.com/browse/'
    }
    
    # 声明一个图片列表,用于存储请求下来的图片对象
    pictures = []
    
    # 请求HTML的函数,返回的是一个字符串格式
    def get_page(url, header):
        # 请求页面
        text = requests.get(url, headers=header)
        # 设置HTML的编码格式
        page = text.content.decode('utf-8')
        return page
    
    # 解析HTMl的函数
    def syncHtml(page):
        # 将page字符串转化为一个HTML
        html = etree.HTML(page)
        # 获取HTML中的所有带有src属性的图片
        imgs = html.xpath('//img[@src]')
        # 遍历这个图片列表
        for img in imgs:
            # 获取图片title
            title = format(img.xpath('./@title'))[2:-2].split(' ')[0]
            # 获取预览图片地址
            url = format(img.xpath('./@src')).split('.')
            src1 = format(url[0] + '.' + url[1] + '.' + url[2] + '.' + url[3])
            # 获取图片的实际地址
            src = src1.split('\'')[1]
            # 获取图片格式
            type = format("." + url[3])
    
            # 创建一个图片字典,保存一个图片对象
            picture = {
                'title': title,
                'src': src,
                'type': type
            }
            # 向图片列表追加图片对象
            pictures.append(picture)
    
        return pictures
    
    
    if __name__ == '__main__':
    
        # 这边控制爬取多少页的图片(我这里是20页)
        for i in range(1, 21, 1):
            # 请求HTML
            page = get_page(url='http://simpledesktops.com/browse/' + format(i) + "/", header=header)
            # 解析HTML,获取图片列表
            pictures = syncHtml(page)
            print("已成功爬取第" + format(i) + "页内容!")
            # 遍历图片列表
            for picture in pictures:
                # 格式化图片名字
                imgName = format("%s" % picture['title']).replace('/', '')
                # 判断图片是否已经存在(这个网站的不同页面会有重复图片)
                if os.path.exists(format(
                        'C:\\Users\\27414\\Pictures\\Saved Pictures\\' + "%s" % picture['title'] + "%s" % picture["type"])):
                    print("%s" % picture['title'] + " 已存在 :)")
                else:
                    print("当前正在下载 " + imgName + ", 请稍后... ...")
                    # 保存至本地,设置路径,设置文件标题、格式
                    request.urlretrieve("%s" % picture["src"], format(
                        'C:\\Users\\27414\\Pictures\\Saved Pictures\\' + imgName + "%s" % picture["type"]))
                    print(imgName + " 下载完成!")
    

    再吹牛

    • 简单的爬虫程序一般分为三个部分:

      1. 打着我不是爬虫的旗号请求页面
      2. 使用合适的方式对请求下来的页面进行解析
      3. 对其中需要的数据进行操作(下载?显示?)
    • 本次的小程序使用到的模块(和上述步骤一一对应)

      1. requests网络请求模块(用于请求HTML页面)
      2. XPath解析
      3. request模块中的urlretrieve函数(用于将网络图片保存至本地)
      4. os模块(判断文件是否已经存在)

    simpledesktops网站页面结构分析

    • 网页地址规律
    页面 地址
    第一页 http://simpledesktops.com/browse/1/
    第二页 http://simpledesktops.com/browse/2/
    第三页 http://simpledesktops.com/browse/3/
    第九页 http://simpledesktops.com/browse/9/

    拿到网页链接:

    for i in range(1, 21, 1):
        url='http://simpledesktops.com/browse/' + format(i) + "/"
    
    • 网页结构规律

    这边推荐使用Chrome中的XPath Helper插件,该插件可以在网页中进行XPath实时预览

    1. 获取页面中的所有带有src属性的图片 ----> //img[@src]
    2. 获取上述图片中的title属性(文件名) ----> //img[@src]/@title
    3. 获取上述图片中的src属性(下载地址) ----> //img[@src]/@src

    这边我们主要来看一下,第三步咱们获取到的图片地址格式,例如:
    1.http://static.simpledesktops.com/uploads/desktops/2019/06/22/Dinosaur_eye_2.png.295x184_q100.png
    2.http://static.simpledesktops.com/uploads/desktops/2014/12/04/Pencil_Big.png.295x184_q100.png
    3.http://static.simpledesktops.com/uploads/desktops/2016/11/04/square-bees.png.295x184_q100.png

    以第一个uri为例:
        http://static.simpledesktops.com/uploads/desktops/2019/06/22/ ---> 可能是图片的上传位置和上传时间(这不重要)
        Dinosaur_eye_2 ---> 图片名
        .png ---> 图片格式
        .295x184 ---> 图片大小
        _q100 ---> 不知道是啥?
        .png ---> 再来个图片格式

    以上获取的是预览图(295x184),我们点击图片进去后发现该图片的uri为:
    http://simpledesktops.com/browse/desktops/2019/jun/22/dinosaur-eye/

    也就是说我们需要去掉.png.295x184_q100.png的部分,所以我们就拿到了图片的文件名、格式、地址,也就代码中的以下部分

    # 获取页面上的所有带有src属性的图片
    imgs = html.xpath('//img[@src]')
    # 对图片标题进行一些字符串格式化上的操作
    title = format(img.xpath('./@title'))[2:-2].split(' ')[0]
    # 获取图片的地址,截取其中的地址
    url = format(img.xpath('./@src')).split('.')
    src1 = format(url[0] + '.' + url[1] + '.' + url[2] + '.' + url[3])
    src = src1.split('\'')[1]
    # 获取图片格式,作为保存在本地的文件后缀
    type = format("." + url[3])
    

    总结

        本人学习python仅仅是对网络爬虫有些许兴趣,本职工作还是Android开发,这个小Demo仅仅是作为爱好编写的,程序的可扩展性不强,仅做参考。代码中的注释比较多,下文作为自己对代码由来的分析,望大佬勿喷。各位发现bug也可以在评论里提出来,我会及时改正。

    相关文章

      网友评论

          本文标题:Python 爬取 simpledesktops 壁纸图片

          本文链接:https://www.haomeiwen.com/subject/qqhxmctx.html