Python爬虫 - 豆瓣电影排行榜数据爬取、处理与存储

文章目录

  • 前言
  • 一、使用版本
  • 二、需求分析
    • 1. 分析要爬取的内容
      • 1.1 分析要爬取的分类
      • 1.2 分析要爬取的单个电影的数据
      • 1.3 分析如何获取单个电影数据
        • 1.3.1 预览数据
        • 1.3.2 查看请求网址、方法及请求头信息
        • 1.3.3 查看请求参数
    • 2. 数据用途
      • 2.1 统计分析
      • 2.2 探索性数据分析 (EDA)
      • 2.3 高级分析
  • 三、编写代码
    • 1. 获取分类链接中的参数
    • 2. 获取排行榜中不同分类的电影数据
  • 四、数据处理与存储
    • 1. 数据表设计与实现
      • 1.1 原始数据表设计
      • 1.2 原始数据表实现
    • 2. 数据处理与存储
      • 2.1 安装相关库
      • 2.2 代码实现


前言

在当今数据驱动的时代,信息的获取与分析变得尤为重要。电影作为一种广受欢迎的文化产品,其相关数据的挖掘与分析不仅能帮助观众更好地选择影片,还能为电影行业提供有价值的市场洞察。本文将详细介绍如何利用 Python 爬虫技术从豆瓣电影网站获取电影排行榜数据,并将其存储到 MySQL 数据库中,以便后续进行统计分析和探索性数据分析(EDA)。

我们将首先分析爬取的需求,明确要获取的电影分类及其详细信息。接着,使用 Python 的 requests 和 BeautifulSoup 库编写爬虫代码,抓取所需数据,并将其保存为 JSON 格式。随后,我们将设计相应的 MySQL 数据表结构,以便将爬取到的原始数据存储到数据库中。最后,借助 pandas 库,我们将处理和清洗数据,确保其格式符合数据库要求,并将最终数据导入 MySQL。


一、使用版本

pythonrequestsbs4beautifulsoup4soupsievelxml
版本3.8.52.31.00.0.24.12.32.64.9.3

二、需求分析

进行分析的时候,首先在如下图网络处分析,查找是否有获取数据的API接口;如果没有,再从页面元素标签上去分析。

在这里插入图片描述

1. 分析要爬取的内容

1.1 分析要爬取的分类

如下图所示,此处要爬取的是豆瓣电影排行榜的分类排行榜的每个分类下的所有数据。

在这里插入图片描述

右击剧情,点击检查

在这里插入图片描述

可以看到他的链接地址标签<a href="/typerank?type_name=剧情&type=11&interval_id=100:90&action=">剧情</a>,此地址中包含type_nametypeinterval_idaction这几个参数。

在这里插入图片描述

1.2 分析要爬取的单个电影的数据

如下图所示,点击后进入单个电影内容页面。

在这里插入图片描述

如下图所示,可以看到单个电影的详细信息,我们需要获取这些信息。

在这里插入图片描述

1.3 分析如何获取单个电影数据

1.3.1 预览数据

如下面两幅图所示,在这个接口的预览中可以获取到单个电影的详细数据。

在这里插入图片描述

在这里插入图片描述

1.3.2 查看请求网址、方法及请求头信息

标头部分查看请求网址、方法,以及下面的请求头信息。

在这里插入图片描述

如上图所示,请求网址和请求头为:

top_list_base_url = 'https://movie.douban.com/j/chart/top_list'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36'
}
1.3.3 查看请求参数

载荷部分查看请求参数。

  • interval_idtype:是分类中的数据,需要从分析要爬取的分类获取。
  • start=0:指定从哪个位置开始获取电影列表。0意味着从第一条记录开始。如果你想要获取第二页的数据,你可以将此值设置为20(假设每页显示20条记录),以此类推。
  • limit=20:定义了一次请求返回的最大电影数量。这里是20,所以每次请求最多会返回20部电影的信息。
    在这里插入图片描述

如上图所示,请求参数为:

payload = {'type': '11','interval_id': '100:90','action': '','start': '0','limit': '20'
}

2. 数据用途

2.1 统计分析

  1. 评分分布

    • 分析电影评分的分布情况,比如平均分、最高分、最低分等。
    • 可以使用直方图或箱线图来可视化评分分布。
  2. 观看人数

    • 研究投票数(vote_count),了解该电影的受欢迎程度。
    • 对比不同电影之间的投票数差异,找出最受欢迎的作品。
  3. 类型偏好

    • 分析不同类型(types)的电影数量及其平均评分,判断观众对哪种类型的偏好。
  4. 地区影响

    • 探讨来自不同制作地区(regions)的电影在评分上的差异,以及各地区的贡献度。

2.2 探索性数据分析 (EDA)

  1. 时间趋势

    • 根据发布日期(release_date)分析电影评分随时间的变化趋势,观察是否存在特定年代的高分电影聚集现象。
  2. 演员影响力

    • 分析主演(actors)参与的电影数量及平均评分,评估明星效应。
    • 利用网络图展示演员间的合作关系,识别哪些演员经常合作。
  3. 导演/编剧风格

    • 如果有导演或编剧信息,可以进一步分析他们的作品特点,如评分、类型选择等。

2.3 高级分析

  1. 预测模型

    • 构建机器学习模型来预测电影评分,考虑因素包括演员阵容、类型、地区、上映日期等。
    • 使用回归分析预测票房收入(如果有相关数据)。
  2. 文本挖掘与情感分析

    • 如果有评论数据,可以执行文本挖掘,提取热门话题、关键词等。
    • 实施情感分析,评估观众对电影的整体态度是正面还是负面。
  3. 关联规则学习

    • 发现不同类型、演员、地区之间的关联模式,例如某些类型的电影是否更倾向于出现在特定地区。
  4. 聚类分析

    • 将电影根据其特征(如评分、类型、地区等)分为不同的群组,帮助理解市场细分。
  5. 社交网络分析

    • 建立演员、导演等创作人员之间的社交网络,分析合作频率和紧密度。

对于给定的数据片段,你还可以做如下具体操作:

  • 计算评分的众数:从rating字段中解析出用户给出的具体分数,并计算最常见的评分。
  • 检查播放状态的影响:对比is_playable为True和False的电影评分是否有显著区别。
  • 查看封面图片的流行度:虽然这需要额外的数据源支持,但可以假设封面设计也会影响电影的关注度。

三、编写代码

1. 获取分类链接中的参数

爬取每个分类链接地址中的type_nametypeinterval_id

from urllib.parse import urlparse, parse_qsimport requests
from bs4 import BeautifulSoup# 设置请求头,模拟浏览器访问,避免被服务器识别为爬虫
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36'
}# 获取网页文本内容,获取失败返回None
def fetch_page_content(url, headers):try:response = requests.get(url=url, headers=headers)if response.status_code == 200:return response.textelse:print(f"检索页面失败,状态码:{response.status_code}")return Noneexcept Exception as e:print(f"发生错误:{e}")return None# 使用BeautifulSoup解析HTML文档
def parse_html(content):return BeautifulSoup(content, features='lxml')# 提取电影类型链接,包含<a>标签的列表
def extract_movie_type_links(soup):return soup.select('.types > span > a')# 从给定的URL中提取查询参数,并返回一个字典。
def get_url_parameters(url):parsed_url = urlparse(url)query_params = parse_qs(parsed_url.query)return query_params# 处理电影类型链接,构建完整的URL并提取查询参数,返回每个电影类型的查询参数字典列表。
def process_movie_types(base_url, a_list):type_dicts = []for a in a_list:href = a.attrs.get('href')full_url = base_url + href if href.startswith('/') else href  # 确保链接是完整的URLtype_dict = get_url_parameters(full_url)type_dicts.append(type_dict)return type_dictsdef get_type_params_list():chart_base_url = 'https://movie.douban.com/chart'# 获取页面内容content = fetch_page_content(chart_base_url, headers)if not content:return# 解析HTML文档soup = parse_html(content)# 提取电影类型链接a_list = extract_movie_type_links(soup)# 处理电影类型链接并提取查询参数return process_movie_types(chart_base_url, a_list)if __name__ == '__main__':type_params_list = get_type_params_list()print(type_params_list)

打印结果为:

[{'type_name': ['剧情'], 'type': ['11'], 'interval_id': ['100:90']}, {'type_name': ['喜剧'], 'type': ['24'], 'interval_id': ['100:90']}, {'type_name': ['动作'], 'type': ['5'], 'interval_id': ['100:90']}, {'type_name': ['爱情'], 'type': ['13'], 'interval_id': ['100:90']}, {'type_name': ['科幻'], 'type': ['17'], 'interval_id': ['100:90']}, {'type_name': ['动画'], 'type': ['25'], 'interval_id': ['100:90']}, {'type_name': ['悬疑'], 'type': ['10'], 'interval_id': ['100:90']}, {'type_name': ['惊悚'], 'type': ['19'], 'interval_id': ['100:90']}, {'type_name': ['恐怖'], 'type': ['20'], 'interval_id': ['100:90']}, {'type_name': ['纪录片'], 'type': ['1'], 'interval_id': ['100:90']}, {'type_name': ['短片'], 'type': ['23'], 'interval_id': ['100:90']}, {'type_name': ['情色'], 'type': ['6'], 'interval_id': ['100:90']}, {'type_name': ['音乐'], 'type': ['14'], 'interval_id': ['100:90']}, {'type_name': ['歌舞'], 'type': ['7'], 'interval_id': ['100:90']}, {'type_name': ['家庭'], 'type': ['28'], 'interval_id': ['100:90']}, {'type_name': ['儿童'], 'type': ['8'], 'interval_id': ['100:90']}, {'type_name': ['传记'], 'type': ['2'], 'interval_id': ['100:90']}, {'type_name': ['历史'], 'type': ['4'], 'interval_id': ['100:90']}, {'type_name': ['战争'], 'type': ['22'], 'interval_id': ['100:90']}, {'type_name': ['犯罪'], 'type': ['3'], 'interval_id': ['100:90']}, {'type_name': ['西部'], 'type': ['27'], 'interval_id': ['100:90']}, {'type_name': ['奇幻'], 'type': ['16'], 'interval_id': ['100:90']}, {'type_name': ['冒险'], 'type': ['15'], 'interval_id': ['100:90']}, {'type_name': ['灾难'], 'type': ['12'], 'interval_id': ['100:90']}, {'type_name': ['武侠'], 'type': ['29'], 'interval_id': ['100:90']}, {'type_name': ['古装'], 'type': ['30'], 'interval_id': ['100:90']}, {'type_name': ['运动'], 'type': ['18'], 'interval_id': ['100:90']}, {'type_name': ['黑色电影'], 'type': ['31'], 'interval_id': ['100:90']}]

2. 获取排行榜中不同分类的电影数据

获取分类链接中的参数代码实现的基础上,编写代码来获取不同类型的电影数据,并保存为json文件。

import json
from pathlib import Path
from urllib.parse import urlparse, parse_qsimport requests
from bs4 import BeautifulSoup# 设置请求头,模拟浏览器访问,避免被服务器识别为爬虫
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36'
}# 获取网页文本内容,获取失败返回None
def fetch_page_content(url, headers):try:response = requests.get(url=url, headers=headers)if response.status_code == 200:return response.textelse:print(f"检索页面失败,状态码:{response.status_code}")return Noneexcept Exception as e:print(f"发生错误:{e}")return None# 使用BeautifulSoup解析HTML文档
def parse_html(content):return BeautifulSoup(content, features='lxml')# 提取电影类型链接,包含<a>标签的列表
def extract_movie_type_links(soup):return soup.select('.types > span > a')# 从给定的URL中提取查询参数,并返回一个字典。
def get_url_parameters(url):parsed_url = urlparse(url)query_params = parse_qs(parsed_url.query)return query_params# 处理电影类型链接,构建完整的URL并提取查询参数,返回每个电影类型的查询参数字典列表。
def process_movie_types(base_url, a_list):type_dicts = []for a in a_list:href = a.attrs.get('href')full_url = base_url + href if href.startswith('/') else href  # 确保链接是完整的URLtype_dict = get_url_parameters(full_url)type_dicts.append(type_dict)return type_dicts# 获取电影类型参数列表
def get_type_params_list():chart_base_url = 'https://movie.douban.com/chart'# 获取页面内容content = fetch_page_content(chart_base_url, headers)if not content:return# 解析HTML文档soup = parse_html(content)# 提取电影类型链接a_list = extract_movie_type_links(soup)# 处理电影类型链接并提取查询参数return process_movie_types(chart_base_url, a_list)# 获取电影数据,为json格式,每次获取50条,start为开始位置,count为每次获取多少条
def get_content(type_id, interval_id, start, count):top_list_base_url = 'https://movie.douban.com/j/chart/top_list'payload = {'type': type_id,'interval_id': interval_id,'action': '','start': start,'limit': count}try:response = requests.get(url=top_list_base_url, params=payload, headers=headers)if response.status_code == 200:return response.json()else:print(f"检索页面失败,状态码:{response.status_code}")return Noneexcept Exception as e:print(f"发生错误:{e}")return None# 把数据保存为json文件
def save_movie_data_to_file(file_name, json_data):# 定义保存目录路径save_dir = '../douban_movie_data/'dir_path = Path(save_dir)# 确保保存目录存在,如果不存在则创建所有必要的父级目录dir_path.mkdir(parents=True, exist_ok=True)# 使用 'with' 语句打开文件以确保正确关闭文件流with open(save_dir + file_name, 'w', encoding='utf-8') as fp:print(f"{save_dir + file_name} 文件已保存")fp.write(str(json_data))if __name__ == '__main__':# 获取类型参数列表,这个函数应该返回一个包含多个字典的列表,type_params_list = get_type_params_list()# 遍历类型参数列表,针对每一种类型的数据进行处理for type_params in type_params_list:# 从当前类型参数中提取出 interval_id, type_name 和 type_id,interval_id = type_params.get('interval_id')[0]type_name = type_params.get('type_name')[0]type_id = type_params.get('type')[0]# 初始化起始位置和每次请求的数据数量start = 0count = 50# 使用 while 循环不断获取并保存数据,直到没有更多数据为止while True:# 构造文件名,格式为 original_movie_data_{type_name}_{type_id}_{start + 1}_{end}.jsonfile_name = f"original_movie_data_{type_name}_{type_id}_{start + 1}_{start + count}.json"# 调用 get_content 函数获取指定范围内的电影数据movie_data = get_content(type_id, interval_id, start, count)# 如果没有获取到任何数据,则认为该类别的所有数据都已获取完毕,跳出循环if not movie_data:print(f"================分类 {type_name} 的数据获取完成================")break# 将获取到的电影数据保存到文件中,确保中文字符不被转义save_movie_data_to_file(file_name, json.dumps(movie_data, ensure_ascii=False))# 更新起始位置,准备下一轮的数据获取start += count

执行过程中打印的部分信息如下图所示:

在这里插入图片描述

数据文件和单个文件部分内容如下图所示:

在这里插入图片描述


四、数据处理与存储

先把爬取到的原始json数据保存到json文件中;然后根 json文件中的数据的值的类型设计对应的MySQL原始数据表,把json文件中的原始数据转存到MySQL的原始数据表中。

1. 数据表设计与实现

1.1 原始数据表设计

  • 表名:original_movie_data
  • 描述:用于存储未经处理的数据,按照json文件中的键作为字段来保存。

根据保存的JSON数据结构来设计一个MySQL表。

字段名数据类型说明
idVARCHAR(20)主键,唯一标识符(例如豆瓣电影ID)。
titleVARCHAR(255)电影标题。
urlVARCHAR(255)电影详情页面URL。
cover_urlVARCHAR(255)电影封面图片URL。
release_dateDATE电影发布日期。
scoreDECIMAL(3,1)电影评分(例如9.3)。
vote_countINT投票人数。
actor_countINT演员数量。
rankINT排名。
is_playableBOOLEAN是否可播放。
is_watchedBOOLEAN是否已观看。
ratingJSON评分详细信息,如[“9.3”, “50”],使用JSON类型存储数组。
typesJSON电影类型列表,如[“剧情”, “传记”, “历史”],使用JSON类型存储数组。
regionsJSON制片地区列表,如[“英国”, “意大利”, “中国大陆”, “法国”],使用JSON类型存储数组。
actorsJSON演员列表,如[“尊龙”, “陈冲”, “邬君梅”], 使用JSON类型存储数组。

1.2 原始数据表实现

创建数据库douban_movie

create database douban_movie;

切换到数据库douban_movie

use douban_movie;

创建原始数据表original_movie_data

CREATE TABLE original_movie_data (id VARCHAR(20) PRIMARY KEY,title VARCHAR(255) NOT NULL,url VARCHAR(255),cover_url VARCHAR(255),release_date DATE,score DECIMAL(3,1),vote_count INT,actor_count INT,`rank` INT,is_playable BOOLEAN,is_watched BOOLEAN,rating JSON,types JSON,regions JSON,actors JSON
);

字段类型说明:

  • VARCHAR:对于字符串类型的字段,使用VARCHAR并指定最大长度。
  • DECIMAL(3,1):用于存储评分,其中3表示总位数,1表示小数点后的位数。
  • DATE:用于存储日期格式的数据。
  • INT:用于整数类型的字段。
  • BOOLEAN:用于存储布尔值(真/假)。
  • JSON:对于包含多个值或复杂结构的字段(如评分、类型、地区和演员),可以使用MySQL的JSON数据类型来存储这些信息。

2. 数据处理与存储

json文件中数据处理后,保存到MySQL中。

2.1 安装相关库

pip install pandas sqlalchemy mysql-connector-python -i https://mirrors.aliyun.com/pypi/simple/

2.2 代码实现

从目录..\douban_movie_data中读取所有.json文件,将这些json文件的内容合并成一个统一的 DataFrame,并对数据进行清理和转换,包括日期格式化、评分数值化、布尔值标准化以及列表字段转换为 JSON 字符串。接着,它删除电影 id 相同的重复记录,并将最终的数据写入 MySQL 数据库中的original_movie_data表,确保中文字符不被转码。整个过程实现了从本地 JSON 文件到数据库表的自动化数据导入和处理。

import json
import os
import reimport pandas as pd
from sqlalchemy import create_engine# 设置数据库连接信息
DB_USER = 'root'
DB_PASSWORD = 'zxcvbq'
DB_HOST = '127.0.0.1'  # 或者你的数据库主机地址
DB_PORT = '3306'  # MySQL默认端口是3306
DB_NAME = 'douban_movie'# 创建数据库引擎
engine = create_engine(f'mysql+mysqlconnector://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}')# 定义函数:读取JSON文件并转换为DataFrame
def read_json_to_df(file_path):with open(file_path, 'r', encoding='utf-8') as file:data = json.load(file)df = pd.DataFrame(data)return dfdef preprocess_date(date_str):if isinstance(date_str, str) and re.match(r'^\d{4}$', date_str):  # 只有四位数字(年)return f"{date_str}-01-01"else:return date_str# 定义函数:清理和转换数据格式
def clean_and_transform(df):# 转换日期格式df['release_date'] = df['release_date'].apply(preprocess_date)df['release_date'] = pd.to_datetime(df['release_date'], errors='coerce').dt.date# 将字符串评分转换为浮点数,保留一位小数df['score'] = df['score'].astype(float).round(1)# 确保布尔值字段正确df['is_playable'] = df['is_playable'].astype(bool)df['is_watched'] = df['is_watched'].astype(bool)# 将列表类型的字段转换为JSON字符串for col in ['rating', 'types', 'regions', 'actors']:# df[col] = df[col].apply(json.dumps)df[col] = df[col].apply(lambda x: json.dumps(x, ensure_ascii=False))return dfif __name__ == '__main__':# 获取目录下所有JSON文件路径directory = r'..\douban_movie_data'json_files = [os.path.join(directory, f) for f in os.listdir(directory) if f.endswith('.json')]# 初始化一个空的DataFrame用于存储所有电影数据all_movies_df = pd.DataFrame()# 遍历每个JSON文件,读取内容并追加到总的DataFrame中for file in json_files:movie_df = read_json_to_df(file)all_movies_df = pd.concat([all_movies_df, movie_df], ignore_index=True)# 清理和转换数据cleaned_df = clean_and_transform(all_movies_df)# 删除完全重复数据cleaned_df = cleaned_df.drop_duplicates(subset=['id'])# 将DataFrame写入MySQL数据库cleaned_df.to_sql(name='original_movie_data3', con=engine, if_exists='append', index=False)print("所有JSON文件的数据已成功导入MySQL数据库")

查看original_movie_data表中的电影数据:

select * from original_movie_data limit 10;

在这里插入图片描述

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

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

相关文章

爬虫后的数据处理与使用(处理篇)

紧接上文爬虫&#xff0c;我们获取到了一些数据&#xff0c;接下来就是使用和分析了~爬虫阶段式教学——从数据获取到格式化存储&#xff08;附代码与效果图&#xff09;_爬虫网页数据格式化-CSDN博客 为保证数据的正确性和有效性需要对数据进行筛选&#xff0c;保存有效信息&a…

模电面试——设计题及综合分析题0x01(含答案)

1、已知某温控系统的部分电路如下图&#xff08;EDP070252&#xff09;&#xff0c;晶体管VT导通时&#xff0c;继电器J吸合&#xff0c;压缩机M运转制冷&#xff0c;VT截止时&#xff0c;J释放&#xff0c;M停止运转。 &#xff08;1&#xff09;电源刚接通时&#xff0c;晶体…

基于FPGA的2ASK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 2ASK调制解调 2.2 帧同步 3.Verilog核心程序 4.完整算法代码文件获得 1.算法仿真效果 vivado2019.2仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 设置SNR8db 设置SNR20db 整体波形效果&…

学习笔记:使用 pandas 和 Seaborn 绘制柱状图

学习笔记&#xff1a;使用 pandas 和 Seaborn 绘制柱状图 前言 今天在使用 pandas 对数据进行处理并在 Python 中绘制可视化图表时&#xff0c;遇到了一些关于字体设置和 Seaborn 主题覆盖的小问题。这里将学习到的方法和注意事项做个总结&#xff0c;以便之后的项目中可以快…

【算法day27】动态规划:基础2

题目引用 不同路径不同路径II整数拆分不同的二叉搜索树 1. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Fin…

大数据技术-Hadoop(四)Yarn的介绍与使用

目录 一、Yarn 基本结构 1、Yarn基本结构 2、Yarn的工作机制 二、Yarn常用的命令 三、调度器 1、Capacity Scheduler&#xff08;容量调度器&#xff09; 1.1、特点 1.2、配置 1.2.1、yarn-site.xml 1.2.2、capacity-scheduler.xml 1.3、重启yarn、刷新队列 测试 向hi…

Vscode左大括号不另起一行、注释自动换行

参考大佬的博客VSCode 格式化 cpp 文件时配置左大括号不换行_vscode大括号不换行-CSDN博客 Clang_format_style {BasedOnStyle: Chromium, IndentWidth: 4}

12.30 Redis网络模型基础 IO NIO多路复用

图片引用自黑马程序员redis 网络模型 上图引用自java guide javaguide NIO

基于Qt事件机制中的定时器事件的闹钟设计

目标 代码 pro文件 QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on …

PawSQL性能巡检平台 (3) - 慢查询采集和优化

在数据库运维管理中&#xff0c;慢查询一直是影响系统性能的重要因素。本文将详细介绍PawSQL数据库性能巡检平台在慢查询管理和优化方面的功能特性&#xff0c;帮助数据库管理员更好地应对性能挑战。 一、PawSQL巡检平台慢查询管理概述 PawSQL平台提供了全面的慢查询管理功能&…

检索增强生成(RAG)的全面综述:演进、当前格局与未来方向

摘要 https://arxiv.org/pdf/2410.12837 本文全面研究了检索增强生成&#xff08;RAG&#xff09;&#xff0c;追溯了其从基础概念到当前最先进技术的演变历程。RAG将检索机制与生成式语言模型相结合&#xff0c;以提高输出的准确性&#xff0c;从而解决了大型语言模型&#…

关于无线AP信道调整的优化(锐捷)

目录 一、信道优化的基本原则二、2.4G频段信道优化三、5G频段信道优化四、信道优化代码具体示例五、其他优化措施 一、信道优化的基本原则 信道优化旨在减少信道间的干扰&#xff0c;提高网络覆盖范围和信号质量。基本原则包括&#xff1a; 1. 选择合适的信道&#xff1a;根据…

拓展C盘内存的方法(C盘旁边不一定是D盘)

问题&#xff1a; 比如&#xff1a;windows现在C盘200GB&#xff0c;D盘600GB&#xff0c;准备额外拓展一个新的盘2TB&#xff0c;如何把新的盘中500GB拓展到C盘中 总结&#xff1a; 通过磁盘管理&#xff1a;如果C盘旁边有未分配空间&#xff0c;可以直接使用“扩展卷”功能…

基于springboot的膳食问答系统的设计与实现

摘 要 本文介绍了一个基于SpringBoot框架的膳食问答系统&#xff0c;该系统融合了文章查看、膳食问答、用户管理、文章管理、知识点管理、系统日志查看、在线用户查看以及办公管理等多项功能。系统采用主流界面设计风格&#xff0c;前端使用HTML构建用户界面&#xff0c;后端则…

如何在LabVIEW中更好地使用ActiveX控件?

在LabVIEW中&#xff0c;ActiveX控件可以帮助实现与其他应用程序或第三方组件的集成&#xff08;例如Microsoft Excel、Word、Internet Explorer等&#xff09;。以下是一些建议&#xff0c;帮助您更好地在LabVIEW中使用ActiveX控件&#xff1a; ​ 1. 理解ActiveX控件的基本原…

使用套接字创建一个服务端,创建一个客户端然后相互通讯

以下是对上述代码的详细解释&#xff1a; #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>#include <stdio.h> #include <stdlib.h> #include <string.h&…

17.3、网络安全应急响应技术与常见的工具

目录 应急响应常用技术分类信息系统容灾恢复入侵取证过程网络安全应急响应参考案例——阿里云安全应急响应服务阿里云应急响应服务网络安全应急响应参考案例—永恒之蓝Wannacry 应急响应常用技术分类 一共五个类别&#xff0c;访问控制、安全评估系统&#xff0c;恢复、安全监测…

MySQL系列之数据类型(String)

导览 前言一、字符串类型知多少 1. 类型说明2. 字符和字节的转换 二、字符串类型的异同 1. CHAR & VARCHAR2. BINARY & VARBINARY3. BLOB & TEXT4. ENUM & SET 结语精彩回放 前言 MySQL数据类型第三弹闪亮登场&#xff0c;欢迎关注O。 本篇博主开始谈谈MySQ…

Ubuntu24.04最新版本安装详细教程

Ubuntu 24.04 LTS发布说明 推荐的系统配置要求&#xff1a; 双核2 GHz处理器或更高 4 GB系统内存 25 GB磁盘存储空间 可访问的互联网 光驱或USB安装介质 Ubuntu 24.04官方下载网址&#xff1a;https://cn.ubuntu.com/download/desktop 04. Ubuntu 22.04(创建虚拟机方式一) 4…

03-系统调用

一、系统调用的概述 1.系统调用介绍 系统调用是操作系统提供给用户用来操作内核服务的一组接口&#xff08;函数&#xff09;的统称。 为什么要通过系统调用来访问系统资源&#xff1f; 因为系统资源不希望被用户随意访问&#xff0c;可能造成各种意想不到的错误&#xff0c;…