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

news2024/11/17 1:50:47

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

一、星巴克网站介绍


星巴克官网是星巴克公司的官方网站,用于提供关于星巴克咖啡店的信息和服务。在星巴克官网上,可以找到各种有关咖啡、茶饮、糕点和其他食品的详细描述和营养信息。此外,官网还提供星巴克的最新消息、特别活动、促销优惠和公司资讯。

二、产品界面分析


星巴克官网中国地区地址:https://www.starbucks.com.cn/
我们本次要抓取的是星巴克的产品界面,我们点击首页左上角的“菜单”按钮,在右侧就可以看到星巴克所有的产品:

此时我们按F12打开浏览器的开发者模式,清除NetWork区域,重新点击菜单按钮或刷新菜单界面,可以看到其中获取菜单界面的后台服务地址:

其实就是菜单地址:https://www.starbucks.com.cn/menu/,它不是一个异步的服务,而是直接返回一个渲染好的html
我们仔细阅读一下获取到的HTML代码,将有关产品的部分单独拉出来,分析其结构(这里选择了“咖啡融合冰淇淋”这一部分的html代码):

<div class='wrapper fluid margin page-menu-list'>

    <ul class='grid padded-3 product'>
        <li>
            <a id='menu-product-related-affogato' href='/menu/beverages/coffee-plus-ice-cream/'
               class='thumbnail'>

                <div class='preview circle'
                     style='background-image: url("/images/products/affogato.jpg")'></div>
                <strong>阿馥奇朵™</strong>

            </a>

        </li>

        <li>
            <a id='menu-product-related-cold-brew-malt' href='/menu/beverages/coffee-plus-ice-cream/'
               class='thumbnail'>

                <div class='preview circle'
                     style='background-image: url("/images/products/cold-brew-malt.jpg")'></div>
                <strong>麦芽雪冷萃™</strong>

            </a>
        </li>

        <li>
            <a id='menu-product-related-cold-brew-float' href='/menu/beverages/coffee-plus-ice-cream/'
               class='thumbnail'>

                <div class='preview circle'
                     style='background-image: url("/images/products/cold-brew-float.jpg")'></div>
                <strong>冷萃浮乐朵™</strong>

            </a>
        </li>

        <li>
            <a id='menu-product-related-nitro-cold-brew-float' href='/menu/beverages/coffee-plus-ice-cream/'
               class='thumbnail'>

                <div class='preview circle'
                     style='background-image: url("/images/products/instore-nitro-cold-brew-float.jpg")'></div>
                <strong>气致™冷萃浮乐朵™</strong>

            </a>
        </li>

        <h3 class='caption'>咖啡融合冰淇淋</h3>
    </ul>
    <hr/>
<!-- 后面的代码比较长,这里先省略...... -->

我们可以看到,整个产品区域是由一个div包裹的,这个div包含一个名为“page-menu-list”的css样式,然后其中的产品全部是由<ul><li></li></ul>包裹,ul的id为“grid padded-3 product”。其中的具体的产品在里面用<a>标签包裹,而a标签的id包含“menu-product-”的字样,里面的<strong>标签包裹的就是我们需要获取的产品名称。而class为“caption”的h3标签,包裹的是该种产品的分类。

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

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

分析了这些,足以让我们思考如何试用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代码:

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)

结果:

可以看到星巴克商品的所有大类已经获取到。

5、获取所有产品名称

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/935035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

收费文章怎么复制

1.复制这篇文章发现收费 2.电脑登录一个qq&#xff0c;截图找到这个屏幕视图 3.右边这个文字可以复制 4.这个只能识别一段一段复制

网卡重启,导致docker容器暴露端口都无法对外开放

公司内部网络ip冲突&#xff0c;重新分配了某个范围的ip后&#xff0c;修改网络信息&#xff08;位于/etc/sysconfig/network-scripts目录下对应网卡&#xff09;后&#xff0c;重启网卡&#xff08;systemctl restart network&#xff09;&#xff1b;后面导致docker容器暴露的…

计算机网络-笔记-第三章-数据链路层

目录 三、第三章——数据链路层 1、数据链路层概述&#xff08;帧&#xff09; &#xff08;1&#xff09;封装成帧、差错检测、可靠传输&#xff08;简单介绍&#xff09; &#xff08;2&#xff09;CSMA/CD 2、封装成帧 &#xff08;1&#xff09;透明传输&#xff08;…

JVM虚拟机:定位对象的两种方式

定位对象的方式 1、句柄池 2、直接指针 ‘句柄池 直接指针 在Java中&#xff0c;可以使用两种方式来定位对象&#xff1a;句柄池和直接指针。 1. 句柄池&#xff1a;在Java的句柄池模型中&#xff0c;Java虚拟机&#xff08;JVM&#xff09;会为每个对象创建一个句柄&#xff…

2022 ICPC 南京 M Drain the Water Tank(叉积 + 思维)

2022 ICPC 南京 M. Drain the Water Tank(叉积 思维) Problem - M - Codeforces 大意&#xff1a;给一个多边形 &#xff0c;多边形充满水 &#xff0c; 点集逆时针给出 &#xff0c; 求最少的出水阀门的数量使得水可以全部流出。 思路&#xff1a;通过画图发现 &#xff0…

vector VS deque

1. vector与deque vector与动态数组相同&#xff0c;能够在插入或删除元素时自动调整自身大小&#xff0c;其存储由容器自动处理&#xff0c;vector通常占用多于静态数组的空间&#xff0c;因为要分配更多的内存以管理将来的增长&#xff0c;在每次插入元素的时&#xff0c;仅…

红外与可见光图像融合入门教学

红外与可见光图像融合入门教学 什么是红外与可见光图像融合论文DeepFuseDenseFuseRFN-NestFusionGANDDcGANAttentionFGANGANMcC 总结 博主目前马上进入研二阶段&#xff0c;也算是入门了红外与可将光图像领域&#xff0c;正好总结下&#xff0c;以供刚接触该领域的萌新们参考。…

ADC模块之HX711

今天&#xff0c;回顾了HX711模数转换模块&#xff0c;HX711模块经常用于电子秤的设计。 模数转换模块的输入有三种&#xff08;HX711的输入为差分输入&#xff09;&#xff1a; HX711的驱动程序 #include "HX711.h"//********************************************…

自考《00058 市场营销学》2023年4月历年真题答案

自考科目列表,自考本科,题库,自学考试,历年真题。 1.某汽车制造商宣称“我们的汽车唯一的缺点就是生产得不够快”,该公司秉持的营销哲学是 A.产品导向 B.推销导向 C.顾客导向 D.生产导向 2.LM公司故意不履行和中间商合同约定的相关义务&#xff0c;不按时支付供货商的货款&…

Java入职第十一天,深入了解静态代理和动态代理(jdk、cglib)

一、代理模式 一个类代表另一个类去完成扩展功能,在主体类的基础上,新增一个代理类,扩展主体类功能,不影响主体,完成额外功能。比如买车票,可以去代理点买,不用去火车站,主要包括静态代理和动态代理两种模式。 代理类中包含了主体类 二、静态代理 无法根据业务扩展,…

火山引擎 DataLeap:从短视频 APP 实践看如何统一数据指标口径

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 短视频正在成为越来越多人发现世界的窗口&#xff0c;其背后的创作者生态建设是各大短视频 APP 不可忽视的重要组成部分。 为了激励更多优质内容生产&#xff0c;某…

下一代存储解决方案:湖仓一体

文章首发地址 湖仓一体是将数据湖和数据仓库相结合的一种数据架构&#xff0c;它可以同时满足大数据存储和传统数据仓库的需求。具体来说&#xff0c;湖仓一体可以实现以下几个方面的功能&#xff1a; 数据集成&#xff1a; 湖仓一体可以集成多个数据源&#xff0c;包括结构…

exe打包工具(收录)

收录&#xff1a; Advanced Installation静默安装包的制作方法 Advanced Installer打包exe安装包教程 Advanced Installer使用指南 advanced installer 使用常见问题整理 exe打包工具&#xff1a;advanced installer介绍

使用飞桨实现的第一个AI项目——波士顿的房价预测

part1.首先引入相应的函数库: 值得说明的地方&#xff1a; &#xff08;1&#xff09;首先&#xff0c;numpy是一个python库&#xff0c;主要用于提供线性代数中的矩阵或者多维数组的运算函数&#xff0c;利用import numpy as np引入numpy&#xff0c;并将np作为它的别名 part…

这可能是你看过最详细的 [八大排序算法]

排序算法 前置知识 [排序稳定性]一、直接插入排序二、希尔排序三、直接选择排序四、堆排序五、冒泡排序六、快速排序七、归并排序八、计数排序&#xff08;非比较排序&#xff09;排序复杂度和稳定性总结 前置知识 [排序稳定性] 假定在待排序的记录序列中&#xff0c;存在多个…

Docker 将容器打包成镜像推送镜像到仓库

Docker 将容器打包成镜像&推送镜像到仓库 一、将容器打包成镜像 $ docker commit <容器ID> <镜像名称:标签>示例&#xff1a; $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS …

FreeSWITCH 1.10.10 简单图形化界面5 - 使用百度TTS

FreeSWITCH 1.10.10 简单图形化界面5 - 使用百度TTS 0、 界面预览1、注册百度AI开放平台&#xff0c;开通语音识别服务2、获取AppID/API Key/Secret Key3、 安装百度语音合成sdk4、合成代码5、在PBX中使用百度TTS6、音乐文件-TTS7、拨号规则-tts_command 0、 界面预览 http://…

JVM第一篇 认识java虚拟机

目录 1. 什么是java虚拟机 2. java虚拟机分类 2.1. 商用虚拟机 2.2. 嵌入式虚拟机 3.java虚拟机架构 4.java虚拟机运行过程 1. 什么是java虚拟机 传统意义上的虚拟机是一种抽象化的计算机&#xff0c;通过在实际的计算机上仿真模拟各种计算机功能来实现的&#xff0c;是操…

Python在电路课程中的应用

1 需求 课程中有大量的计算&#xff0c;电路方程、复数计算&#xff0c;之前都是用的MATLAB online&#xff0c;可现在要过期了&#xff0c;只能更换平台。 2 工具 https://www.online-python.com/ Python3 在线工具 | 菜鸟工具 (runoob.com) 3 Sinusoid 章节 涉及到复数计…

AI绘图(11)stable diffusion 如何写好prompt四

在最开始我写了三篇关于prompt的&#xff0c;具体的大家可以跳转来去看&#xff0c;以下给出来链接&#xff1a; AI绘图&#xff08;3&#xff09;stable diffusion如何写好prompt 一_牧子川的博客-CSDN博客 AI绘图&#xff08;4&#xff09;stable diffusion如何写好prompt …