Python爬虫入门 ~ xpath图片爬取案例(绝对不是爬小姐姐的图片)

488 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情

前言

在上一篇《xpath基本使用》中,学习到了相关的语法以及基本的使用,还有浏览器插件的安装,但却未与实际场景相结合,今天就来学习下如何将xpath用在实际的爬取案例中吧。

站长素材:sc.chinaz.com/

该网站中有很多素材图片,字体,简历模板,PPT,代码模板等等的资源,是一个很不错的网站,今天我们就来获取一下该网站上的风景图片,看看有没有什么好看的拿来做壁纸吧~

前置准备

定位接口

通过翻页按钮,我们可以获取到前三页的链接如下所示:

# 第一页
https://sc.chinaz.com/tupian/fengjing.html
# 第二页
https://sc.chinaz.com/tupian/fengjing_2.html
# 第三页
https://sc.chinaz.com/tupian/fengjing_3.html

image.png

请求对象定制

需要请求的接口已经找到了,那么我们就可以来定制请求的对象了

def create_request(page):
    base_url = 'https://sc.chinaz.com/tupian/fengjing'
    tail_url = '.html'
    if(page == 1):
        url = base_url + tail_url
    else:
        url = base_url + '_' + str(page) + tail_url

    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
    }

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

获取网页源码

请求对象拿到了,那么我们就需要向服务器发出请求,拿到响应的源码了

def getHtml(request):
    response = urllib.request.urlopen(request)
    return response.read().decode('utf-8')

下载图片

源码已经拿到了,那么剩下的自然就是将页面中的图片下载下来了。既然要下载图片,那就肯定涉及到解析页面的操作了,解析步骤如下:

  1. 定位图片,通过单击左下角的小箭头图标,然后再选择我们所需的图片,点击一下,即可跳到当前图片对应的源码部分

image.png

  1. 解析路径,按Ctrl + Shift + x唤起浏览器插件,找到多个图片标签的共同点,输入查询条件校验看是否能正常获取我们所需的数据。

图中圈起来的地方,命中的标签都被加上高亮效果了,上下滚动一下,可以看到确实是我们需要获取的数据,那就可以把公式复制到我们代码中了。

image.png

  1. 获取img标签数据,根据前面两步,我们已经可以抓取到所需要的图片标签了,剩下的就是将图片下载到本地了。在这里面,我们需要图片的名字以及图片链接,先来获取,打印一下看看结果吧。

image.png

打印出来的图片名称没问题,但是src怎么跟我们在页面中看到的不一样呢?

这种情况一般是网站做的一个懒加载缓存功能,我们可以先打印下获取到的响应页面源码看一下

image.png

在控制台中可以看到,src属性确实是../static/common/com_images/img-loding.png,但是下面又多了一个data-original属性,里面是图片的地址,那么我们就需要将表达式中src更换为data-original再打印出来看一下

image.png

这一次就能正常的获取到了,剩下的就是将图片下载到本地了。

def download_img(html):
    tree = etree.HTML(html)
    img_name_list = tree.xpath("//div/img[@class='lazy']/@alt")
    img_src_list = tree.xpath("//div/img[@class='lazy']/@data-original")
    for i in range(len(img_name_list)):
        urllib.request.urlretrieve('https:' + img_src_list[i], './img/' + img_name_list[i] + '.jpg')

image.png

完整代码

import urllib.request
from lxml import etree

def create_request(page):
    base_url = 'https://sc.chinaz.com/tupian/fengjing'
    tail_url = '.html'
    if(page == 1):
        url = base_url + tail_url
    else:
        url = base_url + '_' + str(page) + tail_url

    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
    }

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

def getHtml(request):
    response = urllib.request.urlopen(request)
    return response.read().decode('utf-8')

def download_img(html):
    tree = etree.HTML(html)
    img_name_list = tree.xpath("//div/img[@class='lazy']/@alt")
    img_src_list = tree.xpath("//div/img[@class='lazy']/@data-original")
    for i in range(len(img_name_list)):
        urllib.request.urlretrieve('https:' + img_src_list[i], './img/' + img_name_list[i] + '.jpg')

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

    for page in range(start_page, end_page + 1):
        request = create_request(page)
        html = getHtml(request)
        download_img(html)

温馨提示:本案例仅供学习参考,切勿暴力爬取或用于其它非法途径。发生任何纠纷与本人无关!