当前位置:   article > 正文

Python爬虫爬取4k高清图片——xpath解析_数据爬取的图片

数据爬取的图片

Python爬虫爬取4k高清图片——xpath解析数据

Python爬虫爬取4K高清图片,网址是:https://pic.netbian.com。将爬取动物类的图片。
  • 1

爬取彼岸图网中的动物类4k高清图片

1.1 打开网页,初步获取信息

页面中通过点击底部的页面数可以跳转到指定页面。
在这里插入图片描述
打开网页源码查看请求响应包。可以看到网页的请求URL和网页请求方法,以及数据类型。
在这里插入图片描述
点击页面底部的页面数,跳转到不同页面,发现URL发生变化,我们需要找出URL的规律。
第一页的URL:https://pic.netbian.com/4kdongwu/
第二页的URL:https://pic.netbian.com/4kdongwu/index_2.html
第三页的URL:https://pic.netbian.com/4kdongwu/index_3.html
……
第22页的URL:https://pic.netbian.com/4kdongwu/index_22.html

发现从第二页开始,URL后都多了index_页数.html,尝试把index后面的数字改为1,看看能否跳转到第一页。修改之后发现并不能跳转第一页。打开开发者工具的同时,从其他页面跳转到第一页,发现其请求URL变为:https://pic.netbian.com/4kdongwu/index.html
在浏览器的网址栏输入该URL,确实能请求到第一页,由于每一页的URL的变化是不连贯的,但是从第2页开始是有规律的。所以我们可以单独获取第一页的图片,再通过循环获取第2页到第22页的图片。

1.2 准备网页请求方法所需的参数

  • 指定URL
1页的URL:https://pic.netbian.com/4kdongwu/index.html
第2-22页的URL:https://pic.netbian.com/4kdongwu/index_页数.html
  • 1
  • 2
  • 进行UA伪装
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.43'}
  • 1

1.3 爬取第一页的图片

第一页的url是:https://pic.netbian.com/4kdongwu/index.html
  • 1
1.3.1 发起请求,获取响应

我们对第一页发起请求:

response = requests.get(url,headers=headers)
print(response.status_code)
print(response.encoding)          # 编码类型是ISO-8859-1
print(response.text)        
  • 1
  • 2
  • 3
  • 4

可以看到响应内容的编码格式是ISO-8859-1,响应内容中有乱码,说明响应内容的编码格式与我们电脑的编码格式不相同。
在这里插入图片描述
在相应内容html文档的头部,可以发现文档的编码格式为“gbk”。
在这里插入图片描述
尝试将响应内容的编码格式改为“gbk”,并打印响应内容。

response.encoding = 'gbk'
print(response.text)  
# 或者通过另一个方法来修改编码格式
# # 手动设定响应数据的编码格式
# page_text = response.text
# # 先将响应内容编码成ISO,再解码成gbk(通用处理中文乱码的解决方案)
# page_text = page_text.encode('ISO-8859-1').decode('gbk')
# print(page_text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输出结果是如下,是正常的,无乱码。
在这里插入图片描述

1.3.2 解析网页数据,获取图片信息

首先实例化一个etree对象:

# 实例化一个etree对象
tree = etree.HTML(page_text)
  • 1
  • 2

打开网页源码,使用定位器定位页面中的全部图片,定位到<ul class="clearfix">标签,说明页面中的所有图片都在该标签下。进一步定位到一张图片,发现图片在<ul class="clearfix">标签下的<li>标签的子标签<a>标签的<img>标签中。说明<ul class="clearfix">标签下的每一个<li>标签下都有一张图片的数据。
在这里插入图片描述
定位到图片所在的img标签,右键复制img标签的xpath。

//*[@id="main"]/div[3]/ul/li[1]/a/img
  • 1

图片的部分地址在img标签的src属性中,图片的名称是img标签alt属性的属性值。
我们通过 '/@属性名’来取到属性名对应的属性值。

右击图片选择复制图片地址,在浏览器地址栏打开,图片的完整地址如下:
https://pic.netbian.com/uploads/allimg/210307/232913-16151309534364.jpg

对比img标签中的src属性值可以发现,src中的图片地址是不完整的,所以在获取图片地址后需要将其拼接成完整的地址。

接下来通过遍历<li>标签获取该页面中每一张图片的数据,由于通过xpath获取的数据会存储到一个列表中,所以我们需要通过下标索引取出对应的值。

image_list = tree.xpath('//*[@id="main"]/div[3]/ul/li')
for li in image_list:
    # 拼接完整的图片地址
    img_src = 'https://pic.netbian.com' + li.xpath('./a/img/@src')[0]
    # 获取图片名称,并加上后缀
    img_name = li.xpath('./a/img/@alt')[0] + '.jpg'
    # img_name = img_name.encode('ISO-8859-1').decode('gbk')
    print(img_name,img_src)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

运行结果是:
在这里插入图片描述

1.3.3 获取图片,并持久化存储

上一步已经获取图片的地址,接下来对图片发起请求。图片在计算机中是以二进制数据形式存储的,而response.content是获取二进制数据。

# 获取到图片地址之后,请求图片
res = requests.get(url=img_src,headers=headers)
# content表示存储的是二进制数据,图片是以二进制数据形式存储的
img_data = res.content
  • 1
  • 2
  • 3
  • 4

获取到图片之后,将其保存到本地。

在当前目录创建一个文件夹:

import os
# 创建一个文件夹用于存储图片
if not os.path.exists('./picLibs'):
    os.mkdir('./picLibs')
  • 1
  • 2
  • 3
  • 4

将每一张图片保存到文件夹中:

# 指定文件路径
    img_path = f'picLibs/{img_name}'
    
    #  wb是一个以二进制的形式写入的模式
    with open(img_path,'wb') as f:
        f.write(img_data)
        print(img_name,'下载成功!!')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

第一页的图片获取完毕,接下来通过循环获取第2页-第22页的图片。

1.4 爬取第2页到第22页的图片

通过循环改变请求URL:

# 爬取第2页-第22页的图片
for i in range(2,23):
    img_url = f'https://pic.netbian.com/4kdongwu/index_{i}.html'
  • 1
  • 2
  • 3

接下来的步骤与爬取第一页图片时一样。

1.5 完整代码

# 导包
import requests
from lxml import etree
import os

# 指定uRL
url = 'https://pic.netbian.com/4kdongwu/'
# UA伪装
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.43'}

# 发起请求,获取响应
response = requests.get(url,headers=headers)
print(response.status_code)
print(response.encoding)          # 编码类型是ISO-8859-1
# print(response.text)  
print('----'*40)

# 修改编码格式
response.encoding = 'gbk'
# print(response.text)  
page_text = response.text

# # 手动设定响应数据的编码格式
# # 先将响应内容编码成ISO,再解码成gbk(通用处理中文乱码的解决方案)
# page_text = page_text.encode('ISO-8859-1').decode('gbk')

# 实例化一个etree对象
tree = etree.HTML(page_text)

image_list = tree.xpath('//*[@id="main"]/div[3]/ul/li')

# 创建一个文件夹用于存储图片
if not os.path.exists('./picLibs'):
    os.mkdir('./picLibs')

# 图片计数
count=0

# 爬取第1页的图片
for li in image_list:
    # 拼接完整的图片地址
    img_src = 'https://pic.netbian.com' + li.xpath('./a/img/@src')[0]
    # 获取图片名称,并加上后缀
    img_name = li.xpath('./a/img/@alt')[0] + '.jpg'
    # img_name = img_name.encode('ISO-8859-1').decode('gbk')
    # print(img_name,img_src)
    
    # 获取到图片地址之后,请求图片,并进行持久化存储
    res = requests.get(url=img_src,headers=headers)
    # content表示存储的是二进制数据,图片是以二进制数据形式存储的
    img_data = res.content
    
    # 指定文件路径
    img_path = f'picLibs/{img_name}'
    
    #  wb是一个以二进制的形式写入的模式
    with open(img_path,'wb') as f:
        f.write(img_data)
        print(img_name,'下载成功!!')
        count += 1

# 爬取第2页-第22页的图片
for i in range(2,23):
    img_url = f'https://pic.netbian.com/4kdongwu/index_{i}.html'
    img_response = requests.get(url=img_url,headers=headers)
    img_response.encoding = 'gbk'
    img_html = img_response.text
    # 实例化etree对象
    tree = etree.HTML(img_html)
    
    img_li = tree.xpath('//*[@id="main"]/div[3]/ul/li')
    
    for each in img_li:
        # 拼接完整的图片地址
        img_src = 'https://pic.netbian.com' + each.xpath('./a/img/@src')[0]
        # 获取图片名称,并加上后缀
        img_name = each.xpath('./a/img/@alt')[0] + '.jpg'
        
        # 对图片发起请求
        img_res = requests.get(url=img_src,headers=headers)
        img_data = img_res.content
        # 指定文件路径
        img_path = f'picLibs/{img_name}'
    
        #  wb是一个以二进制的形式写入的模式
        with open(img_path,'wb') as f:
            f.write(img_data)
            print(img_name,'下载成功!!')
            count += 1
            
            
print(count)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/460840
推荐阅读
相关标签
  

闽ICP备14008679号