跟随B站波波老师学爬虫(四)——Xpath解析数据实例

一、Xpath解析基础

1、xpath表达式(层级)

  • -/:表示的是从根结点开始定位。一个/表示一个层级。
  • -//:表示的是多个层级。可以从任意位置开始定位。
  • -属性定位://meta[@charset=“utf-8”]
  • 通用写法://tag[@attrName=“attrValue”]
  • -索引定位://tag[@attrName=“attrValue”]/tag[n]索引是从1开始的
  • -取文本:/text():获取的是标签中直系的文本内容
  • //text():获取的是标签中非直系的文本内容
  • -取属性:/@attrName

2、Xpath解析数据基本步骤

  • 实例化一个etree对象,并且将被解析的页面源码数据加载到该对象中

       1)将本地的html文档中的源码数据加载到etree对象中 

             etree.parse(filepath)

       2)将互联网上获取的源码数据加载到该对象中

            etree.Html('pagetext')

  •     通过调用etree对象中的xpath方法结合着xpath表达式实现标签定位和内容的捕获

  

二、根据Xpath定位爬取【彼岸图网图片】实战分析记录

--需求:爬取彼岸图网的任意图片,我选择爬取的美食图片

--url   http://pic.netbian.com/4kmeishi/

1、第一步:我们还是老步骤,我们需要先获取到页面源码数据,也就是根据requests的方法获取,对了不要忘记进行UA伪装哦!

import requests

url = 'http://pic.netbian.com/4kmeishi/'

headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'}
    response = requests.get(url=url, headers=headers)
page_text=response.text

2、第二步就是我们上面基础步骤中的实例etree对象,那么首先我们需要导入库,然后再根据上面我们介绍的方法进行实例化对象,下面是具体的代码~

from lxml import etree
tree = etree.HTML(page_text)

3、第三步就是重头戏了,我们要进行xpath定位图片了,打入敌人内部,小F12安排上,我们看下面的截图,很容易发现,我们的目标是解析到class=slist下面的ul下面的li标签下面的src属性,再拼接上url就可以获取到图片了,那么图片我们需要进行存储,这里就用alt属性进行图片命名吧,下面我们再进一步分析

首先我们要做一个局部解析,也就是先定位到li标签,再循环这个li-list,获取到当前页面所有的src,src是第一个属性值所以[0]定位,在进行拼接,也就是这样

# 解析src的属性值、图片命名,url拼接,解析alt属性值
    li_list = tree.xpath('//div[@class="slist"]/ul/li')
 for li in li_list:
        # 对第一个做局部解析
        image_src = 'http://pic.netbian.com/' + li.xpath('./a/img/@src')[0]

然后我们来对图片进行命名,命名是中文的,而且我们遇到了中文乱码,后面具体再说爬虫遇到中文乱码的解决办法吧,先按照我们的步骤往下走

image_name = li.xpath('./a/img/@alt')[0] + '.jpg'

下一步就是获取图片的二进制数据,进行持久化存储了,这里是我们的老朋友了,就不多说了,直接上部分代码,后面我再贴个完整的代码哈

image_data=requests.get(url=image_src,headers=headers).content
        image_path='picLibs/'+image_name
        with open(image_path,'wb') as fp:
            fp.write(image_data)
            print(image_name,"下载成功")
        fp.close()

最后呢,我们存储数据,发现图片的命名真的乱码了,但是用波波老师的方法并没有解决我的中文乱码问题,而是用另一个同学的办法解决的,下面部分说下解决办法

三、爬取数据过程中,中文乱码的解决办法

1、获取响应数据,设置响应数据的encoding

  # 解决乱码
    response.encoding=response.apparent_encoding
    page_text=response.text

四、完整代码

if __name__ == '__main__':
    url = 'http://pic.netbian.com/4kmeishi/'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'}
    response = requests.get(url=url, headers=headers)
    # 获取响应对象
    # 解决乱码
    response.encoding=response.apparent_encoding
    page_text=response.text
    # 数据解析
    tree = etree.HTML(page_text)
    # 解析src的属性值、图片命名,url拼接,解析alt属性值
    li_list = tree.xpath('//div[@class="slist"]/ul/li')
    if not os.path.exists('./picLibs'):
        os.mkdir('./picLibs')
    for li in li_list:
        # 对第一个做局部解析
        image_src = 'http://pic.netbian.com/' + li.xpath('./a/img/@src')[0]
        image_name = li.xpath('./a/img/@alt')[0] + '.jpg'
        image_name = image_name.encode("utf-8").decode("utf-8")
        # print(image_name, image_src)
        image_data=requests.get(url=image_src,headers=headers).content
        image_path='picLibs/'+image_name
        with open(image_path,'wb') as fp:
            fp.write(image_data)
            print(image_name,"下载成功")
        fp.close()


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值