Python爬虫 解析 xpath -- 爬取多页图片

该博客介绍了如何使用Python的urllib和lxml库来爬取并下载特定网站的图片。首先,通过创建请求对象并设置User-Agent来模拟浏览器请求。接着,获取网页源码并解析出图片的名称和src2属性(处理页面懒加载)。最后,通过循环遍历每一页,下载指定数量页的图片,图片保存在本地的loveImg文件夹中。
摘要由CSDN通过智能技术生成

1. 解析站长素材图片

需求:下载站长素材前10页的图片

站长素材
在这里插入图片描述
这是第一页图片的链接:https://sc.chinaz.com/tupian/fengjingtupian.html
在这里插入图片描述

这是第二页图片的链接:https://sc.chinaz.com/tupian/fengjingtupian_2.html
在这里插入图片描述
然后后面的规律为:

  • 这是第三页图片的链接:https://sc.chinaz.com/tupian/fengjingtupian_3.html
  • 这是第四页图片的链接:https://sc.chinaz.com/tupian/fengjingtupian_4.html
  • 这是第五页图片的链接:https://sc.chinaz.com/tupian/fengjingtupian_5.html
  • 以此类推......

1.1 第一步:获取请求对象

UA(User-Agent)用户代理的获取方式为(UA介绍:User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统 及版本、CPU 类型、浏览器及版本。浏览器内核、浏览器渲染引擎、浏览器语言、浏览器插件等),有了UA就可以模仿是从游览器发起的请求。

在这里插入图片描述

def create_request(page):
    if (page == 1):
        url = 'https://sc.chinaz.com/tupian/fengjingtupian.html'
    else:
        url = 'https://sc.chinaz.com/tupian/fengjingtupian_' + str(page) + '.html'

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3883.400 QQBrowser/10.8.4559.400'
    }

    request = urllib.request.Request(url=url, headers=headers)
    return request

1.2 第二步:获取网页的源码

def get_content(request):
    # 打开链接
    response = urllib.request.urlopen(request)
    # 获得网页源码(utf-8编码)
    content = response.read().decode('utf-8')
    return content

1.3 第三步:下载图片

xpath解析图片名称的路径:

name_list = tree.xpath('//div[@id="container"]//a/img/@alt')
在这里插入图片描述

xpath解析图片地址的路径:

在这里插入图片描述
我们使用 src_list = tree.xpath('//div[@id="container"]//a/img/@src')

我们看一下刷新后靠下面图片的链接:

我们发现这里图片的链接是 src2 而不是 src
在这里插入图片描述

当我们往下面翻的时候,发现src2又会变为src,这里是因为页面懒加载机制的关系:

因此我们在爬虫的时候需要用到的是src2
在这里插入图片描述

此时我们就可以完成我们的代码了:

# (1) 请求对象的定制
# (2)获取网页的源码
# (3)下载


# 需求 下载的前十页的图片
# https://sc.chinaz.com/tupian/fengjingtupian.html   1
# https://sc.chinaz.com/tupian/fengjingtupian_2.html

import urllib.request
from lxml import etree


def create_request(page):
    if (page == 1):
        url = 'https://sc.chinaz.com/tupian/fengjingtupian.html'
    else:
        url = 'https://sc.chinaz.com/tupian/fengjingtupian_' + str(page) + '.html'

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3883.400 QQBrowser/10.8.4559.400'
    }

    request = urllib.request.Request(url=url, headers=headers)
    return request


def get_content(request):
    # 打开链接
    response = urllib.request.urlopen(request)
    # 获得网页源码(utf-8编码)
    content = response.read().decode('utf-8')
    return content


def down_load(content):
    #     下载图片
    # urllib.request.urlretrieve('图片地址','文件的名字')
    tree = etree.HTML(content)

    name_list = tree.xpath('//div[@id="container"]//a/img/@alt')

    # 一般设计图片的网站都会进行懒加载
    src_list = tree.xpath('//div[@id="container"]//a/img/@src2')

    for i in range(len(name_list)):
        name = name_list[i]
        src = src_list[i]
        # 因为获取到的路径没有协议, 所以我们这里补上协议
        url = 'https:' + src

        urllib.request.urlretrieve(url=url, filename='./loveImg/' + name + '.jpg')


if __name__ == '__main__':
    start_page = int(input('请输入起始页码'))
    end_page = int(input('请输入结束页码'))

    for page in range(start_page, end_page + 1):
        # (1) 请求对象的定制
        request = create_request(page)
        # (2)获取网页的源码
        content = get_content(request)
        # (3)下载
        down_load(content)

运行结果:
在这里插入图片描述
注意:需要在当前py文件同级目录建立一个loveImg的文件夹,否则会IO异常。
在这里插入图片描述



评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeJiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值