数据解析-xpath

目录

一、数据解析

二、xpath

三、代码分析

四、图片懒加载

1、案例分析:

2、代码分析


 

*在解析页面代码时,如果一直解析不对,一定要把源代码打印出来,看看自己的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)

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值