【Python从入门到进阶】33、使用bs4获取星巴克产品信息

接上篇《32、bs4的基本使用》
上一篇我们介绍了BeautifulSoup的基本概念,以及bs4的基本使用,本篇我们来使用bs4来解析星巴克网站,获取其产品信息。

一、星巴克网站介绍

【Python从入门到进阶】33、使用bs4获取星巴克产品信息_第1张图片
星巴克官网是星巴克公司的官方网站,用于提供关于星巴克咖啡店的信息和服务。在星巴克官网上,可以找到各种有关咖啡、茶饮、糕点和其他食品的详细描述和营养信息。此外,官网还提供星巴克的最新消息、特别活动、促销优惠和公司资讯。

二、产品界面分析


星巴克官网中国地区地址:https://www.starbucks.com.cn/
我们本次要抓取的是星巴克的产品界面,我们点击首页左上角的“菜单”按钮,在右侧就可以看到星巴克所有的产品:
【Python从入门到进阶】33、使用bs4获取星巴克产品信息_第2张图片

此时我们按F12打开浏览器的开发者模式,清除NetWork区域,重新点击菜单按钮或刷新菜单界面,可以看到其中获取菜单界面的后台服务地址:
【Python从入门到进阶】33、使用bs4获取星巴克产品信息_第3张图片
其实就是菜单地址:https://www.starbucks.com.cn/menu/,它不是一个异步的服务,而是直接返回一个渲染好的html
我们仔细阅读一下获取到的HTML代码,将有关产品的部分单独拉出来,分析其结构(这里选择了“咖啡融合冰淇淋”这一部分的html代码):

我们可以看到,整个产品区域是由一个div包裹的,这个div包含一个名为“page-menu-list”的css样式,然后其中的产品全部是由

包裹,ul的id为“grid padded-3 product”。其中的具体的产品在里面用标签包裹,而a标签的id包含“menu-product-”的字样,里面的标签包裹的就是我们需要获取的产品名称。而class为“caption”的h3标签,包裹的是该种产品的分类。

综上所述,我们分析出来的结果信息为:

1、所有产品在包含“page-menu-list”的css样式的div下;
2、每种产品大类包裹在id为“grid padded-3 product”的ul下;
3、每种产品大类的名称被包裹在class为“caption”的h3标签内;
4、每种产品具体的名称包裹在包含“menu-product-”的字样的a标签内的标签中。

分析了这些,足以让我们思考如何试用bs4来进行星巴克所有产品的信息抓取了。

三、抓取产品数据

我们需要抓取的结果,就是星巴克产品有多少大类,每个大类下有多少个具体的产品。

1、引入bs4库

编写代码前,首先要确保已经引入了bs4的库(如果没有,需要通过“pip install bs4”来安装)。

然后引入bs4库:

from bs4 import BeautifulSoup

2、获取星巴克产品页面

我们通过urllib来获取星巴克产品页面的html代码:

import urllib.request

# 下面模拟浏览器向服务器发送请求
# 发送HTTP GET请求
response = urllib.request.urlopen('https://www.starbucks.com.cn/menu/')
html_content = response.read().decode()
print(html_content)

打印出来就可以看到产品界面的html代码:
【Python从入门到进阶】33、使用bs4获取星巴克产品信息_第4张图片

3、创建BS对象,并制定解析器

这里使用默认的html.parser解析器,用来解析html代码:

# 创建BeautifulSoup对象,并制定解析器(此处使用默认的html.parser)
soup = BeautifulSoup(html_content, 'html.parser')

4、获取商品大类

首先我们先获取商品大类,根据上面的分析,我们只需要获取class为“caption”的h3标签内的字符,就获取到所有的大类了:

# 1、获取所有的产品大类
captions = soup.find_all('h3', class_="caption")
print("星巴克产品大类:")
for cap in captions:
    print(cap.text)

结果:
【Python从入门到进阶】33、使用bs4获取星巴克产品信息_第5张图片
可以看到星巴克商品的所有大类已经获取到。

5、获取所有产品名称

根据第二章的分析,每种产品大类包裹在id为“grid padded-3 product”的ul下,具体的名称包裹在包含“menu-product-”的字样的a标签内的标签中,我们按照这个思路编写bs4代码:

# 2、获取所有产品信息
# 获取所有class为grid padded-3 product的ul节点
menus_uls = soup.find_all('ul', class_="grid padded-3 product")
print("【星巴克产品细则】:")
for menus_ul in menus_uls:
    # 获取ul下的所有li节点
    menus_lis = menus_ul.find_all('li')
    # 网页上有空节点,要判定一下才能获取下一步数据
    if len(menus_lis) > 0:
        # 获取ul节点下唯一一个h3的文字,就是产品大类
        print("----[" + menus_ul.h3.text + "]----")
        for menus_li in menus_lis:
            # 获取每一个li里面的a标签内的strong标签的文字,就是具体产品名
            print("    ", menus_li.a.strong.text)

结果:

【星巴克产品细则】:
----[咖啡融合冰淇淋]----
     阿馥奇朵™
     麦芽雪冷萃™
     冷萃浮乐朵™
     气致™冷萃浮乐朵™
----[星巴克冷萃咖啡系列]----
     冷萃冰咖啡
     轻甜奶油冷萃
     绵云冷萃
----[手工调制浓缩咖啡]----
     美式咖啡(热/冷)
     拿铁(热/冷)
     摩卡(热/冷)
     卡布奇诺(热/冷)
     焦糖玛奇朵(热/冷)
     浓缩咖啡
     馥芮白™
     榛果风味拿铁(热/冷)
     香草风味拿铁(热/冷)
----[星冰乐®]----
     焦糖浓缩咖啡星冰乐
     抹茶星冰乐
     芒果西番莲果茶星冰乐
     摩卡星冰乐
     摩卡可可碎片星冰乐
     香草风味星冰乐
----[气致™冷萃咖啡]----
     气致™冷萃咖啡
----[经典巧克力饮品]----
     经典巧克力饮品(热/冷)
----[茶瓦纳™]----
     红茶拿铁(热/冷)
     抹茶拿铁(热/冷)
     茶瓦纳™ 冰摇柚柚蜂蜜红茶
     冰摇红莓黑加仑茶
     冰摇芒果花草茶
     茶瓦纳™冰摇桃桃乌龙茶
----[深度烘焙]----
     星巴克ORIGAMI™便携式滴滤咖啡(研磨咖啡粉)星巴克®佛罗娜烘焙咖啡系列
----[中度烘焙]----
     星巴克ORIGAMI™便携式滴滤咖啡(研磨咖啡粉)星巴克®派克市场烘焙咖啡系列
----[星巴克VIA® Black]----
     星巴克VIA®哥伦比亚免煮咖啡
     星巴克VIA®意式烘焙免煮咖啡
----[星巴克VIA® Dairy]----
     星巴克VIA®摩卡风味免煮咖啡固体饮料
     星巴克VIA®焦糖拿铁风味免煮咖啡固体饮料
     星巴克VIA®香草拿铁风味免煮咖啡固体饮料
----[深度烘焙]----
     星巴克®佛罗娜咖啡豆
     星巴克®浓缩烘焙咖啡豆
     星巴克®意式烘焙咖啡豆
     星巴克®低因祥龙综合咖啡豆
     星巴克®苏门答腊咖啡豆
----[中度烘焙]----
     星巴克®早餐综合咖啡豆
     星巴克®哥伦比亚咖啡豆
     星巴克®埃塞俄比亚咖啡豆
     星巴克®危地马拉安提瓜咖啡豆
     星巴克®首选咖啡豆
     星巴克®肯亚咖啡豆
     星巴克®派克市场烘焙咖啡豆
     星巴克®凤舞祥云综合咖啡豆
----[烘焙]----
     美式松饼
     蓝莓麦芬
     香浓巧克力麦芬
     旋风玉桂酥
     法式香酥可颂
     法式焦糖酥
     层层榛子果仁酥
     蜂蜜提子司康
     燕麦焦糖布丁面包
     香浓巧克力可颂
     提子干松饼
     核桃提子软法面包
     红豆燕麦松饼
     全麦核桃麦芬
----[蛋糕&甜品]----
     蓝莓曲奇风轻乳酪蛋糕
     经典瑞士卷
     浓醇三重黑巧克力蛋糕
     法式闪电泡芙
     星巴克咖啡提拉米苏蛋糕
     法式马卡龙
     纽约风浓郁重芝士蛋糕
----[其他美食]----
     腰果
     英伦风味黄油饼干
     混合果仁果脯
     水果沙拉
     棒棒糖
     咖啡味蛋卷
     薄荷味口香糖(无糖)
     薄荷味硬糖(无糖)
----[三明治、帕尼尼、卷]----
     牛油果鸡肉焙果
     培根蛋可颂堡
     蜜汁培根蛋卷
     层层牛肉法棍 
     牛肉芝士可颂
     凯撒鸡肉卷
     鸡肉芝香帕尼尼
     炒蛋菌菇虾仁卷
     火腿芝士可颂
     双重芝士火腿吐司
     高达芝士火腿星明治
     帕斯雀牛肉三明治
     烤法式火腿鸡蛋三明治
     慢烤火腿芝士恰巴特
     金枪鱼帕尼尼
     火鸡培根英式麦芬
----[酸奶]----
     谷物组合希腊式风味酸奶(混合莓果)
     谷物组合希腊式风味酸奶(黄桃)
----[常规产品]----
     12oz 烫金品牌黑色马克杯
     银色/白色亮面品牌桌面杯
     12oz 彰显本色黑色/深灰不锈钢桌面杯
     12oz 纯白磨砂玻璃杯
     12oz 烫金品牌白色马克杯
     16oz 烫金品牌黑色马克杯
     16oz 原木黑色拎绳不锈钢保温杯
     16oz 彰显本色黑色/深灰不锈钢随行杯
     16oz 烫金品牌白色马克杯
     3oz 烫金品牌黑色试尝杯
     3oz 烫金品牌白色试尝杯
     500ml 黑色Logo水瓶
     500ml 白色Logo水瓶
----[臻选产品]----
     12oz 纯黑/古铜亮面品牌桌面杯
     16oz 香槟金品牌不锈钢桌面杯
     500ml 金色Logo水瓶
     9oz 臻选玻璃杯

可以看到将所有具体产品全部获取,并且按照大类进行了分割。

6、使用lxml获取所有商品名

如果不使用html解析器,使用lxml解析器,那么其代码实现很简单,但是公式编写需要我们进一步思考,代码如下:

# 3、使用lxml获取所有产品
soup2 = BeautifulSoup(html_content, 'lxml')
name_list = soup2.select('ul[class="grid padded-3 product"] strong')
print("【星巴克产品细则】:")
for name in name_list:
    print(name.get_text())

小伙伴们可以思考一下为什么这么写,并且区别lxml解析器和html解析器在那些场景下哪个比较好用。

以上实验实例的完整代码:

# _*_ coding : utf-8
# @Time : 2023-08-27 10:32
# @Author :光仔December
# @File : python获取星巴克产品信息
# @Project :Python基础

from bs4 import BeautifulSoup
import urllib.request

# 下面模拟浏览器向服务器发送请求
# 发送HTTP GET请求
response = urllib.request.urlopen('https://www.starbucks.com.cn/menu/')
html_content = response.read().decode()
# print(html_content)

# 创建BeautifulSoup对象,并制定解析器(此处使用默认的html.parser)
soup = BeautifulSoup(html_content, 'html.parser')

# 1、获取所有的产品大类
captions = soup.find_all('h3', class_="caption")
print("星巴克产品大类:")
for cap in captions:
    print(cap.text)

# 2、获取所有产品信息
# 获取所有class为grid padded-3 product的ul节点
menus_uls = soup.find_all('ul', class_="grid padded-3 product")
print("【星巴克产品细则】:")
for menus_ul in menus_uls:
    # 获取ul下的所有li节点
    menus_lis = menus_ul.find_all('li')
    # 网页上有空节点,要判定一下才能获取下一步数据
    if len(menus_lis) > 0:
        # 获取ul节点下唯一一个h3的文字,就是产品大类
        print("----[" + menus_ul.h3.text + "]----")
        for menus_li in menus_lis:
            # 获取每一个li里面的a标签内的strong标签的文字,就是具体产品名
            print("    ", menus_li.a.strong.text)

# 3、使用lxml获取所有产品
soup2 = BeautifulSoup(html_content, 'lxml')
name_list = soup2.select('ul[class="grid padded-3 product"] strong')
print("【星巴克产品细则】:")
for name in name_list:
    print(name.get_text())

以上就是使用bs4对星巴克产品信息进行抓取的实现过程。至此我们对bs4的讲解全部结束,下一篇我们将开始学习selenium技术。

参考:尚硅谷Python爬虫教程小白零基础速通教学视频
转载请注明出处:https://guangzai.blog.csdn.net/article/details/132521673

你可能感兴趣的:(Python从入门到进阶,python,爬虫,urllib,bs4,beautifulsoup)