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

【Python爬虫五十个小案例】爬取猫眼电影Top100

请添加图片描述

博客主页:小馒头学python

本文专栏: Python爬虫五十个小案例

专栏简介:分享五十个Python爬虫小案例

在这里插入图片描述

🐍引言

猫眼电影是国内知名的电影票务与资讯平台,其中Top100榜单是影迷和电影产业观察者关注的重点。通过爬取猫眼电影Top100的数据,我们可以分析当前最受欢迎的电影,了解电影市场的变化趋势。在本文中,我们将介绍如何使用Python实现爬取猫眼电影Top100榜单的过程,并通过简单的数据分析展示电影的评分分布及其它相关信息。

🐍准备工作

在开始爬虫之前,我们需要做一些准备工作:

🐍安装必要的库

首先,我们需要安装几个常用的Python库:

pip install requests beautifulsoup4 pandas matplotlib seaborn

🐍了解页面结构

使用浏览器的开发者工具打开猫眼电影Top100的网页,观察页面的DOM结构,找到包含电影信息的元素

下面是页面的大概结构

在这里插入图片描述

🐍分析猫眼电影Top100页面结构

猫眼电影Top100的URL通常是类似于 https://maoyan.com/board/4。我们可以通过浏览器开发者工具(F12)来查看HTML结构,识别出电影的名称、评分、上映时间等数据。通过<li class="board-item">标签,每个电影的信息都包含在这个标签下。我们需要提取出其中的子标签来获取所需的数据。

🐍 编写爬虫代码

接下来,我们编写爬虫代码,来抓取页面中的电影信息。爬虫的主要任务是获取电影的名称、评分、上映时间等数据,并处理分页逻辑,直到抓取完Top100。

import requests
from bs4 import BeautifulSoup
import pandas as pd# 设置目标URL
url = 'https://maoyan.com/board/4'# 发送请求
response = requests.get(url)
response.encoding = 'utf-8'# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(response.text, 'html.parser')# 存储电影信息的列表
movies = []# 提取电影列表
for item in soup.find_all('dd'):movie = {}movie['name'] = item.find('a').text.strip()  # 电影名称movie['score'] = item.find('p', class_='score').text.strip()  # 电影评分movie['release_time'] = item.find('p', class_='releasetime').text.strip()  # 上映时间movies.append(movie)# 将数据保存到DataFrame
df = pd.DataFrame(movies)# 输出前5行数据
print(df.head())# 保存到CSV文件
df.to_csv('maoyan_top100.csv', index=False)

🐍数据清洗与存储

在爬取数据之后,我们需要进行数据清洗,确保抓取的数据是准确和完整的。例如:

  • 清理电影名称中的空格和特殊字符
  • 处理评分字段中缺失或非数字的情况
  • 上映时间可能需要转换为标准日期格式

使用pandas可以方便地进行数据清洗:

# 清洗数据:去除空值
df.dropna(inplace=True)# 转换上映时间为标准格式
df['release_time'] = pd.to_datetime(df['release_time'], errors='coerce')# 处理评分数据,将评分转换为浮动类型
df['score'] = pd.to_numeric(df['score'], errors='coerce')

🐍数据分析与可视化

通过简单的数据分析,我们可以查看电影评分的分布、上映年份的趋势等:

import matplotlib.pyplot as plt
import seaborn as sns# 绘制评分分布图
plt.figure(figsize=(8, 6))
sns.histplot(df['score'], bins=20, kde=True)
plt.title('电影评分分布')
plt.xlabel('评分')
plt.ylabel('数量')
plt.show()# 电影上映年份分布
df['release_year'] = df['release_time'].dt.year
plt.figure(figsize=(10, 6))
sns.countplot(x='release_year', data=df)
plt.title('电影上映年份分布')
plt.xticks(rotation=45)
plt.show()

🐍反爬虫机制与应对策略

猫眼电影网站有一定的反爬虫机制,比如限制频繁的请求。因此,在编写爬虫时,我们需要注意以下几个问题:

  • 使用User-Agent:模拟浏览器请求头,避免被识别为爬虫
  • 设置请求间隔:通过time.sleep()设置请求的间隔,防止过于频繁的请求
  • 使用代理:避免IP封禁
import time
import randomheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}# 模拟延时,避免频繁请求
time.sleep(random.uniform(1, 3))

🐍完整源码

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import random
import matplotlib.pyplot as plt
from matplotlib import rcParams
import seaborn as sns
import re# 设置Matplotlib使用的字体为SimHei(黑体),以支持中文显示
rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
rcParams['axes.unicode_minus'] = False  # 解决负号 '-' 显示为方块的问题# 设置目标URL
url = 'https://maoyan.com/board/4'# 请求头,模拟浏览器访问
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}# 发送请求
response = requests.get(url, headers=headers)
response.encoding = 'utf-8'# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(response.text, 'html.parser')# 存储电影信息的列表
movies = []# 提取电影列表
for item in soup.find_all('dd'):movie = {}# 获取电影名称,从a标签的title属性中提取movie['name'] = item.find('a')['title'].strip() if item.find('a') else 'N/A'# 获取评分,确保评分字段存在score_tag = item.find('p', class_='score')movie['score'] = score_tag.text.strip() if score_tag else 'N/A'# 获取上映时间,确保上映时间字段存在release_time_tag = item.find('p', class_='releasetime')release_time = release_time_tag.text.strip() if release_time_tag else 'N/A'# 使用正则表达式清洗数据,提取年份部分movie['release_time'] = re.findall(r'\d{4}', release_time)  # 匹配年份if movie['release_time']:movie['release_time'] = movie['release_time'][0]  # 只取第一个年份else:movie['release_time'] = 'N/A'  # 如果没有找到年份,设置为'N/A'# 将电影信息添加到列表中movies.append(movie)# 将数据存储到pandas DataFrame
df = pd.DataFrame(movies)# 输出前5行数据
print("爬取的数据:")
print(df.head())# 数据清洗:去除空值并处理评分数据
df.dropna(subset=['score', 'release_time'], inplace=True)  # 删除评分和上映时间为空的行# 将评分转换为数值类型,无法转换的设置为NaN
df['score'] = pd.to_numeric(df['score'], errors='coerce')# 删除评分为空的行
df.dropna(subset=['score'], inplace=True)# 将release_time列转换为数值类型的年份
df['release_year'] = pd.to_numeric(df['release_time'], errors='coerce')# 输出清洗后的数据
print("清洗后的数据:")
print(df.head())# 保存数据为CSV文件
df.to_csv('maoyan_top100.csv', index=False)# 数据分析:电影评分分布
plt.figure(figsize=(8, 6))
sns.histplot(df['score'], bins=20, kde=True)
plt.title('电影评分分布')
plt.xlabel('评分')
plt.ylabel('数量')
plt.show()# 数据分析:电影上映年份分布
plt.figure(figsize=(10, 6))
sns.countplot(x='release_year', data=df)
plt.title('电影上映年份分布')
plt.xticks(rotation=45)
plt.xlabel('年份')
plt.ylabel('电影数量')
plt.show()# 结束
print("爬取和分析完成!数据已保存至 maoyan_top100.csv")

🐍翻页功能

我们完成了基本的功能,接下来我们为了爬取前100个电影(即10页数据),你需要构造爬虫来遍历每一页并合并数据。每一页的URL格式为https://www.maoyan.com/board/4?offset=n,其中n是每页的偏移量,分别为0、10、20、30等,

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import random
import matplotlib.pyplot as plt
from matplotlib import rcParams
import seaborn as sns
import re# 设置Matplotlib使用的字体为SimHei(黑体),以支持中文显示
rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
rcParams['axes.unicode_minus'] = False  # 解决负号 '-' 显示为方块的问题# 设置目标URL基础部分
base_url = 'https://www.maoyan.com/board/4?offset={}'# 请求头,模拟浏览器访问
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}# 存储所有电影信息的列表
movies = []# 爬取10页数据,每页偏移量为0, 10, 20, ..., 90
for offset in range(0, 100, 10):url = base_url.format(offset)  # 构造每一页的URLresponse = requests.get(url, headers=headers)response.encoding = 'utf-8'# 使用BeautifulSoup解析HTMLsoup = BeautifulSoup(response.text, 'html.parser')# 提取电影列表for item in soup.find_all('dd'):movie = {}# 获取电影名称,从a标签的title属性中提取movie['name'] = item.find('a')['title'].strip() if item.find('a') else 'N/A'# 获取评分,确保评分字段存在score_tag = item.find('p', class_='score')movie['score'] = score_tag.text.strip() if score_tag else 'N/A'# 获取上映时间,确保上映时间字段存在release_time_tag = item.find('p', class_='releasetime')release_time = release_time_tag.text.strip() if release_time_tag else 'N/A'# 使用正则表达式清洗数据,提取年份部分movie['release_time'] = re.findall(r'\d{4}', release_time)  # 匹配年份if movie['release_time']:movie['release_time'] = movie['release_time'][0]  # 只取第一个年份else:movie['release_time'] = 'N/A'  # 如果没有找到年份,设置为'N/A'# 将电影信息添加到列表中movies.append(movie)# 随机延迟,避免频繁请求被封禁time.sleep(random.uniform(1, 3))# 将数据存储到pandas DataFrame
df = pd.DataFrame(movies)# 输出前5行数据
print("爬取的数据:")
print(df.head())# 数据清洗:去除空值并处理评分数据
df.dropna(subset=['score', 'release_time'], inplace=True)  # 删除评分和上映时间为空的行# 将评分转换为数值类型,无法转换的设置为NaN
df['score'] = pd.to_numeric(df['score'], errors='coerce')# 删除评分为空的行
df.dropna(subset=['score'], inplace=True)# 将release_time列转换为数值类型的年份
df['release_year'] = pd.to_numeric(df['release_time'], errors='coerce')# 输出清洗后的数据
print("清洗后的数据:")
print(df.head())# 保存数据为CSV文件
df.to_csv('maoyan_top100.csv',encoding='utf-8-sig' ,index=False)# 数据分析:电影评分分布
plt.figure(figsize=(8, 6))
sns.histplot(df['score'], bins=20, kde=True)
plt.title('电影评分分布')
plt.xlabel('评分')
plt.ylabel('数量')
plt.show()# 数据分析:电影上映年份分布
plt.figure(figsize=(10, 6))
sns.countplot(x='release_year', data=df)
plt.title('电影上映年份分布')
plt.xticks(rotation=45)
plt.xlabel('年份')
plt.ylabel('电影数量')
plt.show()# 结束
print("爬取和分析完成!数据已保存至 maoyan_top100.csv")

遍历10页

  • 我们使用range(0, 100, 10)来设置偏移量,依次爬取从offset=0offset=90的URL
  • 每一页的URL由base_url.format(offset)生成。

随机延迟

  • 为了避免频繁请求导致被封禁,爬虫请求每一页后,加入了time.sleep(random.uniform(1, 3)),模拟随机延迟

爬取并合并数据

  • 所有电影信息都会存储到movies列表中,最后通过pandasDataFrame进行数据整合

运行结果
在这里插入图片描述
在这里插入图片描述

下图展示了电影评分分布情况还有电影上映年份的分布
在这里插入图片描述
在这里插入图片描述

🐍结语

通过本篇博客,我们展示了如何使用Python爬虫技术抓取猫眼电影Top100的数据,并进行简单的数据清洗与分析。除了数据抓取和分析,我们还学习了如何应对反爬虫机制。通过这些知识,我们可以很好的进行后续的数据分析,或者可以查看自己喜欢哪个电影,当然本节主要还是为了练手,为了后续我们进行其他项目任务

若感兴趣可以访问并订阅我的专栏:Python爬虫五十个小案例:https://blog.csdn.net/null18/category_12840403.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12840403&sharerefer=PC&sharesource=null18&sharefrom=from_link

相关文章:

【Python爬虫五十个小案例】爬取猫眼电影Top100

博客主页&#xff1a;小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介&#xff1a;分享五十个Python爬虫小案例 &#x1f40d;引言 猫眼电影是国内知名的电影票务与资讯平台&#xff0c;其中Top100榜单是影迷和电影产业观察者关注的重点。通过爬取猫眼电影Top10…...

等保测评和 ISO27001 都是信息保护,区别是什么?

ISO27001 和等级保护&#xff08;等保&#xff09;都是信息安全领域重要的标准和制度&#xff0c;但它们在多个方面存在区别&#xff1a; 定义和性质 ISO27001 它是国际标准化组织&#xff08;ISO&#xff09;发布的信息安全管理体系标准&#xff0c;其目的是帮助组织建立、实…...

Linux系统编程之进程创建

概述 在Linux系统中&#xff0c;通过创建新的进程&#xff0c;我们可以实现多任务处理、并发执行和资源隔离等功能。创建进程的主要方法为&#xff1a;fork、vfork、clone。下面&#xff0c;我们将分别进行介绍。 fork fork是最常用的创建新进程的方法。当一个进程调用fork时&a…...

JAVA-IO

目录 IO流 一 字节流 1 FileOutStream 1 书写&#xff1a; 2 换行书写与续写&#xff1a; 2 FileInputStream 1 读取数据 2 循环读取&#xff1a; 二 字符流 1 FileReader 1 空参的read()方法读取数据&#xff1a; 2 有参的read()方法读取数据&#xff1a; 3 指定字…...

动态系统特征分析:特征向量、特征值、频率与阻尼比、参与因子计算方法

特征值和特征向量在动态系统分析中是核心工具&#xff0c;广泛用于电力系统小信号稳定性、机械系统模态分析等领域。以下详细介绍计算方法及应用。 1. 求解特征值与特征向量 对于一个 n n n\times n nn的系统矩阵 A A A&#xff1a; 右特征向量与特征值 特征值( λ \lambd…...

乐鑫发布 esp-iot-solution v2.0 版本

今天&#xff0c;乐鑫很高兴地宣布&#xff0c;esp-iot-solution v2.0 版本已经发布&#xff0c;release/v2.0 分支下的正式版本组件将为用户提供为期两年的 Bugfix 维护&#xff08;直到 2027.01.25 ESP-IDF v5.3 EOL&#xff09;。该版本将物联网开发中常用的功能进行了分类整…...

动态代理如何加强安全性

在当今这个信息爆炸、网络无孔不入的时代&#xff0c;我们的每一次点击、每一次浏览都可能留下痕迹&#xff0c;成为潜在的安全隐患。如何在享受网络便利的同时&#xff0c;有效保护自己的隐私和信息安全&#xff0c;成为了每位网络使用者必须面对的重要课题。动态代理服务器&a…...

Flutter 之 InheritedWidget

InheritedWidget 是 Flutter 框架中的一个重要类&#xff0c;用于在 Widget 树中共享数据。它是 Flutter 中数据传递和状态管理的基础之一。通过 InheritedWidget&#xff0c;你可以让子 Widget 在不需要显式传递数据的情况下&#xff0c;访问祖先 Widget 中的数据。这种机制对…...

AI 助力开发新篇章:云开发 Copilot 深度体验与技术解析

本文 一、引言&#xff1a;技术浪潮中的个人视角1.1 AI 和低代码的崛起1.2 为什么选择云开发 Copilot&#xff1f; 二、云开发 Copilot 的核心功能解析2.1 自然语言驱动的低代码开发2.1.1 自然语言输入示例2.1.2 代码生成的模块化支持 2.2 实时预览与调整2.2.1 实时预览窗口功能…...

MyBatis-Plus介绍及基本使用

文章目录 概述介绍MyBatis-Plus 常用配置分页插件配置类注解配置 快速入门maven 依赖编写配置文件编写启动类编写 MybatisPlus 配置类 代码生成器&#xff1a;MybatisPlusGeneratormaven依赖代码生成器核心类 概述 介绍 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 M…...

SpringBoot 整合 Avro 与 Kafka

优质博文&#xff1a;IT-BLOG-CN 【需求】&#xff1a;生产者发送数据至 kafka 序列化使用 Avro&#xff0c;消费者通过 Avro 进行反序列化&#xff0c;并将数据通过 MyBatisPlus 存入数据库。 一、环境介绍 【1】Apache Avro 1.8&#xff1b;【2】Spring Kafka 1.2&#xf…...

支持JT1078和GB28181的流媒体服务器-LKM启动配置文件参数说明

流媒体服务器地址&#xff1a;https://github.com/lkmio/lkm GB28181信令&#xff0c;模拟多个国标设备工具&#xff1a;https://github.com/lkmio/gb-cms 文章目录 gop_cachegop_buffer_sizeprobe_timeoutwrite_timeoutmw_latencylisten_ippublic_ipidle_timeoutreceive_timeo…...

什么是隐式类型转换?隐式类型转换可能带来哪些问题? 显式类型转换(如强制类型转换)有哪些风险?

C 中的隐式类型转换 定义&#xff1a;在 C 中&#xff0c;隐式类型转换是指由编译器自动执行的类型转换&#xff0c;不需要程序员显式地进行操作。这种转换在很多情况下会自动发生&#xff0c;比如在表达式求值、函数调用传参等过程中。常见场景 算术运算中的转换&#xff1a;…...

量化交易新利器:阿布量化(AbuQuant)——金融研究者的得力助手

&#x1f680; 量化交易新利器&#xff1a;阿布量化&#xff08;AbuQuant&#xff09;——金融研究者的得力助手 &#x1f680; 文章目录 &#x1f680; 量化交易新利器&#xff1a;阿布量化&#xff08;AbuQuant&#xff09;——金融研究者的得力助手 &#x1f680;&#x1f3…...

UI设计从入门到进阶,全能实战课

课程内容&#xff1a; ├── 【宣导片】从入门到进阶!你的第一门UI必修课!.mp4 ├── 第0课&#xff1a;UI知识体系梳理 学习路径.mp4 ├── 第1课&#xff1a;IOS设计规范——基础规范与切图.mp4 ├── 第2课&#xff1a;IOS新趋势解析——模块规范与设计原则(上).mp4…...

Uniapp自动调整元素高度

获取设备的像素 如果你想让元素的高度相对于整个屏幕的高度占用一定的比例&#xff0c;可以通过获取屏幕的高度&#xff0c;然后计算出你想要的比例来设置元素的高度。以下是如何实现的示例&#xff1a; <script setup> import { ref, onMounted } from vue;// 定义一个…...

软考高项经验分享:我的备考之路与实战心得

软考&#xff0c;尤其是信息系统项目管理师&#xff08;高项&#xff09;考试&#xff0c;对于众多追求职业提升与专业认可的人士来说&#xff0c;是一场充满挑战与机遇的征程。我在当年参加软考高项的经历&#xff0c;可谓是一波三折&#xff0c;其中既有成功的喜悦&#xff0…...

安全关系型数据库查询新选择:Rust 语言的 rust-query 库深度解析

在当今这个数据驱动的时代&#xff0c;数据库作为信息存储和检索的核心组件&#xff0c;其重要性不言而喻。然而&#xff0c;对于开发者而言&#xff0c;如何在保证数据安全的前提下&#xff0c;高效地进行数据库操作却是一项挑战。传统的 SQL 查询虽然强大&#xff0c;但存在诸…...

《C++ 模型训练之早停法:有效预防过拟合的关键策略》

在 C 模型开发的复杂世界里&#xff0c;过拟合犹如一个潜藏的陷阱&#xff0c;常常使我们精心构建的模型在实际应用中表现大打折扣。而早停法&#xff08;Early Stopping&#xff09;作为一种行之有效的策略&#xff0c;能够帮助我们及时察觉模型训练过程中的异常&#xff0c;避…...

5.11【数据库】第一次实验

民宿预定&#xff0c;至少有不同的民宿&#xff0c;民宿下面有不同的房间&#xff08;面积&#xff0c;房间编号&#xff09; 房间类型&#xff0c;单价&#xff0c; 可预订以及不可预订 游客信息 订单信息 公司有很多课程&#xff0c; 学生&#xff0c;课程 每位学生每期…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

边缘计算网关提升水产养殖尾水处理的远程运维效率

一、项目背景 随着水产养殖行业的快速发展&#xff0c;养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下&#xff0c;而且难以实现精准监控和管理。为了提升尾水处理的效果和效率&#xff0c;同时降低人力成本&#xff0c;某大型水产养殖企业决定…...