1905电影网中国地区电影数据分析(一) - 数据采集、清洗与存储

文章目录

  • 前言
  • 一、数据采集步骤及python库使用版本
    • 1. python库使用版本
    • 2. 数据采集步骤
  • 二、数据采集网页分析
    • 1. 分析采集的字段和URL
      • 1.1 分析要爬取的数据字段
      • 1.2 分析每部电影的URL
      • 1.2 分析每页的URL
    • 2. 字段元素标签定位
  • 三、数据采集代码实现
    • 1. 爬取1905电影网分类信息
    • 2. 爬取电影主页HTML
    • 3. 解析html并把数据保存到csv文件
  • 四、数据清洗与存储代码实现


前言

本项目旨在通过爬取1905电影网的电影数据,展示如何使用Python及相关库进行网页数据采集。本项目将详细介绍数据采集的步骤,包括所需的Python库版本、网页分析、数据提取和保存等环节。我们将使用requests库进行网络请求,利用BeautifulSoup进行HTML解析,并将最终的数据保存为CSV文件,便于后续分析和处理。


一、数据采集步骤及python库使用版本

1. python库使用版本

pythonrequestsbs4beautifulsoup4soupsievelxmlpandassqlalchemymysql-connector-pythonselenium
版本3.8.52.31.00.0.24.12.32.64.9.32.0.32.0.369.0.04.15.2

2. 数据采集步骤

进入1905电影网中国地区电影网页
分析电影分页的URL
保存电影分页为HTML文件
从电影分页的HTML文件中解析出每部电影的URL
保存每部电影主页为HTML文件
从每部电影主页的HTML文件解析出需要的数据
把解析出的数据保存到CSV文件中

二、数据采集网页分析

1. 分析采集的字段和URL

1.1 分析要爬取的数据字段

如下图所示,红框部分是要爬取的数据,包含电影标题、电影类型、电影时长、电影片名、电影别名、电影上映时间、电影编剧、电影导演、电影主演、电影剧情等字段。

在这里插入图片描述

1.2 分析每部电影的URL

访问中国地区的电影地址:https://www.1905.com/mdb/film/list/country-China/

如下图所示,电影是分页显示,每一页有多部电影,点击单部电影后会调转到对应主页,在对应的主页就有需要爬取的数据,所以需要从每页中解析出单个电影的URL。

在这里插入图片描述

如下图所示,检查单部电影的源码后可以看到对应的URL。
复制该部电影的URL为:https://www.1905.com/mdb/film/2248201/(2248201是这部电影的ID)
那么就可以通过解析网页获取到每部电影的URL。

在这里插入图片描述

1.2 分析每页的URL

如下图所示,检查源码后发现如下规律:
第二页的URL为:https://www.1905.com/mdb/film/list/country-China/o0d0p2.html
第三页的URL为:https://www.1905.com/mdb/film/list/country-China/o0d0p3.html
第四页的URL为:https://www.1905.com/mdb/film/list/country-China/o0d0p4.html
第五页的URL为:https://www.1905.com/mdb/film/list/country-China/o0d0p5.html

由此推断出:
第一页的URL为:https://www.1905.com/mdb/film/list/country-China/o0d0p1.html(o0d0p1.html可省略)
第n页的URL为:https://www.1905.com/mdb/film/list/country-China/o0d0p{n}.html

在这里插入图片描述

2. 字段元素标签定位

示例:定位电影标题元素
定位后的CSS选择器内容为:

body > div.topModule.normalCommon.normal_oneLine > div > div > div.topModule_title.clearfix > div.topModule_title_left.fl > h3 > span

在这里插入图片描述


三、数据采集代码实现

1. 爬取1905电影网分类信息

import random
import time
from pathlib import Pathimport pandas as pd
import requests
from bs4 import BeautifulSoup'''
爬取1905电影网分类信息(大分类 main_category,小分类 sub_category,链接 sub_category_link)
'''def get_request(url, **kwargs):time.sleep(random.uniform(0.1, 2))print(f'===============================请求地址:{url} ===============================')# 定义一组User-Agent字符串user_agents = [# Chrome'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36',# Firefox'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/117.0','Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/117.0',# Edge'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2040.0',# Safari'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15',]# 请求头headers = {'User-Agent': random.choice(user_agents)}# 用户名密码认证(私密代理/独享代理)username = ""password = ""proxies = {"http": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password,"proxy": '36.25.243.5:11768'},"https": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password,"proxy": '36.25.243.5:11768'}}max_retries = 3for attempt in range(max_retries):try:response = requests.get(url=url, timeout=10, headers=headers, **kwargs)# response = requests.get(url=url, timeout=10, headers=headers, proxies=proxies, **kwargs)if response.status_code == 200:return responseelse:print(f"请求失败,状态码: {response.status_code},正在重新发送请求 (尝试 {attempt + 1}/{max_retries})")except requests.exceptions.RequestException as e:print(f"请求过程中发生异常: {e},正在重新发送请求 (尝试 {attempt + 1}/{max_retries})")# 如果不是最后一次尝试,则等待一段时间再重试if attempt < max_retries - 1:time.sleep(random.uniform(1, 2))print('================多次请求失败,请查看异常情况================')return None  # 或者返回最后一次的响应,取决于你的需求def get_soup(markup):return BeautifulSoup(markup=markup, features='lxml')def save_categories_to_csv(response, csv_file_dir='./data_csv/', csv_file_name='category.csv'):"""从HTML响应中提取分类信息并保存到CSV文件。参数:response (requests.Response): 包含HTML内容的响应对象。csv_file_dir (str): CSV文件存储目录,默认为'./data_csv/'。csv_file_name (str): CSV文件名,默认为'category.csv'。"""# 确保目录存在csv_file_dir_path = Path(csv_file_dir)csv_file_dir_path.mkdir(parents=True, exist_ok=True)# 解析HTML文档soup = get_soup(response.text)# 提取分类信息data_list = []tag_srh_group = soup.select("body > div.layout.mainCont.clear > div.leftArea > div > div.col-l-bd > dl.srhGroup.clear")for tag_srh in tag_srh_group:tag_dt = tag_srh.select_one('dt')main_category = tag_dt.text.strip() if tag_dt is not None else Nonetag_a_list = tag_srh.select('a')print(f'===========================解析后的数据如下:===========================')for tag_a in tag_a_list:if tag_a is not None:sub_category = tag_a.text.strip()sub_category_link = 'https://www.1905.com' + tag_a.get('href', '')data_dict = {'main_category': main_category,'sub_category': sub_category,'sub_category_link': sub_category_link}data_list.append(data_dict)print(data_dict)# 创建DataFrame并清理数据df = pd.DataFrame(data_list)df_cleaned = df[df['sub_category'].notna() & (df['sub_category'] != '')]print(f'===========================文件保存路径:{csv_file_dir + csv_file_name}===========================')# 保存到CSV文件df_cleaned.to_csv(csv_file_dir + csv_file_name, index=False, encoding='utf-8-sig')if __name__ == '__main__':res = get_request("https://www.1905.com/mdb/film/search/")save_categories_to_csv(res)

保存后的文件内容如下图所示:

在这里插入图片描述

2. 爬取电影主页HTML

import random
import time
from pathlib import Pathimport requests
from bs4 import BeautifulSoupdef get_request(url, **kwargs):time.sleep(random.uniform(0.1, 2))print(f'===============================请求地址:{url} ===============================')# 定义一组User-Agent字符串user_agents = [# Chrome'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36',# Firefox'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/117.0','Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/117.0',# Edge'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2040.0',# Safari'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15',]# 请求头headers = {'User-Agent': random.choice(user_agents)}# 用户名密码认证(私密代理/独享代理)username = ""password = ""proxies = {"http": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password,"proxy": '36.25.243.5:11768'},"https": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password,"proxy": '36.25.243.5:11768'}}max_retries = 3for attempt in range(max_retries):try:response = requests.get(url=url, timeout=10, headers=headers, **kwargs)# response = requests.get(url=url, timeout=10, headers=headers, proxies=proxies, **kwargs)if response.status_code == 200:return responseelse:print(f"请求失败,状态码: {response.status_code},正在重新发送请求 (尝试 {attempt + 1}/{max_retries})")except requests.exceptions.RequestException as e:print(f"请求过程中发生异常: {e},正在重新发送请求 (尝试 {attempt + 1}/{max_retries})")# 如果不是最后一次尝试,则等待一段时间再重试if attempt < max_retries - 1:time.sleep(random.uniform(1, 2))print('================多次请求失败,请查看异常情况================')return None  # 或者返回最后一次的响应,取决于你的需求def get_soup(markup):return BeautifulSoup(markup=markup, features='lxml')def save_html_file(save_dir, file_name, content):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(content))def save_rough_html_file():i = 0save_dir = './rough_html/china/'while True:i = i + 1file_name = f'o0d0p{i}.html'file_path = Path(save_dir + file_name)if file_path.exists() and file_path.is_file():print(f'===============================文件 {file_path} 已存在===============================')continueurl = f'https://www.1905.com/mdb/film/list/country-China/o0d0p{i}.html'response = get_request(url)soup = get_soup(response.text)tag_ul = soup.select_one('body > div.layout.mainCont.clear > div.leftArea > ul')if tag_ul.text.strip() is None or tag_ul.text.strip() == '':print(f'===============================网页爬取完成===============================')breaksave_html_file(save_dir, file_name, response.text)def save_detail_info_html_file():i = 0save_dir = './detail_html/china/'while True:i = i + 1url = f'https://www.1905.com/mdb/film/list/country-China/o0d0p{i}.html'response = get_request(url)soup = get_soup(response.text)tag_ul = soup.select_one('body > div.layout.mainCont.clear > div.leftArea > ul')if tag_ul.text.strip() is None or tag_ul.text.strip() == '':print(f'===============================网页爬取完成===============================')breaktag_li_list = tag_ul.select('li')for tag_li in tag_li_list:tag_a_href = tag_li.find('a').attrs.get('href')movie_url = f'https://www.1905.com{tag_a_href}'movie_id = tag_a_href.split('/')[-2]file_name = f'{movie_id}.html'file_path = Path(save_dir + file_name)if file_path.exists() and file_path.is_file():print(f'===============================文件 {file_path} 已存在===============================')continuedetail_response = get_request(movie_url)if detail_response is None:continuesave_html_file(save_dir, file_name, detail_response.text)if __name__ == '__main__':# save_rough_html_file()save_detail_info_html_file()

爬取后保存的部分html文件如下图所示:

在这里插入图片描述

3. 解析html并把数据保存到csv文件

from pathlib import Pathimport pandas as pd
from bs4 import BeautifulSoupdef get_soup(markup):return BeautifulSoup(markup=markup, features='lxml')def parse_detail_html_to_csv():# 定义CSV文件路径csv_file_dir = '../1905movie/data_csv/'csv_file_name = 'detail_1905movie_dataset.csv'csv_file_path = Path(csv_file_dir + csv_file_name)csv_file_dir_path = Path(csv_file_dir)csv_file_dir_path.mkdir(parents=True, exist_ok=True)detail_dir = Path('./detail_html/china/')detail_file_list = detail_dir.rglob('*.html')movie_data_list = []i = 0count = 0for detail_file in detail_file_list:movie_id = str(detail_file).split('\\')[-1].split('.')[0]movie_url = f'https://www.1905.com/mdb/film/{movie_id}/'soup = get_soup(open(file=detail_file, mode='r', encoding='utf-8'))tag_img_url = soup.select_one('div.topModule_bottom_poster.picHover.fl img')movie_img_url = tag_img_url.attrs.get('src') if tag_img_url is not None else Nonetag_div_topmodule_title_right = soup.select_one('div.topModule_title_right.fr')tag_evaluation_name = tag_div_topmodule_title_right.select_one('div.evaluation-name')tag_judge_soon_fl = tag_div_topmodule_title_right.select_one('div.judge-soon.fl')movie_rating = tag_evaluation_name.text if tag_evaluation_name is not None else Nonemovie_status = tag_judge_soon_fl.text if tag_judge_soon_fl is not None else '已上映'tag_topmodule_title_left_fl = soup.select_one('div.topModule_title_left.fl')tag_h3_span = tag_topmodule_title_left_fl.select_one('h3 > span')movie_title = tag_h3_span.text if tag_h3_span is not None else Nonetag_li = tag_topmodule_title_left_fl.select_one('li.topModule_line')movie_genres = str(tag_li.find_next_sibling('li').text.strip()).split() if tag_li is not None else Nonetag_li5 = tag_topmodule_title_left_fl.select_one('div > ul > li:nth-child(5)')movie_duration = tag_li5.text.strip() if tag_li5 is not None else Nonetag_div_left_top = soup.select_one('div#left_top')tag_ul_consmodule_infos = tag_div_left_top.select_one('ul.consModule_infos.consModule_infos_l.fixedWidth.fl') if tag_div_left_top is not None else Nonetag_li_em_release_date = tag_ul_consmodule_infos.find(name='span',string='上映时间') if tag_ul_consmodule_infos is not None else Nonemovie_release_date = tag_li_em_release_date.find_next_sibling().text.strip() if tag_li_em_release_date is not None else Nonetag_li_em_director = tag_ul_consmodule_infos.select_one('li > em > a') if tag_ul_consmodule_infos is not None else Nonemovie_director = tag_li_em_director.text.strip() if tag_li_em_director is not None else Nonetag_ul_consmodule_infos_r = tag_div_left_top.select_one('ul.consModule_infos.consModule_infos_r.fl') if tag_div_left_top is not None else Nonetag_alternative_titles = tag_ul_consmodule_infos_r.select_one('li > em') if tag_ul_consmodule_infos_r is not None else Nonemovie_alternative_titles = tag_alternative_titles.text if tag_alternative_titles is not None else Nonetag_adaptation_source = tag_ul_consmodule_infos_r.find(name='span',string='改编来源') if tag_ul_consmodule_infos_r is not None else Nonemovie_adaptation_source = tag_adaptation_source.find_next_sibling().text if tag_adaptation_source is not None else Nonetag_screenwriter = tag_ul_consmodule_infos_r.select_one('li > em > a') if tag_ul_consmodule_infos_r is not None else Nonemovie_screenwriter = tag_screenwriter.text if tag_screenwriter is not None else Nonetag_lead_actors = soup.select_one('#left_top > div > ul > li')tag_lead_actors_a_list = tag_lead_actors.select('a') if tag_lead_actors is not None else Nonemovie_lead_actors = [tag.text for tag in tag_lead_actors_a_list] if tag_lead_actors_a_list is not None else []tag_plot = soup.select_one('#left_top > ul > li.plotItem.borderStyle > div > a')movie_plot = tag_plot.text if tag_plot is not None else Nonemovie_data_dict = {'movie_id': movie_id,'movie_url': movie_url,'movie_img_url': movie_img_url,'movie_duration': movie_duration,'movie_title': movie_title,'movie_director': movie_director,'movie_release_date': movie_release_date,'movie_status': movie_status,'movie_rating': movie_rating,'movie_genres': movie_genres,'movie_lead_actors': movie_lead_actors,'movie_alternative_titles': movie_alternative_titles,'movie_adaptation_source': movie_adaptation_source,'movie_screenwriter': movie_screenwriter,'movie_plot': movie_plot}i = i + 1print(f'===============================第{i}行数据,解析后的数据如下:===============================')print(movie_data_dict)print('=============================================================================================')movie_data_list.append(movie_data_dict)count = count + 1if count == 200:df = pd.DataFrame(movie_data_list)if not csv_file_path.exists():df.to_csv(csv_file_dir + csv_file_name, index=False, encoding='utf-8-sig')else:df.to_csv(csv_file_dir + csv_file_name, index=False, encoding='utf-8-sig', mode='a', header=False)movie_data_list = []count = 0print(f'===============================解析后的电影数据已保存到 {csv_file_dir + csv_file_name} 文件===============================')if count != 0:df = pd.DataFrame(movie_data_list)df.to_csv(csv_file_dir + csv_file_name, index=False, encoding='utf-8-sig', mode='a', header=False)print(f'===============================解析后的电影数据已全部保存到 {csv_file_dir + csv_file_name} 文件===============================')if __name__ == '__main__':parse_detail_html_to_csv()

保存后的文件内容如下图:

在这里插入图片描述


四、数据清洗与存储代码实现

import re
from datetime import datetimeimport pandas as pd
from sqlalchemy import create_enginedef read_csv_to_df(file_path):# 加载CSV文件到DataFramereturn pd.read_csv(file_path, encoding='utf-8')def contains_hours(text):if pd.isna(text):  # 检查是否为 NaN 或 Nonereturn Falsepattern = r'\d+\s*(小时|h|hours?|hrs?)'return bool(re.search(pattern, text))def convert_to_minutes(duration_str):parts = str(duration_str).replace('小时', ' ').replace('分钟', '').split()hours = int(parts[0]) if len(parts) > 0 else 0minutes = int(parts[1]) if len(parts) > 1 else 0return hours * 60 + minutes# 定义一个函数来清理和标准化日期
def clean_and_standardize_date(date_str):date_str_cleaned = str(date_str)# 移除括号及其内容if '(' in date_str_cleaned:date_str_cleaned = date_str.split('(')[0]# 尝试匹配并解析完整的日期格式if "年" in date_str_cleaned and "月" in date_str_cleaned and "日" in date_str_cleaned:date_obj = datetime.strptime(date_str_cleaned, "%Y年%m月%d日")elif "年" in date_str_cleaned and "月" in date_str_cleaned:date_obj = datetime.strptime(date_str_cleaned, "%Y年%m月")date_obj = date_obj.replace(day=1)  # 设置为该月的第一天elif "年" in date_str_cleaned:date_obj = datetime.strptime(date_str_cleaned, "%Y年")date_obj = date_obj.replace(month=1, day=1)  # 设置为该年的第一天else:return None  # 如果不符合任何已知模式,则返回 None 或其他默认值return date_obj.strftime("%Y-%m-%d")  # 返回标准格式的字符串# 定义函数:清理和转换数据格式
def clean_and_transform(df):# 筛选出电影状态为“已上映”的数据df = df[df['movie_status'] == '已上映']# 删除电影标题为空的行df.dropna(subset=['movie_title'], inplace=True)# 删除id相同的数据df.drop_duplicates(subset=['movie_id'], inplace=True)# 电影时长字段处理df['movie_duration'] = df['movie_duration'].apply(lambda x: x if contains_hours(x) else None)if df['movie_duration'].isnull().sum() != 0:df['movie_duration'] = df['movie_duration'].fillna(method='ffill')df['movie_duration'] = df['movie_duration'].apply(convert_to_minutes)# 发布日期字段处理df['movie_release_date'] = df['movie_release_date'].apply(clean_and_standardize_date)if df['movie_release_date'].isnull().sum() != 0:df['movie_release_date'] = df['movie_release_date'].fillna(method='ffill')# 评分字段处理df['movie_rating'] = df['movie_rating'].astype('float').round(1)if df['movie_rating'].isnull().sum() != 0:df['movie_rating'] = df['movie_rating'].interpolate()# 类型字段处理if df['movie_genres'].isnull().sum() != 0:df['movie_genres'] = df['movie_genres'].fillna(method='ffill')# 其他空值字段处理df = df.fillna('未知')return dfdef save_df_to_db(df):# 设置数据库连接信息db_user = 'root'db_password = 'zxcvbq'db_host = '127.0.0.1'  # 或者你的数据库主机地址db_port = '3306'  # MySQL默认端口是3306db_name = 'movie1905'# 创建数据库引擎engine = create_engine(f'mysql+mysqlconnector://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}')# 将df写入MySQL表df.to_sql(name='movie1905_china', con=engine, if_exists='replace', index=False)print("所有csv文件的数据已成功清洗并写入MySQL数据库")if __name__ == '__main__':csv_file = r'./data_csv/detail_1905movie_dataset.csv'dataframe = read_csv_to_df(csv_file)dataframe = clean_and_transform(dataframe)save_df_to_db(dataframe)

清洗并存储后的部分数据如下图所示:

在这里插入图片描述

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

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

相关文章

【25】Word:林涵-科普文章❗

目录 题目​ NO1.2.3 NO4.5.6 NO7.8 NO9.10 NO11.12 不连续选择&#xff1a;按住ctrl按键&#xff0c;不连续选择连续选择&#xff1a;按住shift按键&#xff0c;选择第一个&#xff0c;选择最后一个。中间部分全部被选择 题目 NO1.2.3 布局→纸张方向&#xff1a;横向…

P6周:VGG-16算法-Pytorch实现人脸识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 我的环境 语言环境&#xff1a;Python 3.8.12 编译器&#xff1a;jupyter notebook 深度学习环境&#xff1a;torch 1.12.0cu113 一、前期准备 1.设置GPU im…

【Rust自学】14.4. 发布crate到crates.io

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 14.4.1. 创建并设置crates.io账号 在发布任何 crate 之前&#xff0c;你需要在 crates.io并…

数据结构——实验八·学生管理系统

嗨~~欢迎来到Tubishu的博客&#x1f338;如果你也是一名在校大学生&#xff0c;正在寻找各种编程资源&#xff0c;那么你就来对地方啦&#x1f31f; Tubishu是一名计算机本科生&#xff0c;会不定期整理和分享学习中的优质资源&#xff0c;希望能为你的编程之路添砖加瓦⭐&…

IBM湖仓一体与向量数据库:访问MinIO控制台(Accessing the MinIO console)

_1、从密钥中复制S3凭证并保存 &#xff08;Copy the S3 credentials from the secret and save it &#xff09; oc extract secret/ibm-lh-config-secret -n ${PROJECT_CPD_INST_OPERANDS} --to- --keysenv.properties | grep -E "LH_S3_ACCESS_KEY|LH_S3_SECRET_KEY&q…

Ragas-RAG能力评测

Ragas是一个框架&#xff0c;它可以帮助你从不同的方面评估你的问答&#xff08;QA&#xff09;流程。它为你提供了一些指标来评估你的问答系统的不同方面&#xff0c;具体包括&#xff1a; 评估检索&#xff08;context&#xff09;的指标&#xff1a;提供了上下文相关性&…

基于ESP32-IDF驱动GPIO输出控制LED

基于ESP32-IDF驱动GPIO输出控制LED 文章目录 基于ESP32-IDF驱动GPIO输出控制LED一、点亮LED3.1 LED电路3.2 配置GPIO函数gpio_config()原型和头文件3.3 设置GPIO引脚电平状态函数gpio_set_level()原型和头文件3.4 代码实现并编译烧录 一、点亮LED 3.1 LED电路 可以看到&#x…

使用ffmpeg提高mp4压缩比,减小文件体积【windows+ffmpeg+batch脚本】

文章目录 关于前情提要FFmpeg是什么使用脚本运行FFmpeg首先&#xff0c;下载ffmpeg.exe然后在视频相同位置写一个bat脚本运行压缩脚本 关于 个人博客&#xff0c;里面偶尔更新&#xff0c;最近比较忙。发一些总结的帖子和思考。 江湖有缘相见&#x1f91d;。如果读者想和我交…

Vue3初学之Element Plus Dialog对话框,Message组件,MessageBox组件

Dialog的使用&#xff1a; 控制弹窗的显示和隐藏 <template><div><el-button click"dialogVisible true">打开弹窗</el-button><el-dialogv-model"dialogVisible"title"提示"width"30%":before-close&qu…

自然语言处理(NLP)-总览图学习

文章目录 自然语言处理&#xff08;NLP&#xff09;-总览图学习1.一张总览图的学习1. 语音学&#xff08;Phonology&#xff09;2. 形态学&#xff08;Morphology&#xff09;3. 句法学&#xff08;Syntax&#xff09;4. 语义学&#xff08;Semantics&#xff09;5. 推理&#…

机器学习 vs 深度学习

目录 一、机器学习 1、实现原理 2、实施方法 二、深度学习 1、与机器学习的联系与区别 2、神经网络的历史发展 3、神经网络的基本概念 一、机器学习 1、实现原理 训练&#xff08;归纳&#xff09;和预测&#xff08;演绎&#xff09; 归纳: 从具体案例中抽象一般规律…

谈谈RTMP|RTSP播放器视频view垂直|水平反转和旋转设计

技术背景 我们在做RTMP|RTSP播放器的时候&#xff0c;有这样的技术诉求&#xff0c;有的摄像头出来的数据是有角度偏差的&#xff0c;比如“装倒了”&#xff0c;或者&#xff0c;图像存在上下或者左右反转&#xff0c;这时候&#xff0c;就需要播放器能做响应的处理&#xff…

论文阅读--Qwen22.5技术报告

Qwen2 1 引言 所有模型都是在超过7 trillion token&#xff08;7万亿&#xff09;的高质量、大规模数据集上预训练的 2 Tokenizer & Model 2.1 Tokenizer 沿用Qwen&#xff08;Bai等人&#xff0c;2023a&#xff09;的做法&#xff0c;我们采用了基于字节级字节对编码…

FPGA中场战事

2023年10月3日,英特尔宣布由桑德拉里维拉(Sandra Rivera)担任“分拆”后独立运营的可编程事业部首席执行官。 从数据中心和人工智能(DCAI)部门总经理,转身为执掌该业务的CEO,对她取得像AMD掌门人苏姿丰博士类似的成功,无疑抱以厚望。 十年前,英特尔花费167亿美元真金白银…

【jmeter】下载及使用教程【mac】

1.安装java 打开 Java 官方下载网站https://www.oracle.com/java/technologies/downloads/选择您想要下载的 Java 版本&#xff0c;下载以 .dmg 结尾的安装包&#xff0c;注意 JMeter 需要 Java 8下载后打开安装包点击“安装”按钮即可 2.下载jmeter 打开 Apache JMeter 官方…

postman请求参数化

postman界面介绍 一、使用环境变量(Environment Variables)进行参数化 1、在请求中使用环境变量 在请求的url、请求头(Headers)、请求体(Body)等部分都可以使用环境变量。 URL 部分示例 点击 Postman 界面右上角的 “眼睛” 图标(Environment Quick Look)打开环境管理…

2024年博客之星年度评选|第一步——创作影响力评审入围Top300名单 | 博客之星陪跑指南

2024年博客之星年度评选&#xff5c;第一步——创作影响力评审入围Top300名单 | 博客之星陪跑指南 2024年博客之星年度评选正在如火如荼地进行中&#xff01;作为博客圈最具影响力的评选活动之一&#xff0c;今年的评选吸引了众多优秀博主的参与。现在&#xff0c;距离Top300入…

阻燃高温尼龙行业:市场潜力巨大,引领材料科学新变革

在当今快速发展的工业和材料科学领域&#xff0c;阻燃高温尼龙作为一种兼具卓越防火性能和高温稳定性的新型材料&#xff0c;正逐步成为多个领域的首选材料。随着全球对安全性能要求的提高和技术的不断创新&#xff0c;阻燃高温尼龙市场呈现出快速增长的态势&#xff0c;展现出…

HTML中的`<!DOCTYPE html>`是什么意思?

诸神缄默不语-个人CSDN博文目录 在学习HTML时&#xff0c;我们经常会看到HTML文档的开头出现<!DOCTYPE html>&#xff0c;它是HTML文件的第一行。很多初学者可能会疑惑&#xff0c;为什么需要这行代码&#xff1f;它到底有什么作用呢&#xff1f;在这篇文章中&#xff0…

系统学习算法:专题五 位运算

位运算总结&#xff08;默认学过位操作符的知识&#xff09;&#xff1a; 1. 这六种就是常见的位运算符&#xff0c;无进位相加就是在二进制中&#xff0c;两个数的某一位1和1可以进位&#xff0c;但是异或就不进位&#xff0c;相加后为0&#xff0c;跟相同为0&#xff0c;相异…