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。
一、使用版本
python | requests | bs4 | beautifulsoup4 | soupsieve | lxml | |
---|---|---|---|---|---|---|
版本 | 3.8.5 | 2.31.0 | 0.0.2 | 4.12.3 | 2.6 | 4.9.3 |
二、需求分析
进行分析的时候,首先在如下图网络
处分析,查找是否有获取数据的API接口;如果没有,再从页面元素标签上去分析。
1. 分析要爬取的内容
1.1 分析要爬取的分类
如下图所示,此处要爬取的是豆瓣电影排行榜的分类排行榜的每个分类下的所有数据。
右击剧情
,点击检查
。
可以看到他的链接地址标签<a href="/typerank?type_name=剧情&type=11&interval_id=100:90&action=">剧情</a>
,此地址中包含type_name
、type
、interval_id
、action
这几个参数。
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_id
和type
:是分类中的数据,需要从分析要爬取的分类获取。start=0
:指定从哪个位置开始获取电影列表。0意味着从第一条记录开始。如果你想要获取第二页的数据,你可以将此值设置为20(假设每页显示20条记录),以此类推。limit=20
:定义了一次请求返回的最大电影数量。这里是20,所以每次请求最多会返回20部电影的信息。
如上图所示,请求参数为:
payload = {'type': '11','interval_id': '100:90','action': '','start': '0','limit': '20'
}
2. 数据用途
2.1 统计分析
-
评分分布:
- 分析电影评分的分布情况,比如平均分、最高分、最低分等。
- 可以使用直方图或箱线图来可视化评分分布。
-
观看人数:
- 研究投票数(
vote_count
),了解该电影的受欢迎程度。 - 对比不同电影之间的投票数差异,找出最受欢迎的作品。
- 研究投票数(
-
类型偏好:
- 分析不同类型(
types
)的电影数量及其平均评分,判断观众对哪种类型的偏好。
- 分析不同类型(
-
地区影响:
- 探讨来自不同制作地区(
regions
)的电影在评分上的差异,以及各地区的贡献度。
- 探讨来自不同制作地区(
2.2 探索性数据分析 (EDA)
-
时间趋势:
- 根据发布日期(
release_date
)分析电影评分随时间的变化趋势,观察是否存在特定年代的高分电影聚集现象。
- 根据发布日期(
-
演员影响力:
- 分析主演(
actors
)参与的电影数量及平均评分,评估明星效应。 - 利用网络图展示演员间的合作关系,识别哪些演员经常合作。
- 分析主演(
-
导演/编剧风格:
- 如果有导演或编剧信息,可以进一步分析他们的作品特点,如评分、类型选择等。
2.3 高级分析
-
预测模型:
- 构建机器学习模型来预测电影评分,考虑因素包括演员阵容、类型、地区、上映日期等。
- 使用回归分析预测票房收入(如果有相关数据)。
-
文本挖掘与情感分析:
- 如果有评论数据,可以执行文本挖掘,提取热门话题、关键词等。
- 实施情感分析,评估观众对电影的整体态度是正面还是负面。
-
关联规则学习:
- 发现不同类型、演员、地区之间的关联模式,例如某些类型的电影是否更倾向于出现在特定地区。
-
聚类分析:
- 将电影根据其特征(如评分、类型、地区等)分为不同的群组,帮助理解市场细分。
-
社交网络分析:
- 建立演员、导演等创作人员之间的社交网络,分析合作频率和紧密度。
对于给定的数据片段,你还可以做如下具体操作:
- 计算评分的众数:从
rating
字段中解析出用户给出的具体分数,并计算最常见的评分。 - 检查播放状态的影响:对比
is_playable
为True和False的电影评分是否有显著区别。 - 查看封面图片的流行度:虽然这需要额外的数据源支持,但可以假设封面设计也会影响电影的关注度。
三、编写代码
1. 获取分类链接中的参数
爬取每个分类链接地址中的type_name
、type
、interval_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表。
字段名 | 数据类型 | 说明 |
---|---|---|
id | VARCHAR(20) | 主键,唯一标识符(例如豆瓣电影ID)。 |
title | VARCHAR(255) | 电影标题。 |
url | VARCHAR(255) | 电影详情页面URL。 |
cover_url | VARCHAR(255) | 电影封面图片URL。 |
release_date | DATE | 电影发布日期。 |
score | DECIMAL(3,1) | 电影评分(例如9.3)。 |
vote_count | INT | 投票人数。 |
actor_count | INT | 演员数量。 |
rank | INT | 排名。 |
is_playable | BOOLEAN | 是否可播放。 |
is_watched | BOOLEAN | 是否已观看。 |
rating | JSON | 评分详细信息,如[“9.3”, “50”],使用JSON类型存储数组。 |
types | JSON | 电影类型列表,如[“剧情”, “传记”, “历史”],使用JSON类型存储数组。 |
regions | JSON | 制片地区列表,如[“英国”, “意大利”, “中国大陆”, “法国”],使用JSON类型存储数组。 |
actors | JSON | 演员列表,如[“尊龙”, “陈冲”, “邬君梅”], 使用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;
相关文章:
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.添加-i 下载快: pip install onnxruntime-gpu==X.X.X -i https://pypi.tuna.tsinghua.edu.cn/simple 清华源 pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里源 pip install xxx -i https://mirrors.aliyun.com/pypi/simple 中科大源 pip install xxx -…...
手机实时提取SIM卡打电话的信令声音-智能拨号器的SIP线路-双卡双待单通方案
手机实时提取SIM卡打电话的信令声音 --智能拨号器的SIP线路-双卡双待单通方案 一、前言 蓝牙电话的技术方案最初是从蓝牙耳机和车机蓝牙的使用领域延伸出来的技术方式。通过蓝牙的HFP协议,把手机通话的声音和通话事件状态提取出来进行复用和处理。但中国大陆现行…...
LangChain教程 - 表达式语言 (LCEL) -构建智能链
系列文章索引 LangChain教程 - 系列文章 LangChain提供了一种灵活且强大的表达式语言 (LangChain Expression Language, LCEL),用于创建复杂的逻辑链。通过将不同的可运行对象组合起来,LCEL可以实现顺序链、嵌套链、并行链、路由以及动态构建等高级功能…...
pytorch学习笔记汇总
一.tensor创建 1.张量的定义 张量在形式上就是多维数组,例如标量就是0维张量,向量就是一维张量,矩阵就是二维张量,而三维张量就可以想象RGB图片,每个channel是一个二维的矩阵,共有三个channel࿰…...
uniapp配置文字艺术字体风格
1.vue配置 App.vue中: <style>/*每个页面公共css *//* 全局字体风格 */font-face {font-family: gufengFont;src: url(./static/font/gufeng.ttf) format(truetype);font-weight: normal;font-style: normal;} </style>页面中: .text1 {f…...
江科大学习笔记之——HAL库点亮一个LED灯
HAL三步走:1.建工程。2.设配置。3.写代码 一.建立工程 HAL库写法 点击FinIsh 2.配置时钟 2 、设置配置参数 把模块.C.h单独设置文件 生产代码 三写代码 控制GPIO就三步 1.RCC时钟使能 2.结构体配置GPIO寄存器 3.控制GPIO值 上面的步骤已经把前两步的配置完成了接下…...
java web项目软件自动生成使用初体验-帅帅软件生成平台ASoft
软件默认 登陆账号 admin 密码 123456 一、软件使用简介说 AI软件自动生成越来越成熟,但AI生成的软件代码只是片段化的,不成体系。有没有一款可以10-30分钟自动生成JAVA WEB休系的软件?我也找了好久,终于找到了,开发…...
损失函数-二分类和多分类
二分类和多分类的损失函数 二分类 损失函数 L ( y , y ^ ) − ( y l o g ( y ^ ) ) ( 1 − y ) l o g ( 1 − y ^ ) L(y,\hat{y}) -(ylog(\hat{y})) (1-y)log(1-\hat{y}) L(y,y^)−(ylog(y^))(1−y)log(1−y^) 其中真实标签表示为y(取值为 0 或 1&#…...
Springboot:后端接收数组形式参数
1、接收端写法 PermissionAnnotation(permissionName "",isCheckToken true)PostMapping("/batchDeleteByIds")public ReturnBean webPageSelf( NotNull(message "请选择要删除的单据!") Long[] ids) {for (Long string : ids) {l…...
CSS系列(46)-- Color Functions详解
前端技术探索系列:CSS Color Functions详解 🎨 致读者:探索颜色函数的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS Color Functions,这个强大的颜色处理特性。 基础函数 🚀 颜色空间 /…...
MySQL数据库误删恢复_mysql 数据 误删
2、BigLog日志相关 2.1、检查biglog状态是否开启 声明: 当前为mysql版本5.7 当前为mysql版本5.7****当前为mysql版本5.7 2.1.1、Navicat工具执行 SHOW VARIABLES LIKE LOG_BIN%;OFF 是未开启状态,如果不是ON 开启状态需要开启为ON。{默认情况下就是关闭状态} 2.…...
ModiLeo交易平台:引领数字货币交易新未来
在当今数字化高速发展的时代,数字货币作为一种新兴的金融资产形式,正逐渐改变着全球金融格局。而此刻,由印度 ModiLeo 实验室联合全球顶级投行共同打造的全球领先的一站式数字货币交易平台——ModiLeo 即将上线,这无疑是数字货币领…...
57.插入区间 python
插入区间 题目题目描述示例 1:示例 2:提示: 题解解题思路python实现代码解释提交结果 题目 题目描述 给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] [starti, endi] 表示第 i 个…...
使用WebRTC进行视频通信
一、WebRTC技术简介 什么是WebRTC? 是一种支持浏览器之间实时音频、视频和数据传输的开放源代码项目。它允许开发者在不需要任何第三方插件或软件的情况下实现点对点的实时通信。WebRTC已经成为现代Web应用中的关键技术,为开发者提供了强大的工具和API…...
详细讲解axios封装与api接口封装管理
一、axios封装 axios是基于promise的http客户端,用于浏览器和nodejs发送http请求 ,对它进行封装主要是为了统一管理请求配置和处理请求和响应的通用逻辑等。以下是常用的封装逻辑和要点 1:引入axios相关依赖 首先引用项目中的axios库&…...
likeAdmin架构部署(踩坑后的部署流程
1、gitee下载 https://gitee.com/likeadmin/likeadmin_java.git 自己克隆 2、项目注意 Maven:>3.8 ❤️.9 (最好不要3.9已经试过失败 node :node14 (不能是18 已经测试过包打不上去使用14的换源即可 JDK:JDK8 node 需要换源 npm c…...
算法-回文数判断
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数 是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文,…...
力扣-数据结构-7【算法学习day.78】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?建议灵神的题单和代码随想录)和记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关…...
计算机组成原理的学习笔记(8)-- 指令系统·其一 指令的组成以及数据寻址方式/RISK和CISK
学习笔记 前言 本文主要是对于b站尚硅谷的计算机组成原理的学习笔记,仅用于学习交流。 1. 指令 1.1 组成 操作码(Opcode):指指令中执行特定操作的部分。地址码:指令中用于指定操作数位置的部分。 1.2 扩展操作…...
Hive刷分区MSCK
一、MSCK刷分区 我们平时通常是通过alter table add partition方式增加Hive的分区的,但有时候会通过HDFS put/cp命令或flink、flum程序往表目录下拷贝分区目录,如果目录多,需要执行多条alter语句,非常麻烦。Hive提供了一个"…...
2024年12月HarmonyOS应用开发者基础认证全新题库
注意事项:切记在考试之外的设备上打开题库进行搜索,防止切屏三次考试自动结束,题目是乱序,每次考试,选项的顺序都不同,如果有两台电脑设备建议一台打开题库一台考试,如果只有一台电脑设备建议手…...
集成方案 | Docusign + 蓝凌 EKP,打造一站式合同管理平台,实现无缝协作!
本文将详细介绍 Docusign 与蓝凌 EKP 的集成步骤及其效果,并通过实际应用场景来展示 Docusign 的强大集成能力,以证明 Docusign 集成功能的高效性和实用性。 在当今数字化办公环境中,企业对于提高工作效率和提升用户体验的需求日益迫切。蓝凌…...
centos7 免安装mysql5.7及配置(支持多个mysql)
一) 下载免安装包: mysql下载地址: https://dev.mysql.com/downloads/mysql/下载时,选择以前5.7版本: image 下载第一个TAR压缩包: image 二) 定义安装路径并解压安装包 1、假设需要把MySQL放到 /usr/local…...
【若依框架】代码生成详细教程,15分钟搭建Springboot+Vue3前后端分离项目,基于Mysql8数据库和Redis5,管理后台前端基于Vue3和Element Plus,开发小程序数据后台
今天我们来借助若依来快速的搭建一个基于springboot的Java管理后台,后台网页使用vue3和 Element Plus来快速搭建。这里我们可以借助若依自动生成Java和vue3代码,这就是若依的强大之处,即便你不会Java和vue开发,只要跟着石头哥也可…...
什么是容器?
什么是容器? 容器是一种虚拟化技术,用于将应用程序及其所有依赖项打包在一起,以便在不同的计算环境中进行移植和运行。容器提供了一种隔离的运行环境,使不同应用程序能够在独立的文件系统、网络和进程空间等独立运行环境中运行&a…...
苍穹外卖——准备工作
模块介绍 后端的工程基于Maven进行项目构建,并且进行分模块开发,我们创建四个模块: sky-take-out:maven父工程,统一管理依赖版本,聚合其他子模块sky-common:子模块,存放公共类&…...
LLMs之o3:《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读
LLMs之o3:《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读 导读:2024年12月,这篇论文提出了一种名为“审慎式对齐 (Deliberative Alignment)”的新方法,旨在提高大型语言模型 (LLM) 的安全性。论…...
百度二面,MySQL 怎么做权重搜索?
考虑这样一个搜索需求,有一个 MySQL 表,表中很多个列存放着不同的内容,希望用户通过关键词进行搜索的时候,能够模糊匹配多个列,比如有 t1 列、t2 列、t3 列,同时还希望 t1 列的匹配权重最高,t3 …...
PHP:IntelliJ IDEA 配置 PHP 开发环境及导入PHP项目
在创建PHP项目之前我们需要安装PHP插件,安装步骤如下:Windows:IntelliJ IDEA Ultimate 安装 PHP 插件-CSDN博客 1、导入已有PHP项目,导入之后选择,File > Setting 选择对应CLL Interpreter,如果没有操作…...
国产数据库TiDB从入门到放弃教程
国家层面战略,安全的角度,硬件、软件国产化是趋势,鸿蒙电脑操作系统、鸿蒙手机操作系统…数据库也会慢慢国产化,国产数据库TiDB用起来比OceanBase丝滑,本身没有那么重。 从入门到放弃 1. 介绍1.1 TiDB 的主要特点1.2 T…...
Android 自定义控件
目录 Android 自定义控件 一、什么是自定义控件 二、创建自定义控件的常见方式 2.1继承现有控件(如 Button、TextView 等) 2.2直接继承 View 类 2.3组合控件 三、自定义控件的基本步骤 3.1创建一个继承自 View 或现有控件的类 3.2重写 onDraw()…...
学习笔记 --C#基础其他知识点(同步和异步)
C#中的同步和异步《一》 以下理解借鉴博客:借鉴博客地址1 异步编程(Asynchronous) 允许任务在后台执行,而不会阻塞调用线程。C#使用async和await关键字 async Task AsynchronousMethod() {// 等待异步操作完成await Task.Dela…...
药片缺陷检测数据集,8625张图片,使用YOLO,PASICAL VOC XML,COCO JSON格式标注,可识别药品是否有缺陷,是否完整
药片缺陷检测数据集,8625张图片,使用YOLO,PASICAL VOC XML,COCO JSON格式标注,可识别药品是否有缺陷,是否完整 有缺陷的标注信息: 无缺陷的标注信息 数据集下载: yolov11:https://d…...
Hive如何创建自定义函数(UDF)?
目录 1 自定义UDF函数基础 2 自定义UDF函数案例 3 创建临时函数 4 创建永久函数 1 自定义UDF函数基础 1. 内置函数:Hive 自带了一些函数...
深入理解MVCC:快照读与当前读的原理及实践
一、引言 MVCC是数据库系统中一种常见的并发控制技术,它允许多个事务同时对同一数据进行读取和修改,而不会相互干扰。在MVCC中,数据行存在多个版本,每个版本对应一个事务。本文将重点讨论MVCC中的两种读取方式:快照读…...
活动预告 |【Part1】Microsoft Azure 在线技术公开课:数据基础知识
课程介绍 参加“Azure 在线技术公开课:数据基础知识”活动,了解有关云环境和数据服务中核心数据库概念的基础知识。通过本次免费的介绍性活动,你将提升在关系数据、非关系数据、大数据和分析方面的技能。 活动时间:01 月 07 日…...
小程序笔记
1.小程序全局配置app.json {"pages":["pages/index/index","pages/logs/logs"],"window":{"backgroundTextStyle":"light","navigationBarBackgroundColor": "#fff","navigationBarTit…...
linux安装nginxs报错:openssl not found
系统: linux 版本:centOS7 nginx版本:nginx-1.20.2 linux安装nginx时 执行下面命令时报错: ./configure --with-http_stub_status_module --with-http_ssl_module --prefix/usr/local/nginxchecking for OpenSSL library ... not …...
Vite内网ip访问,两种配置方式和修改端口号教程
目录 问题 两种解决方式 结果 总结 preview.host preview.port 问题 使用vite运行项目的时候,控制台会只出现127.0.0.1(localhost)本地地址访问项目。不可以通过公司内网ip访问,其他团队成员无法访问,这是因为没…...
地理数据库Telepg面试内容整理-如何在高并发情况下保证GIS服务的高可用性?
在高并发情况下,保证 GIS 服务的高可用性是一个重要的挑战,尤其是当空间数据量巨大、请求频繁时。为了确保 GIS 服务的高可用性和稳定性,需要考虑以下几个方面: 分布式架构设计 分布式架构通过将工作负载分配到多个服务器上,能够大大提高服务的可用性和扩展性。通过设计高…...
ES中查询中参数的解析
目录 query中参数match参数match_allmatch:匹配指定参数match_phrase query中其他的参数query_stringprefix前缀查询:wildcard通配符查询:range范围查询:fuzzy 查询: 组合查询bool参数mustmust_notshould条件 其他参数 query中参数 词条查询term:它仅匹配在给定字段…...
【Java 数据结构】合并两个有序链表
🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 题目 2. 解析 3. 代码实现 4. 小结 1. 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示…...
OpenCV-Python实战(8)——图像变换
一、缩放 cv2.resize() img cv2.resize(src*,dsize*,fx*,fy*,interpolation*) img:目标图像。 src:原始图像。 dsize:(width,height)图像大小。 fx、fy:可选参数,水平/垂直方向…...
深入浅出:从入门到精通大模型Prompt、SFT、RAG、Infer、Deploy、Agent
阅读原文 渐入佳境 我们都知道,通过编写一个提示词(prompt),我们可以引导大模型生成回答,从而开启愉快的人工智能对话,比如让模型介绍一下卡皮巴拉。上边简图描述了这个过程,我们拆成两部分 pr…...
GXUOJ-算法-第二次作业(矩阵连乘、最长公共子序列、0-1背包问题、带权区间调度)
1.矩阵连(链)乘 问题描述 GXUOJ | 矩阵连乘 代码解答 #include<bits/stdc.h> using namespace std;const int N50; int m[N][N]; int p[N]; int n;int main(){cin>>n;//m[i][j] 存储的是从第 i 个矩阵到第 j 个矩阵这一段矩阵链相乘的最小…...
生态碳汇涡度相关监测与通量数据分析实践技术应用
1.以涡度通量塔的高频观测数据为例,基于MATLAB开展上机操作: 2.涡度通量观测基本概况:观测技术方法、数据获取与预处理等 3.涡度通量数据质量控制:通量数据异常值识别与剔除等 4.涡度通量数据缺失插补:结合气象数据…...
使用OpenAI、LangChain、MongoDB构建一个AI agent
LangChain真是好起来了。24年中的时候用LangChain V2差点把我气死,现在V3用起来开始真香了~ 像 ChatGPT、Gemini 和 Claude 这样的大模型已成为企业必不可少的工具。如今,几乎每家公司都希望根据自己的需求或客户群体,开发一款定制化的AI Age…...
如何在 Ubuntu 22.04 上安装并开始使用 RabbitMQ
简介 消息代理是中间应用程序,在不同服务之间提供可靠和稳定的通信方面发挥着关键作用。它们可以将传入的请求存储在队列中,并逐个提供给接收服务。通过以这种方式解耦服务,你可以使其更具可扩展性和性能。 RabbitMQ 是一种流行的开源消息代…...
【ETCD】【实操篇(十九)】ETCD基准测试实战
目录 1. 设定性能基准要求2. 使用基准测试工具基准测试命令 3. 测试不同的负载和场景4. 监控集群性能5. 评估硬件和网络的影响6. 对比性能基准7. 负载均衡和容错能力测试8. 优化与调优9. 测试在高负载下的表现总结 1. 设定性能基准要求 首先,明确集群性能的目标&am…...