目录
*在解析页面代码时,如果一直解析不对,一定要把源代码打印出来,看看自己的xpath写的对不对,这很重要。
一、数据解析
1、作用:用来聚焦爬虫
2、网页中显示的数据都存储在html的标签中或标签的属性中
3、数据解析的通用原理:1)指定标签的定位;2)取出标签中存储的数据或者标签属性中的数据
二、xpath
1、解析原理:html标签以树状的形式进行展示
2、实例化etree对象(这个非常重要,不要弄混)
etree.parse('filename'):将本地html文档加载到该对象中
etree.HTML(page_text):网站获取的页面数据加载到该对象
3、标签定位(最常用到,与正则有一拼)
最左侧/:从根标签开始定位指定标签
非最左侧/:表示一个层级
非左侧//:表示多个层级(很常用)
最左侧//:从任意位置进行标签定位(很常用)
属性定位:tagName[@attrName='value']
索引定位:tag[index]:索引是从1开始
4、取文本/属性
文本:/text():直系内容 //text():所有文本内容
属性: /@attrName
三、代码分析
1、加载本地html文件
from lxml import etree
#使用etree
tree=etree.parse('test.html')
#定位class为song的div下面的所有p
print('属性定位+直系文本内容:',tree.xpath('//div[@class="song"]/p/text()'))
#定位到第几个p 从1开始
print('索引定位+直系文本内容:',tree.xpath('//div[@class="song"]/p[2]/text()'))
#取所有文本内容
print('属性定位+直系文本内容:',tree.xpath('//a[@alt="qi"]/text()'))
属性定位+直系文本内容: ['李清照', '王安石', '苏轼', '柳宗元']
索引定位+直系文本内容: ['王安石']
属性定位+直系文本内容: ['岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君']
2、多页数据爬取
'''循环采集 完整代码'''
#将url进行循环修改
import requests
import os
from lxml import etree
headers={
'User-Agent':'XXXX'
}
path='F:\爬虫\Imgs'
#分页爬取
for page in range(1,6):
#地址规律 循环爬取
if page==1:
new_url='https://pic.netbian.com/4kdongwu/'
else:
new_url='https://pic.netbian.com/4kdongwu/index_{}.html'.format(page)
'''开始爬取'''
#requests获取
response=requests.get(url=new_url,headers=headers)
response.encoding='gbk'
page_text=response.text
#通过HTML加载text文件
tree=etree.HTML(page_text)
#定位具体的图片地址位置
img_text=tree.xpath('//div[@class="slist"]//img/@src')
#获取图片名字
img_name=tree.xpath('//div[@class="slist"]//b/text()')
#下载图片数据
for i in range(len(img_text)):
#地址拼接 加载完整地址
img_text_src='http://pic.netbian.com'+img_text[i]
#获取名字
img_name_src=img_name[i]
#获取图片内容
img_text_all=requests.get(url=img_text_src,headers=headers).content
#图片下载地址
filePath=os.path.join(path,img_name_src+'.jpg')
with open(filePath,'wb') as fp:
fp.write(img_text_all)
四、图片懒加载
懒加载:在浏览器加载的时候,不会全部加载页面,而是等用户向下滑动或者页面显示在屏幕范围内时才会加载,这样的好处是减小服务器压力,缩短页面响应时间。
1、案例分析:
(1)
(2)
(1)是完整加载的页面,img有完整地址;(2)是懒加载页面,img地址不完整。同时观察两张图片,(1)img的src与“data-original”一致,(2)中也有“data-original”,为图片地址。因此后续解析的就是“data-original”。
2、代码分析
from lxml import etree
import requests
img_url='https://sc.chinaz.com/tupian/dongman.html'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36'
}
#requests获取
response=requests.get(url=img_url,headers=headers)
response.encoding='utf-8'
page_text=response.text
#通过xpath获取具体数据
tree=etree.HTML(page_text)
#解析出图片的真正地址
img_text=tree.xpath('//div[@class="item"]/img/@data-original')
#地址拼接,得到正确地址
for i in img_text:
img_src_text='https:'+i
print('图片懒加载地址:',img_src_text)