爬虫+数据保存

爬虫以及数据保存

这篇文章, 分享如何将爬虫爬到的数据, 保存到excel表格当中。

文章目录

1.安装保存数据的第三方库openpyxl并使用

2.爬虫加单表数据保存

3.爬虫加多表数据保存

4.实战

一、安装保存数据的第三方库openpyxl并使用

我们需要安装openpyxl的第三方库

安装命令:

pip install openpyxl

安装成功后我们就可以使用了。

我们导入第三方库:

import openpyxl

创建对象 工作簿:

wb = openpyxl.Workbook()

选择工作子表(选择第一个工作子表)

ws = wb.active

修改工作子表的名字:

ws.title = '测试子表'

添加数据 执行一次append就是添加一行数据:

ws.append(['姓名','性别','年龄'])

注意:列表中的每一个数据对应的是表格中的一个单元格内容。

从第二行开始添加详细数据(因为刚才已经添加过一行了):

ws.append(['小1','女',18])
ws.append(['小2','男',18])
ws.append(['小嘿','女',20])
ws.append(['xoap','女',18])

这里我们添加了四行数据。

生成文件保存数据, 方法是工作簿对象.save(‘文件的路径’):

wb.save('学生表.xlsx')

完整代码:

# 创建对象 工作簿
import openpyxl
wb = openpyxl.Workbook()
# 选择工作子表(第一个)
ws = wb.active
# 修改工作子表的名字
ws.title = '测试子表'
# 添加数据 执行一次append就是添加一行数据
ws.append(['姓名','性别','年龄']) # 列表中的每一个数据对应的是表格中的一个单元格内容# 第二行开始添加详细数据
ws.append(['小1','女',18])
ws.append(['小2','男',18])
ws.append(['小嘿','女',20])
ws.append(['xoap','女',18])# 生成文件保存数据
# wb.save('文件的路径')
wb.save('学生表.xlsx')

运行结果:

在用一个文件夹下面, 多出了一个叫学生表.xslx的excel表格。这张表格, 就是我们刚刚用代码去创建的的表格。

在这里插入图片描述

同时, 我们打开表格来看一看数据:

在这里插入图片描述

我们发现信息成功的写入表格, 最下面那个测试子表, 就是对应 ws.title = ‘测试子表’ 这行代码。表格标题和表格里面的内容, 都是用append方法去添加的,注意, 这里append的方法, 只会增加固定的行, 比如我在第三个append里面修改要添加的数据, 把ws.append([‘小2’,‘男’,18])改为ws.append([‘小22’,‘男’,19]), 运行过后, 表格里面的第三行数据, 会发生变化, 它不会因改变信息而添加数据, 只会覆盖第三行的数据。如果想要追加数据, 那就必须写更多的append函数去追加数据。

我们还有一种方式去创建excel表格并且保存数据(这种方法, 适合创建多张excel表格, 并且同时保存多张excel表格数据)。

代码:

import openpyxl
wb = openpyxl.Workbook()
list_name = ["小明", "小红", "小强", "小慧", "小蓝"]
list_gender = ["男", "女", "男", "女", "男"]
list_age = [20, 19, 21, 19, 19]
for i in range(100):# 创建新的子表sheet = wb.create_sheet(title=f'第{i}张表格')# 添加表头sheet.append(["姓名", "性别", "年龄"])for i in range(5):sheet.append([list_name[i], list_gender[i], list_age[i]])
# 删除第一个默认的子表
wb.remove(wb.active)
# 保存表格
wb.save('全部球员数据.xlsx')

结果:

在这里插入图片描述

利用sheet = wb.create_sheet(title=f’第{i}张表格’)这行代码, 创建excel表格

二、爬虫加单表数据保存

我们看一个案例:

我们打开nba官网, url是https://china.nba.cn/statistics/index.html

找到数据里面的球员数据.

我们需要爬取表格里面的信息, 有球员姓名, 球队, 比赛场次, 出场时间, 得分, 篮板, 助攻, 抢新, 盖帽, 投篮命中率, 三分命中数, 三分命中率, 罚球命中率这么些信息。

我们打开开发者工具, 找到数据的相应请求:

在这里插入图片描述

将请求数据的对应的url复制下来:https://api.nba.cn/sib/v2/league/playerstats?app_key=tiKB2tNdncnZFPOi&app_version=1.1.0&channel=NBA&conference=All&device_id=6d02def8348ce928cca4cfa777ee6a4e&individual=All&install_id=799163069&network=N%2FA&os_type=3&os_version=1.0.0&page_no=1&page_size=50&position=All&scope=team&season=2023&seasonType=4&sign=sign_v2&sign2=076D913573642C47DDFC1D2F2A0E4910046862A35D8D4AFC8FC05BB2B73466C0&t=1723805890324&total=perGame

代码:

import requestsurl = 'https://api.nba.cn/sib/v2/league/playerstats?app_key=tiKB2tNdncnZFPOi&app_version=1.1.0&channel=NBA&conference=All&device_id=6d02def8348ce928cca4cfa777ee6a4e&individual=All&install_id=799163069&network=N%2FA&os_type=3&os_version=1.0.0&page_no=1&page_size=50&position=All&scope=team&season=2023&seasonType=4&sign=sign_v2&sign2=076D913573642C47DDFC1D2F2A0E4910046862A35D8D4AFC8FC05BB2B73466C0&t=1723805890324&total=perGame'
res = requests.get(url, headers=headers)
res_data = res.json()
#     数据解析
for i in res_data['data']['player']['Data']:# 姓名name = i['Player']['displayName']# 球队名team = i['Team']['name']# 比赛场次games = i['Games']# 出场时间minspg = i['Minspg']# 得分pointspg = i['Pointspg']# 篮板rebspg = i['Rebspg']# 助攻assistspg = i['Assistspg']# 抢断stealspg = i['Stealspg']# 盖帽offrebspg = i['Offrebspg']# 投篮命中率fgpct = f'{i["Fgpct"]}%'# 三分命中数rebs = i['Rebs']# 三分命中率tppct = f'{i["Tppct"]}%'# 罚球命中率ftpct = f'{i["Ftpct"]}%'print(name,team,games,minspg,pointspg,rebspg,assistspg,stealspg,offrebspg,fgpct,rebs,tppct,ftpct)

结果:

在这里插入图片描述

报错了, 说明在url里面有参数有误, 导致请求不成功。

唉, 我们不是把headers请求头都加了么, 怎么还是获取不到数据呢?

这里我们需要注意, 有个参数t, 这个里面的参数代表时间戳, 没有拿到正确响应的原因, 就是因为时间戳的问题, 这个就是典型的网站反爬机制, 需要把时间戳的值对上号才能获取到数据。

解决办法:

python中有个获取时间戳的库:

import time
print("获取时间戳:", int(time.time()))

那我们需要把int(time.time())传入到url里面的t参数。

修改过后的代码:

import requests
import timeurl = f'https://api.nba.cn/sib/v2/league/playerstats?app_key=tiKB2tNdncnZFPOi&app_version=1.1.0&channel=NBA&conference=All&device_id=6d02def8348ce928cca4cfa777ee6a4e&individual=All&install_id=799163069&network=N%2FA&os_type=3&os_version=1.0.0&page_no=1&page_size=50&position=All&scope=team&season=2023&seasonType=4&sign=sign_v2&sign2=076D913573642C47DDFC1D2F2A0E4910046862A35D8D4AFC8FC05BB2B73466C0&t={int(time.time())}&total=perGame'
res = requests.get(url, headers=headers)
res_data = res.json()
#     数据解析
for i in res_data['data']['player']['Data']:# 姓名name = i['Player']['displayName']# 球队名team = i['Team']['name']# 比赛场次games = i['Games']# 出场时间minspg = i['Minspg']# 得分pointspg = i['Pointspg']# 篮板rebspg = i['Rebspg']# 助攻assistspg = i['Assistspg']# 抢断stealspg = i['Stealspg']# 盖帽offrebspg = i['Offrebspg']# 投篮命中率fgpct = f'{i["Fgpct"]}%'# 三分命中数rebs = i['Rebs']# 三分命中率tppct = f'{i["Tppct"]}%'# 罚球命中率ftpct = f'{i["Ftpct"]}%'print(name,team,games,minspg,pointspg,rebspg,assistspg,stealspg,offrebspg,fgpct,rebs,tppct,ftpct)

代码优化:

增加一个分页爬虫的功能并且保存数据到excel。

'''
前面几次测试可以得到正常的响应数据突然得不到,加上了伪装还发现分页参数有变化,时间戳变化通过测试,更改时间戳,数据可以正常返回验证当前拿不到正确响应的原因:时间戳的问题'''
import time# print(res_data)
# {'data':{'player':{'Data':[]}}}
# 创建工作表的代码
import openpyxl
import requests
wb = openpyxl.Workbook()
sheet = wb.active
sheet.title = '球队数据'
# 表头
sheet.append(['姓名','球队名','比赛场次','出场时间','得分','篮板','助攻','抢断','盖帽','投篮命中率','三分命中数','三分命中率','罚球命中率'])
# 加入分页 不能确定次数,因为年份不同,总页数不一样
page = 1
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'}
while True:url = f'https://api.nba.cn/sib/v2/league/playerstats?app_key=tiKB2tNdncnZFPOi&app_version=1.1.0&channel=NBA&conference=All&device_id=6d02def8348ce928cca4cfa777ee6a4e&individual=All&install_id=799163069&network=N%2FA&os_type=3&os_version=1.0.0&page_no={page}&page_size=50&position=All&scope=team&season=2023&seasonType=4&sign=sign_v2&sign2=076D913573642C47DDFC1D2F2A0E4910046862A35D8D4AFC8FC05BB2B73466C0&t={int(time.time())}&total=perGame'res = requests.get(url, headers=headers)res_data = res.json()#     结束循环的代码 如果Data对应的列表为[] 代表没有数据了# {'Data':[{},{}]}# {'Data':[]}if len(res_data['data']['player']['Data']) == 0:break#     数据解析for i in res_data['data']['player']['Data']:# 姓名name = i['Player']['displayName']# 球队名team = i['Team']['name']# 比赛场次games = i['Games']# 出场时间minspg = i['Minspg']# 得分pointspg = i['Pointspg']# 篮板rebspg = i['Rebspg']# 助攻assistspg = i['Assistspg']# 抢断stealspg = i['Stealspg']# 盖帽offrebspg = i['Offrebspg']# 投篮命中率fgpct = f'{i["Fgpct"]}%'# 三分命中数rebs = i['Rebs']# 三分命中率tppct = f'{i["Tppct"]}%'# 罚球命中率ftpct = f'{i["Ftpct"]}%'print(name,team,games,minspg,pointspg,rebspg,assistspg,stealspg,offrebspg,fgpct,rebs,tppct,ftpct)sheet.append([name,team,games,minspg,pointspg,rebspg,assistspg,stealspg,offrebspg,fgpct,rebs,tppct,ftpct])print(f'第{page}页数据已经全部获取完毕')page += 1# 保存表格
wb.save('aaa/球队数据.xlsx')

结果:

在这里插入图片描述
在这里插入图片描述

三、爬虫加多表数据保存

还是用刚才的nba球员的数据, 这次我们不仅仅实现分页爬虫加上保存数据, 我们在这里需要爬取不同年份里面的所有的nba球员所有的数据并保存, 以年份为准保存每一年的nba球员的数据。

url关键会变化的参数:

年份参数: year, 分页参数: page, 时间戳参数: t。

代码:

import time
import datetime'''
一个年份对应一个子表
'''import openpyxl
import requests
wb = openpyxl.Workbook()# 加入分页 不能确定次数,因为年份不同,总页数不一样headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'}
year_now = datetime.datetime.now().year
for year in range(1996,year_now):page = 1 # 根据年份重置分页的起始# 创建子表要放入到年份循环的代码中# 因为文件是按照年份进行划分子表# 创建新的子表sheet = wb.create_sheet(title=f'{year}年球员数据')# 表头sheet.append(['姓名', '球队名', '比赛场次', '出场时间', '得分', '篮板', '助攻', '抢断', '盖帽', '投篮命中率', '三分命中数', '三分命中率', '罚球命中率'])while True:# 休眠time.sleep(0.5)url = f'https://api.nba.cn/sib/v2/league/playerstats?app_key=tiKB2tNdncnZFPOi&app_version=1.1.0&channel=NBA&conference=All&device_id=6d02def8348ce928cca4cfa777ee6a4e&individual=All&install_id=799163069&network=N%2FA&os_type=3&os_version=1.0.0&page_no={page}&page_size=50&position=All&scope=team&season={year}&seasonType=4&sign=sign_v2&sign2=076D913573642C47DDFC1D2F2A0E4910046862A35D8D4AFC8FC05BB2B73466C0&t={int(time.time())}&total=perGame'res = requests.get(url, headers=headers)res_data = res.json()#     结束循环的代码 如果Data对应的列表为[] 代表没有数据了# {'Data':[{},{}]}# {'Data':[]}if len(res_data['data']['player']['Data']) == 0:break#     数据解析for i in res_data['data']['player']['Data']:# 姓名name = i['Player']['displayName']# 球队名try:team = i['Team']['name']except:team = ''# 比赛场次games = i['Games']# 出场时间minspg = i['Minspg']# 得分pointspg = i['Pointspg']# 篮板rebspg = i['Rebspg']# 助攻assistspg = i['Assistspg']# 抢断stealspg = i['Stealspg']# 盖帽offrebspg = i['Offrebspg']# 投篮命中率fgpct = f'{i["Fgpct"]}%'# 三分命中数rebs = i['Rebs']# 三分命中率tppct = f'{i["Tppct"]}%'# 罚球命中率ftpct = f'{i["Ftpct"]}%'print(name,team,games,minspg,pointspg,rebspg,assistspg,stealspg,offrebspg,fgpct,rebs,tppct,ftpct)sheet.append([name,team,games,minspg,pointspg,rebspg,assistspg,stealspg,offrebspg,fgpct,rebs,tppct,ftpct])print(f'第{year}年的{page}页数据已经全部获取完毕')page += 1# 删除第一个默认的子表
wb.remove(wb.active)
# 保存表格
wb.save('全部球员数据.xlsx')

year_now = datetime.datetime.now().year这行代码指的是获取当前的年份, 当前的年份是2024, 所以获取到的值的2024。而我们在nba网站上面看到的球员信息, 正好到2023年, 所以我们可以把这个数据放到循环里面去使用:for year in range(1996,year_now)。

运行完之后的结果:

在这里插入图片描述
在这里插入图片描述

在最下面, 有很多张表格, 分别保存着每一年的球员数据。

四、实战

我们打开网站:

在这里插入图片描述

url是https://bgm.tv/anime/browser?sort=rank

要求: 我们需要爬取动画的标题, 动画信息, 评分这三个信息, 同样需要分页查询, 将数据保存到同一张表格当中, 并将表格命名为动漫数据大全, 将excel文件命名为动漫信息, 文件以xlsx为后缀。

先不要马上看答案, 尝试自己去做一做哦。




参考答案:

import requests
from bs4 import BeautifulSoup
import openpyxlpage = 1
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
}
wb = openpyxl.Workbook()
sheet1 = wb.active
sheet1.title = "动漫数据大全"
sheet1.append(["标题", "动漫基本信息", "动漫评分"])
while True:url = f"https://bgm.tv/anime/browser?sort=rank&page={page}"res = requests.get(url, headers=headers)res.encoding = 'utf-8'soup = BeautifulSoup(res.text, "lxml")section = soup.select(".section>ul>li")if len(section) == 0:breakelse:for item in section:# 标题title = item.select("div>h3>a")[0].text# 动漫基本信息info = item.select("div>p")[0].text.replace('\n', ' ')# 动漫评分rating = item.select("div>.rateInfo>.fade")[0].textprint("标题:", title, "\t动漫基本信息:", info, "\t动漫评分:", rating)sheet1.append([title, info, rating])print(f"第{page}页的数据已爬完")page += 1
wb.save('动漫信息.xlsx')

结果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

这道实战题, 你写出来了吗? 如果写出来的话, 给自己鼓掌哦👏

以上就是爬虫以及数据保存的所有内容了, 如果有哪里不懂的地方,可以把问题打在评论区, 欢迎大家在评论区交流!!!
如果我有写错的地方, 望大家指正, 也可以联系我, 让我们一起努力, 继续不断的进步.
学习是个漫长的过程, 需要我们不断的去学习并掌握消化知识点, 有不懂或概念模糊不理解的情况下,一定要赶紧的解决问题, 否则问题只会越来越多, 漏洞也就越老越大.
人生路漫漫, 白鹭常相伴!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt第十三天:网络编程:TCP和UDP的使用

我发现了有些人喜欢静静看博客不聊天呐, 但是ta会点赞。 这样的人呢帅气低调有内涵, 美丽大方很优雅。 说的就是你, 不用再怀疑哦 ❤️TCP: 一、创建项目,命名为Server,继承QWidget 二、添加Qt设计师…

CentOS7安装RabbitMQ-3.13.7、修改端口号

本文安装版本: Erlang:26.0 官网下载地址 Erlang RabbitMQ:3.13.7 官网下载地址 RabbitMQ RabbitMQ和Erlang对应关系查看:https://www.rabbitmq.com/which-erlang.html 注:安装erlang之前先安装下依赖文件&#xff0…

云黑系统全解无后门 +搭建教程

这套系统呢是玖逸之前南逸写的一套云黑系统,功能带有卡密生成和添加黑名单等,源码放在我的网盘里已经两年之久,由于玖逸现在已经跑路了所以现在发出来分享给大家,需要的可以自己拿去而开,反正功能也不是很多具体的自己…

Teledyne LeCroy:800G高速以太网一站式自动化测试解决方案(网络打流测试+物理层加压干扰+协议分析)

LinkExpert一站式测试解决方案 LinkExpert 是一款软件应用程序,可对Teledyne LeCroy的协议分析仪和训练器进行自动化硬件控制和管理。除了作为合规性、一致性和验证测试的便捷接口外,它还能轻松地将这些测试添加到自动回归测试流程中。 现在,…

WPF基础权限系统

一.开发环境 VisualStudio 2022NET SDK 8.0Prism 版本 8.1.97Sqlite 二. 功能介绍 WPF 基础权限系统,是一个支持前后端分离设计的 客户端(C/S)项目,该示例项目前端xaml使用UI库 ,Material Design Themes UI 来构建用户界面,确保…

C# -- Abstract、Virtual、interface

一、Virtual方法(虚方法) 1)virtual 关键字用于在基类(父类)中修饰方法 2)基类中定义了virtual方法,派生类中使用override重写该方法 二、Abstract方法(抽象方法) 1&…

【ssh】Mac 使用 ssh 连接阿里云报错:Connection reset by 8.155.1.xxx port 22

Mac 使用 ssh 连接阿里云报错:Connection reset by 8.155.1.xxx port 22 问题描述解决办法 问题描述 Connection reset by 8.155.1.xxx port 22解决办法 关掉代理 VPN

CTFHUB技能树之XSS——存储型

开启靶场&#xff0c;打开链接&#xff1a; 发现地址栏中的URL没有GET传参&#xff0c;而且这次是“Hello&#xff0c;no name” 还是跟反射型一样的流程&#xff1a; 先注入一下看看&#xff1a; <script>alert(1)</script> 但界面的结果还是“Hello&#xff0c…

【网络协议】之 HTTP 协议详解

HTTP 协议是 Web 的基石&#xff0c;它定义了客户端和服务器之间的通信规则。本文将深入地探讨 HTTP 的核心概念&#xff0c;包括工作原理、请求方法、状态码以及不同 HTTP 版本的演进。 一、HTTP 的工作原理 HTTP 协议基于客户端-服务器模型&#xff0c;遵循请求-响应的循环&…

FineReport 计算同比增长

1、数据库查询 SELECTt1.年,t1.月,t1.总金额 AS 同期金额,t1.仓库名称,t2.总金额 AS 上期金额 FROMtest t1LEFT JOIN test t2 ON ( t1.年 t2.年 1 ) AND t1.月 t2.月 AND t1.仓库名称 t2.仓库名称2、配置字段 月份字段加后缀 月 数据列加后缀 计算同比增长率 if(LEN(B3)0 …

2024年五一杯数学建模C题煤矿深部开采冲击地压危险预测求解全过程论文及程序

2024年五一杯数学建模 C题 煤矿深部开采冲击地压危险预测 原题再现&#xff1a; “煤炭是中国的主要能源和重要的工业原料。然而&#xff0c;随着开采深度的增加&#xff0c;地应力增大&#xff0c;井下煤岩动力灾害风险越来越大&#xff0c;严重影响着煤矿的安全高效开采。在…

VScode背景更改

效果 实现方法 第0步 以管理员身份运行VScode 首先 需要安装这个扩展 然后 接下来 找到配置文件 再后来 在配置文件的下面但不超过最后一个大括号的地方加入以下内容 "update.enableWindowsBackgroundUpdates": true,"background.fullscreen": {…

Nature 正刊丨群体爆发中的神经元序列在人类皮层中编码信息

01摘要 传统上&#xff0c;神经编码是通过对不同刺激的放电率和潜伏期的变化来检查的1,2,3,4,5。然而&#xff0c;神经元群体也可能表现出短暂的尖峰活动爆发&#xff0c;其中神经元以特定的时间顺序或序列放电6,7,8。人脑可以利用群体爆发中的这些神经元序列来有效地表示信息…

React中的useState和useEffect解析

一、组件状态管理——useState 1.定义 useState 是一个 React Hook&#xff08;函数&#xff09;&#xff0c;它允许我们向组件添加一个状态变量&#xff0c;从而控制影响组件的渲染结果 和普通JS变量不同的是&#xff0c;状态变量一旦发生变化组件的视图UI也会跟着变化&…

力扣 中等 82.删除排序链表中的重复元素 II

文章目录 题目介绍题解 题目介绍 题解 只需在83题基础上加一个while循环即可 class Solution {public ListNode deleteDuplicates(ListNode head) {ListNode dummy new ListNode(101, head);ListNode cur dummy;while (cur.next ! null && cur.next.next ! null) {…

汇编程序设计

文章目录 语句类型语句格式指令助记符操作数常量变量和符号运算符算数运算符逻辑运算符关系运算符分析运算符综合运算符优先级 伪指令数据定义伪指令符号定义伪指令标号定义伪指令&#xff1f;段定义伪指令段寻址伪指令过程定义伪指令程序计数器和定位伪指令&#xff1f;宏定义…

诺贝尔物理学奖与机器学习、神经网络:一场跨时代的融合与展望

诺贝尔物理学奖与机器学习、神经网络&#xff1a;一场跨时代的融合与展望 机器学习与神经网络的崛起 机器学习与神经网络的发展前景 机器学习和神经网络的研究与传统物理学的关系 总结 2024年&#xff0c;诺贝尔物理学奖颁给了机器学习与神经网络&#xff0c;这一具有里程碑…

一些关于FMEA在供应链风险管理中的实际应用案例_SunFMEA

【大家好&#xff0c;我是唐Sun&#xff0c;唐Sun的唐&#xff0c;唐Sun的Sun。一站式数智工厂解决方案服务商】 FMEA&#xff08;失效模式与影响分析&#xff09;在供应链风险管理中的实际应用案例&#xff1a; 案例一&#xff1a;某电子制造企业 该企业在生产一款新型智能手…

4 -《本地部署开源大模型》在Ubuntu 22.04系统下部署运行ChatGLM3-6B模型

在Ubuntu 22.04系统下部署运行ChatGLM3-6B模型 大模型部署整体来看并不复杂&#xff0c;且官方一般都会提供标准的模型部署流程&#xff0c;但很多人在部署过程中会遇到各种各样的问题&#xff0c;很难成功部署&#xff0c;主要是因为这个过程会涉及非常多依赖库的安装和更新及…

Spark安装

Downloads | Apache Spark 拖动安装包 上传虚拟机 # 解压锁环境就安装好能使用 tar -zxvf spark-3.3.1-bin-hadoop3.tgz# 修改文件名称 mv spark-3.3.1-bin-hadoop3 spark-local 1.Local模式 测试案例&#xff1a;计算圆周率π # Usage: spark-submit [options] <app ja…