python爬虫——图片懒加载之爬取站长素材图片

风流意气都作罢 提交于 2020-02-09 16:24:38

一.分析

1.url分析

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
url可能为http://sc.chinaz.com/tupian/gudianmeinvtupian_{}.html
尝试第一页,http://sc.chinaz.com/tupian/gudianmeinvtupian_1.html,结果不成功,说明第一页和其他页不同

在这里插入图片描述

2.查看编码

在这里插入图片描述

3.xpath匹配

第一页全部图片浏览完后可以用xpath匹配到://div[@id="container"]/div/div/a/img/@src
在这里插入图片描述
第二页没有全部浏览完
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二.图片懒加载技术

1.1什么是懒加载?

懒加载又称延迟加载。当访问一个页面的时候,需要先把img元素或者其他元素的背景图先用一张默认的图片代替(占位图),这样子

浏览器渲染页面的时候就只需请求一次。当图片出现在浏览器可视区域的时候,才设置图片的真实路径,把图片显示出来。

1.2为什么要使用图片懒加载?

当页面中图片的数量多到一定数量的时候,并且图片大小比较大,比如各种商场网站,图片素材网等等。如果在页面一加载的时候就
加载全部图片,显然会影响网站加载速度和加大服务器负担,而且用户体验也必然不好,那么这时候可以采用懒加载。

1.3 懒加载具体实现原理

页面中的img元素之所以会发送http请求的原因是设置了src属性,否则浏览器就不会发送请求去下载这个图片。首先在页面中把所有

的图片用一张占位图进行占位,并且在元素下设置data-src/src2/_src等自定义属性,存放图片的真实路径,当需要用到的时候取出该真实路径动态添加给src。

三.爬取站长素材高清图片代码

import urllib.parse
import urllib.request
from lxml import etree
import time
import os


def handle_request(url, page):
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36',
    }
    # 由于第一页和后面页码规律不一致,所以要进行判断
    if page == 1:
        url = url.format('')
    else:
        url = url.format('_' + str(page))
    # print(url)
    request = urllib.request.Request(url=url,headers=headers)
    return request


def download_image(image_src):
    dirpath = 'gudian'
    # 创建一个文件夹
    if not os.path.exists(dirpath):
        os.mkdir(dirpath)
    # 创建文件名
    filename = os.path.basename(image_src)
    # 图片路径
    filepath = os.path.join(dirpath, filename)
    # 发送请求,保存图片
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36',
    }
    request = urllib.request.Request(url=image_src, headers=headers)
    response = urllib.request.urlopen(request)
    with open(filepath, 'wb') as fp:
        fp.write(response.read())


def parse_content(content):
    # 生成对象
    tree = etree.HTML(content)
    image_list = tree.xpath('//div[@id="container"]/div/div/a/img/@src2')  # //div[@id="container"]/div/div/a/img/@src
    # 懒加载
    # print(image_list)
    # print(len(image_list))
    # 遍历列表,依次下载图片
    for image_src in image_list:
        download_image(image_src)


def main():
    url = 'http://sc.chinaz.com/tupian/gudianmeinvtupian{}.html'
    # http://sc.chinaz.com/tupian/gudianmeinvtupian_2.html
    start_page = int(input("请输入开始页码:"))
    end_page = int(input("请输入结束页码:"))
    for page in range(start_page,end_page+1):
        print("第%s页开始下载······" % page)
        request = handle_request(url, page)
        content = urllib.request.urlopen(request).read().decode()
        # 解析内容
        parse_content(content)
        time.sleep(2)
        print("第%s页下载完毕······" % page)
    print("下载完成!")

if __name__ == "__main__":
    main()


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!