Python爬虫学习第三章-4.4-使用xpath解析下载图片
程序员文章站
2022-05-07 23:31:52
...
Python爬虫学习第三章-4.4-使用xpath解析下载图片
这一节主要是使用xpath解析爬取4k图片
回顾使用xpath进行数据解析的步骤:
- 实例化一个etree类的对象,并将需要被解析的页面源码数据加载到该对象种。
- 调用etree对象中的xpath方法并结合着xpath表达式实现标签的定位和内容的捕获(捕获到的是标签或者标签属性中的文本内容)。
步骤:
先爬取整张页面的源码数据,在这个案例中使用url模板和循环实现分页爬取。
经过数据分析拿到每张图片的url之后,对每张图片的url发起请求,注意获取数据时用content属性,因为图片是二进制数据。请求到在进行持久化存储即可。
代码实现:(目前存在一个问题,爬取到的图片打开时显示格式不支持,还需要改进)
#解析下载图片数据
#1、对http://pic.netbian.com/4kfengjing/发起请求,拿到页面源码数据
#2、对页面源码数据进行解析,解析出图片对应标签的src的属性值,也就是特定图片的url,再对这个url发请求,就可以拿到图片的数据
import requests
from lxml import etree
import os
if __name__=="__main__":
#获取整张页面的源码数据
url = "http://pic.netbian.com/4kfengjing/index_%d.html"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}
#创建文件夹用于存放图片
if not os.path.exists('./Piclibs'):
os.mkdir('./Piclibs')
#遍历列表
for pageNum in range(1, 3):
new_url = format(url % pageNum) # format返回的是一个字符串,new_url就是对应分页的地址
response = requests.get(url=new_url, headers=headers)
# 手动设定响应数据的编码格式
# response.encoding = 'utf-8' #为了解决标题乱码的问题,但只适应于一部分,对这个案例没有效果,所以可以对发生问题的地方进行指定的编码
page_text = response.text
# 实例化一个etree对象
tree = etree.HTML(page_text)
# 使用xpath进行数据解析,得到src和alt的属性值,也就是每一张图片的url和标题
li_list = tree.xpath('//div[@class="slist"]/ul/li') # 返回的是一批li标签
for li in li_list:
img_src = 'http://pic.netbian.com/4kfengjing'+li.xpath('./a/img/@src')[0] #获取属性值是用"/@tagName",返回的也是个列表,且只含有一个元素
img_name = li.xpath('./a/img/@alt')[0]+'.jpg'
#较为通用的处理中文乱码的方案
img_name = img_name.encode('iso-8859-1').decode('gbk')#为了解决标题乱码的问题
#print(img_name,img_src)
#请求图片并进行持久化存储
img_data = requests.get(url=img_src,headers=headers).content #注意图片是二进制数据,得用content属性
img_path = 'Piclibs/'+img_name #定义图片存储的路径
with open(img_path,'wb') as fp: #多次打开文件夹用with更方便,写入二进制数据是用wb
fp.write(img_data)
print(img_name,'下载成功')
在这个案例中的收获:
-
1、解决乱码问题:爬取到的图片标题显示乱码,通常处理乱码有两种方式:
-
一种是进行总的设置:
response = requests.get(url=new_url, headers=headers) # 手动设定响应数据的编码格式 # response.encoding = 'utf-8' page_text = response.text
-
另一种是:
img_name = li.xpath('./a/img/@alt')[0]+'.jpg' #较为通用的处理中文乱码的方案 img_name = img_name.encode('iso-8859-1').decode('gbk')#为了解决标题乱码的问题
-
-
创建文件夹存图片:
import os if not os.path.exists('./Piclibs'): os.mkdir('./Piclibs') img_path = 'Piclibs/'+img_name #需要定义图片存储的路径 with open(img_path,'wb') as fp: #多次打开文件夹用with更方便,写入二进制数据是用wb fp.write(img_data)