当前位置: 首页 > news >正文

豆瓣图书评分数据的可视化分析

亿牛云代理.jpg

导语

豆瓣是一个提供图书、电影、音乐等文化产品的社区平台,用户可以在上面发表自己的评价和评论,形成一个丰富的文化数据库。本文将介绍如何使用爬虫技术获取豆瓣图书的评分数据,并进行可视化分析,探索不同类型、不同年代、不同地区的图书的评分特征和规律。

概述

本文的主要步骤如下:

  • 使用scrapy框架编写爬虫程序,从豆瓣图书网站抓取图书的基本信息和评分数据,保存为csv格式的文件。
  • 使用亿牛云爬虫代理服务,提高爬虫效率和稳定性,避免被豆瓣网站屏蔽或封禁。
  • 使用pandas库对爬取的数据进行清洗和处理,提取出需要的字段和特征。
  • 使用matplotlib库对处理后的数据进行可视化分析,绘制各种类型的图表,展示不同维度的评分分布和关系。

正文

爬虫程序

首先,我们需要编写一个爬虫程序,从豆瓣图书网站抓取图书的基本信息和评分数据。我们使用scrapy框架来实现这个功能,scrapy是一个强大而灵活的爬虫框架,可以方便地定义爬虫规则和处理数据。我们需要定义一个Spider类,继承自scrapy.Spider类,并重写以下方法:

  • start_requests:该方法返回一个可迭代对象,包含了爬虫开始时要访问的请求对象。我们可以从豆瓣图书首页开始,获取所有分类的链接,并构造请求对象。
  • parse:该方法负责处理start_requests返回的请求对象的响应,并解析出需要的数据或者进一步的请求。我们可以使用scrapy自带的选择器或者BeautifulSoup等第三方库来解析HTML文档,提取出图书列表页的链接,并构造请求对象。
  • parse_book:该方法负责处理parse返回的请求对象的响应,并解析出图书详情页的数据。我们可以使用同样的方式来提取出图书的基本信息和评分数据,并将其保存为字典格式。
  • close:该方法在爬虫结束时被调用,我们可以在这里将抓取到的数据保存为csv格式的文件。

为了提高爬虫效率和稳定性,我们还需要使用亿牛云爬虫代理服务,该服务提供了大量高质量的代理IP地址,可以帮助我们避免被豆瓣网站屏蔽或封禁。我们只需要在settings.py文件中设置代理服务器的域名、端口、用户名和密码,以及启用中间件HttpProxyMiddleware即可。

首先配置爬虫代理,你可以按照以下步骤在Scrapy项目的settings.py文件中进行配置:
确保已经安装了Scrapy以及相关依赖。然后,打开你的Scrapy项目的settings.py文件,并添加以下配置:

# 启用HttpProxyMiddleware中间件
DOWNLOADER_MIDDLEWARES = {'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 1,
}# 设置亿牛云 爬虫代理服务器的配置
HTTPPROXY_AUTH_ENCODING = 'utf-8'  # 编码格式# 亿牛云 爬虫代理服务器的域名、端口、用户名和密码
HTTPPROXY_HOST = 'www.16yun.cn'
HTTPPROXY_PORT = 12345
HTTPPROXY_USER = '16YUN'
HTTPPROXY_PASS = '16IP'

以下是爬虫程序的代码:

# -*- coding: utf-8 -*-
import scrapy
import csvclass DoubanSpider(scrapy.Spider):name = 'douban'allowed_domains = ['book.douban.com']start_urls = ['https://book.douban.com/']# 定义保存数据的列表data = []def start_requests(self):# 从豆瓣图书首页开始yield scrapy.Request(url=self.start_urls[0], callback=self.parse)def parse(self, response):# 解析首页,获取所有分类的链接categories = response.xpath('//div[@class="article"]/div[@class="indent"]/table//a')for category in categories:# 构造分类页面的请求对象url = category.xpath('./@href').get()yield scrapy.Request(url=url, callback=self.parse_book)def parse_book(self, response):# 解析分类页面,获取图书列表books = response.xpath('//li[@class="subject-item"]')for book in books:# 构造图书详情页的请求对象url = book.xpath('./div[@class="info"]/h2/a/@href').get()yield scrapy.Request(url=url, callback=self.parse_detail)# 获取下一页的链接,如果存在则继续爬取next_page = response.xpath('//span[@class="next"]/a/@href')if next_page:url = next_page.get()yield scrapy.Request(url=url, callback=self.parse_book)def parse_detail(self, response):# 解析图书详情页,获取图书的基本信息和评分数据item = {}item['title'] = response.xpath('//h1/span/text()').get() # 标题item['author'] = response.xpath('//span[contains(text(),"作者")]/following-sibling::a/text()').get() # 作者item['publisher'] = response.xpath('//span[contains(text(),"出版社")]/following-sibling::text()').get() # 出版社item['pub_date'] = response.xpath('//span[contains(text(),"出版年")]/following-sibling::text()').get() # 出版年item['price'] = response.xpath('//span[contains(text(),"定价")]/following-sibling::text()').get() # 定价item['rating'] = response.xpath('//strong/text()').get() # 评分item['rating_num'] = response.xpath('//a[contains(@href,"rating")]/span/text()').get() # 评分人数item['tags'] = response.xpath('//div[@id="db-tags-section"]/div[@class="indent"]/span/a/text()').getall() # 标签# 将数据添加到列表中self.data.append(item)def close(self, spider, reason):# 爬虫结束时,将数据保存为csv格式的文件with open('douban_books.csv', 'w', encoding='utf-8', newline='') as f:writer = csv.DictWriter(f, fieldnames=self.data[0].keys())writer.writeheader()writer.writerows(self.data)

数据清洗和处理

接下来,我们需要对爬取的数据进行清洗和处理,提取出需要的字段和特征。我们使用pandas库来实现这个功能,pandas是一个强大而灵活的数据分析和处理库,可以方便地读取、操作和转换数据。我们需要做以下几个步骤:

  • 读取csv文件,将数据转换为DataFrame对象。
  • 去除空值和重复值,保证数据的完整性和唯一性。
  • 对部分字段进行类型转换,如将评分和评分人数转换为数值类型,将出版年转换为日期类型。
  • 对部分字段进行拆分或合并,如将作者拆分为中文作者和外文作者,将标签合并为一个字符串。
  • 对部分字段进行分组或分类,如根据评分区间划分为高分、中等、低分三类,根据出版年划分为不同的年代。

以下是数据清洗和处理的代码:

# -*- coding: utf-8 -*-
import pandas as pd# 读取csv文件,将数据转换为DataFrame对象
df = pd.read_csv('douban_books.csv')# 去除空值和重复值,保证数据的完整性和唯一性
df.dropna(inplace=True)
df.drop_duplicates(inplace=True)# 对部分字段进行类型转换,如将评分和评分人数转换为数值类型,将出版年转换为日期类型
df['rating'] = pd.to_numeric(df['rating'])
df['rating_num'] = pd.to_numeric(df['rating_num'])
df['pub_date'] = pd.to_datetime(df['pub_date'])# 对部分字段进行拆分或合并,如将作者拆分为中文作者和外文作者,将标签合并为一个字符串 
df[‘tags’] = df[‘tags’].apply(lambda x:,.join(x))# 对部分字段进行分组或分类,如根据评分区间划分为高分、中等、低分三类,根据出版年划分为不同的年代
df[‘rating_level’] = pd.cut(df[‘rating’], bins=[0, 7, 8.5, 10], labels=[‘低分’, ‘中等’, ‘高分’]) 
df[‘pub_year’] = df[‘pub_date’].dt.year 
df[‘pub_decade’] = (df[‘pub_year’] // 10) * 10
#数据清洗和处理完成,保存为新的csv文件
df.to_csv(‘douban_books_cleaned.csv’, index=False)

数据可视化分析

最后,我们需要对处理后的数据进行可视化分析,绘制各种类型的图表,展示不同维度的评分分布和关系。我们使用matplotlib库来实现这个功能,matplotlib是一个强大而灵活的数据可视化库,可以方便地创建各种风格和格式的图表。我们需要做以下几个步骤:

  • 导入matplotlib库,并设置中文显示和风格。
  • 读取清洗后的csv文件,将数据转换为DataFrame对象。
  • 使用matplotlib的子模块pyplot来绘制各种图表,如直方图、饼图、箱线图、散点图等。
  • 使用matplotlib的子模块axes来调整图表的标题、标签、刻度、图例等属性。
  • 使用matplotlib的子模块figure来保存图表为图片文件。

以下是数据可视化分析的代码:

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import pandas as pd# 导入matplotlib库,并设置中文显示和风格
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文显示
plt.rcParams['axes.unicode_minus'] = False # 设置负号显示
plt.style.use('ggplot') # 设置风格# 读取清洗后的csv文件,将数据转换为DataFrame对象
df = pd.read_csv('douban_books_cleaned.csv')# 绘制直方图,显示不同评分区间的图书数量
plt.figure(figsize=(8, 6)) # 设置画布大小
plt.hist(df['rating'], bins=20, color='steelblue', edgecolor='k') # 绘制直方图
plt.xlabel('评分') # 设置x轴标签
plt.ylabel('数量') # 设置y轴标签
plt.title('豆瓣图书评分直方图') # 设置标题
plt.savefig('rating_hist.png') # 保存图片# 绘制饼图,显示不同评分等级的图书占比
plt.figure(figsize=(8, 6)) # 设置画布大小
rating_level_counts = df['rating_level'].value_counts() # 计算不同评分等级的图书数量
plt.pie(rating_level_counts, labels=rating_level_counts.index, autopct='%.2f%%', colors=['limegreen', 'gold', 'tomato']) # 绘制饼图
plt.title('豆瓣图书评分等级饼图') # 设置标题
plt.savefig('rating_level_pie.png') # 保存图片# 绘制箱线图,显示不同年代的图书评分分布
plt.figure(figsize=(8, 6)) # 设置画布大小
decades = df['pub_decade'].unique() # 获取不同年代的列表
decades.sort() # 对年代进行排序
ratings_by_decade = [df[df['pub_decade'] == decade]['rating'] for decade in decades] # 获取每个年代对应的评分列表
plt.boxplot(ratings_by_decade, labels=decades) # 绘制箱线图
plt.xlabel('年代') # 设置x轴标签
plt.ylabel('评分') # 设置y轴标签
plt.title('豆瓣图书不同年代评分箱线图') # 设置标题
plt.savefig('rating_by_decade_box.png') # 保存图片# 绘制散点图,显示评分和评分人数的关系
plt.figure(figsize=(8, 6)) # 设置画布大小
plt.scatter(df['rating'], df['rating_num'], color='steelblue', alpha=0.5) # 绘制散点图
plt.xlabel('评分') # 设置x轴标签
plt.ylabel('评分人数') # 设置y轴标签
plt.title('豆瓣图书评分和评分人数散点图') # 设置标题
plt.savefig('rating_num_scatter.png') # 保存图片

结语

本文介绍了如何使用爬虫技术获取豆瓣图书的评分数据,并进行可视化分析,探索不同类型、不同年代、不同地区的图书的评分特征和规律。通过本文,我们可以学习到以下几点:

  • 如何使用scrapy框架编写爬虫程序,从豆瓣图书网站抓取图书的基本信息和评分数据,保存为csv格式的文件。
  • 如何使用亿牛云爬虫代理服务,提高爬虫效率和稳定性,避免被豆瓣网站屏蔽或封禁。
  • 如何使用pandas库对爬取的数据进行清洗和处理,提取出需要的字段和特征。
  • 如何使用matplotlib库对处理后的数据进行可视化分析,绘制各种类型的图表,展示不同维度的评分分布和关系。

希望本文能够对你有所帮助,如果你对爬虫技术或者数据可视化有兴趣,可以继续深入学习和探索。谢谢你的阅读!

相关文章:

豆瓣图书评分数据的可视化分析

导语 豆瓣是一个提供图书、电影、音乐等文化产品的社区平台,用户可以在上面发表自己的评价和评论,形成一个丰富的文化数据库。本文将介绍如何使用爬虫技术获取豆瓣图书的评分数据,并进行可视化分析,探索不同类型、不同年代、不同…...

SpringBoot整合Easy-ES操作演示文档

文章目录 SpringBoot整合Easy-ES操作演示文档1 概述及特性1.1 官网1.2 主要特性 2 整合配置2.1 导入POM2.2 Yaml配置2.3 EsMapperScan 注解扫描2.4 配置Entity2.5 配置Mapper 3 基础操作3.1 批量保存3.2 数据更新3.3 数据删除3.4 组合查询3.5 高亮查询3.6 统计查询 4 整合异常4…...

IDEA控制台取消悬浮全局配置SpringBoot配置https

IDEA控制台取消悬浮 idea 全局配置 SpringBoot(Tomcat) 配置https,同时支持http 利用JDK生成证书 keytool -genkey -alias httpsserver -keyalg RSA -keysize 2048 -keystore server.p12 -validity 3650配置类 Configuration public class TomcatConfig {Value(&quo…...

MySQL8--my.cnf配置文件的设置

原文网址:MySQL8--my.cfg配置文件的设置_IT利刃出鞘的博客-CSDN博客 简介 本文介绍MySQL8的my.cnf的配置。 典型配置 [client] default-character-setutf8mb4[mysql] default-character-setutf8mb4[mysqld] #服务端口号 默认3306 port3306datadir /work/docker…...

Qt基于paintEvent自定义CharView

Qt基于paintEvent自定义CharView 鼠标拖动&#xff0c;缩放&#xff0c;区域缩放&#xff0c; 针对x轴&#xff0c;直接上代码 charview.h #ifndef CHARVIEW_H #define CHARVIEW_H#include <QWidget> #include <QPainter> #include <QPaintEvent> #inclu…...

Mac FoneLab for Mac:轻松恢复iOS数据,专业工具助力生活

如果你曾经不小心删除了重要的iOS数据&#xff0c;或者因为各种原因丢失了这些数据&#xff0c;那么你一定知道这种痛苦。现在&#xff0c;有一个名为Mac FoneLab的Mac应用程序&#xff0c;它专门设计用于恢复iOS数据&#xff0c;这可能是你的救星。 Mac FoneLab for Mac是一种…...

代码随想录二刷day30

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、力扣332. 重新安排行程二、力扣51. N 皇后三、力扣37. 解数独 一、力扣332. 重新安排行程 class Solution {private LinkedList<String> res;private Li…...

工业检测 ocr

采用OpenCV和深度学习的钢印识别_菲斯奇的博客-CSDN博客采用OpenCV和深度学习的钢印识别[这个帖子标题党了很久&#xff0c;大概9月初立贴&#xff0c;本来以为比较好做&#xff0c;后来有事情耽搁了&#xff0c;直到现在才有了一些拿得出手的东西。肯定不会太监的。好&#xf…...

LVS负载均衡群集

这里写目录标题 LVS负载均衡群集一.集群cluster与分布式1.特点&#xff1a;2.类型1&#xff09;负载均衡群集 LB2&#xff09;高可用群集 HA3&#xff09;高性能运输群集 HPC 3.分布式1&#xff09;特点 二.LVS1.lvs的工作原理2.lvs的三种工作模式1&#xff09;NAT 地址转换2&a…...

安卓截屏;前台服务

private var mediaProjectionManager: MediaProjectionManager? nullval REQUEST_MEDIA_PROJECTION 10001private var isstartservice true//启动MediaService服务fun startMediaService() {if (isstartservice) {startService(Intent(this, MediaService::class.java))iss…...

C++ PrimerPlus 复习 第八章 函数探幽

第一章 命令编译链接文件 make文件 第二章 进入c 第三章 处理数据 第四章 复合类型 &#xff08;上&#xff09; 第四章 复合类型 &#xff08;下&#xff09; 第五章 循环和关系表达式 第六章 分支语句和逻辑运算符 第七章 函数——C的编程模块&#xff08;上&#xff…...

JavaScript-Ajax-axios-Xhr

JS的异步请求 主要有xhr xmlHttpRequest 以及axios 下面给出代码以及详细用法&#xff0c;都写在了注释里 直接拿去用即可 测试中默认的密码为123456 账号admin 其他一律返回登录失败 代码实例 <!DOCTYPE html> <html lang"en"> <head><…...

怎样查看kafka写数据送到topic是否成功

要查看 Kafka 写数据是否成功送到主题&#xff08;topic&#xff09;&#xff0c;可以通过以下几种方法来进行确认&#xff1a; Kafka 生产者确认机制&#xff1a;Kafka 提供了生产者的确认机制&#xff0c;您可以在创建生产者时设置 acks 属性来控制确认级别。常见的确认级别包…...

腾讯mini项目-【指标监控服务重构】2023-08-16

今日已办 v1 验证 StageHandler 在处理消息时是否为单例&#xff0c;【错误尝试】 type StageHandler struct { }func (s StageHandler) Middleware1(h message.HandlerFunc) message.HandlerFunc {return func(msg *message.Message) ([]*message.Message, error) {log.Log…...

PTA:7-3 两个递增链表的差集

^两个递增链表的差集 题目输入样例输出样例 代码 题目 输入样例 5 1 3 5 7 9 3 2 3 5输出样例 3 1 7 9代码 #include <iostream> #include <list> #include <unordered_set> using namespace std; int main() {int n1, n2;cin >> n1;list<int&g…...

智能合约漏洞案例,DEI 漏洞复现

智能合约漏洞案例&#xff0c;DEI 漏洞复现 1. 漏洞简介 https://twitter.com/eugenioclrc/status/1654576296507088906 2. 相关地址或交易 https://explorer.phalcon.xyz/tx/arbitrum/0xb1141785b7b94eb37c39c37f0272744c6e79ca1517529fec3f4af59d4c3c37ef 攻击交易 3. …...

Attention is all you need 论文笔记

该论文引入Transformer&#xff0c;主要核心是自注意力机制&#xff0c;自注意力&#xff08;Self-Attention&#xff09;机制是一种可以考虑输入序列中所有位置信息的机制。 RNN介绍 引入RNN为了更好的处理序列信息&#xff0c;比如我 吃 苹果&#xff0c;前后的输入之间是有…...

Hdoop伪分布式集群搭建

文章目录 Hadoop安装部署前言1.环境2.步骤3.效果图 具体步骤&#xff08;一&#xff09;前期准备&#xff08;1&#xff09;ping外网&#xff08;2&#xff09;配置主机名&#xff08;3&#xff09;配置时钟同步&#xff08;4&#xff09;关闭防火墙 &#xff08;二&#xff09…...

java临时文件

临时文件 有时候&#xff0c;我们程序运行时需要产生中间文件&#xff0c;但是这些文件只是临时用途&#xff0c;并不做长久保存。 我们可以使用临时文件&#xff0c;不需要长久保存。 public static File createTempFile(String prefix, String suffix)prefix 前缀 suffix …...

C++中的<string>头文件 和 <cstring>头文件简介

C中的<string>头文件 和 <cstring>头文件简介 在C中<string> 和 <cstring> 是两个不同的头文件。 <string> 是C标准库中的头文件&#xff0c;定义了一个名为std::string的类&#xff0c;提供了对字符串的操作如size()、length()、empty() 及字…...

安装MySQL

Centos7下安装MySQL详细步骤_centos7安装mysql教程_欢欢李的博客-CSDN博客...

输入学生成绩,函数返回最大元素的数组下标,求最高分学生成绩(输入负数表示输入结束)

scanfscore()函数用于输入学生的成绩 int scanfscore(int score[N])//输入学生的成绩 {int i -1;do {i;printf("输入学生成绩:");scanf("%d", &score[i]);} while (score[i] > 0);return i; } findmax()用于寻找最大值 int findmax(int score[N…...

常用音频接口:TDM,PDM,I2S,PCM

常用音频接口&#xff1a;TDM&#xff0c;PDM&#xff0c;I2S&#xff0c;PCM_tdm音频_沙漠的甲壳虫的博客-CSDN博客 I2S/PCM接口及音频codec_音频pcm接口模块设计-CSDN博客 2个TDM8功放调试ing_周龙(AI湖湘学派)的博客-CSDN博客 数字音频接口时序----IIS、TDM、PCM、PDM_td…...

git clone报错Failed to connect to github.com port 443 after 21055 ms:

git 设置代理端口号 git config --global http.proxy http://127.0.0.1:10085 和 git config --global https.proxy http://127.0.0.1:10085 然后就可以成功git clone hugging face的数据集了 如果是https://huggingface.co/datasets/shibing624/medical/tree/main 那么…...

【操作系统】深入浅出死锁问题

死锁的概念 在多线程编程中&#xff0c;我们为了防止多线程竞争共享资源而导致数据错乱&#xff0c;都会在操作共享资源而导致数据错乱&#xff0c;都会在操作共享资源之前加上互斥锁&#xff0c;只有成功获得到锁的线程&#xff0c;才能操作共享资源&#xff0c;获取不到锁的…...

springboot实现webSocket服务端和客户端demo

1&#xff1a;pom导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>2.2.7.RELEASE</version></dependency>2&#xff1a;myWebSocketClien…...

代码走读: FFMPEG-ffplayer02

AVFrame int attribute_align_arg avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame) 选取一个音频解码器 和 一个视频解码器分别介绍该解码器功能 音频G722 g722dec.c -> g722_decode_frame 通过 ff_get_buffer 给 传入的 frame 指针分配内存 g722_decode_…...

【数据结构】——排序算法的相关习题

目录 一、选择题题型一 &#xff08;插入排序&#xff09;1、直接插入排序2、折半插入排序3、希尔排序 题型二&#xff08;交换排序&#xff09;1、冒泡排序2、快速排序 题型三&#xff08;选择排序&#xff09;1、简单选择排序~2、堆排序 ~题型四&#xff08;归并排序&#xf…...

C高级day5(Makefile)

一、Xmind整理&#xff1a; 二、上课笔记整理&#xff1a; 1.#----->把带参宏的参数替换成字符串 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX(a,b) a>b?a:b #define STR(n) #n int main(int argc, const char *argv…...

Android 系统中适配OAID获取

一、OAID概念 OAID&#xff08;Open Anonymous Identification&#xff09;是一种匿名身份识别标识符&#xff0c; 用于在移动设备上进行广告追踪和个性化广告投放。它是由中国移动通信集 团、中国电信集团和中国联通集团共同推出的一项行业标准 OAID值为一个64位的数字 二、…...

临淄房产信息网123/历下区百度seo

marker&#xff1a; 边缘&#xff1a;’MarkerEdgeColor’, [],&#xff08;RGB 配色&#xff09;填充&#xff1a;’MarkerFaceColor’, []&#xff08;RGB 配色&#xff09;转载于:https://www.cnblogs.com/mtcnn/p/9421894.html...

室内设计师资格证书/seo技术教程

1.在Java中&#xff0c;如果父类中的某些方法不包含任何逻辑&#xff0c;并且需要有子类重写&#xff0c;应该使用&#xff08;c&#xff09;关键字来申明父类的这些方法。 a. Finalc b. Static c. Abstract d. Void 2.给定两个java程序&#xff0c;如下&#xff1a; public…...

网站推广代运营/免费企业网站建设

1.oracle和mysql通用方法 #round(字段1,小数位数) 四舍五入select round(11.123456,4);结果&#xff1a;11.1235 2.mysql的另外2种保留小数位数方法#convert(字段1,decimal(最大长度,小数位数)) 四舍五入select convert(11.123456,decimal(9,4));结果&#xff1a;11.1235 #cast…...

wordpress浏览统计/中国足球世界排名

查看linux的重启记录&#xff1a; last | grep reboot 与之类似可以查看Linux的关机记录&#xff1a; last | grep shutdown...

上海招聘网站哪个靠谱/推广产品吸引人的句子

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主同意不得转载。 https://blog.csdn.net/zhangdaiscott/article/details/26488439 jeecg v3.0入门视频 链接: http://pan.baidu.com/s/1bnrMfiJpassword: 8q0k MiniDao持久层 入门视频 链接: http://pan.baidu.com…...

用绿色做图标的网站/那个推广平台好用

目录&#xff1a; 1.为啥要做cmdb? 2.开发cmdb的思路和大概做法? 3.cmdb的四套方案? 一、为啥要做CMDB a.项目发开和上线场景? 流程&#xff1a; 产品经理调研需求 》定一个时间开发 》测试 》产品项目上线&#xff08;运维&#xff09; 传统做法&#xff1a; 运维解压文件…...