赞
踩
Python爬虫爬取4K高清图片,网址是:https://pic.netbian.com。将爬取动物类的图片。
页面中通过点击底部的页面数可以跳转到指定页面。
打开网页源码查看请求响应包。可以看到网页的请求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页的URL:https://pic.netbian.com/4kdongwu/index.html
第2-22页的URL:https://pic.netbian.com/4kdongwu/index_页数.html
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'}
第一页的url是:https://pic.netbian.com/4kdongwu/index.html
我们对第一页发起请求:
response = requests.get(url,headers=headers)
print(response.status_code)
print(response.encoding) # 编码类型是ISO-8859-1
print(response.text)
可以看到响应内容的编码格式是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)
输出结果是如下,是正常的,无乱码。
首先实例化一个etree对象:
# 实例化一个etree对象
tree = etree.HTML(page_text)
打开网页源码,使用定位器定位页面中的全部图片,定位到<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
图片的部分地址在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)
运行结果是:
上一步已经获取图片的地址,接下来对图片发起请求。图片在计算机中是以二进制数据形式存储的,而response.content是获取二进制数据。
# 获取到图片地址之后,请求图片
res = requests.get(url=img_src,headers=headers)
# content表示存储的是二进制数据,图片是以二进制数据形式存储的
img_data = res.content
获取到图片之后,将其保存到本地。
在当前目录创建一个文件夹:
import os
# 创建一个文件夹用于存储图片
if not os.path.exists('./picLibs'):
os.mkdir('./picLibs')
将每一张图片保存到文件夹中:
# 指定文件路径
img_path = f'picLibs/{img_name}'
# wb是一个以二进制的形式写入的模式
with open(img_path,'wb') as f:
f.write(img_data)
print(img_name,'下载成功!!')
第一页的图片获取完毕,接下来通过循环获取第2页-第22页的图片。
通过循环改变请求URL:
# 爬取第2页-第22页的图片
for i in range(2,23):
img_url = f'https://pic.netbian.com/4kdongwu/index_{i}.html'
接下来的步骤与爬取第一页图片时一样。
# 导包 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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。