Python 爬取 simpledesktops 壁纸图片

2019-10-11  本文已影响0人  良人_Coder

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 + " 下载完成!")

再吹牛

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也可以在评论里提出来,我会及时改正。

上一篇下一篇

猜你喜欢

热点阅读