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

Python:抓取 Bilibili(B站)评论、弹幕、字幕等

        个人学习需求,需要获取一些 UGCuser generated content),包括 UP 的内容、弹幕、评论等。于是从 哔哩哔哩 (゜-゜)つロ 干杯~-bilibili 抓取了一些数据,以下内容仅供学习参考。

目录

1. Python 包:bilibili-api

1.1 bilibili-api

1.1.1 安装

1.1.2 示例

1.1.3 Credential

1.1.4 config.ini

2 自定义 Video 类

2.1 bvid

2.2 代码

2.2.1 get_video()

2.2.2 get_info()

2.2.3 get_comments()

2.2.4 get_sub_comments()

2.2.5 get_danmakus()

2.2.6 get_subtitle()

3 示例


1. Python 包:bilibili-api

        API 文档:bilibili-api 开发文档

        B站讲解视频,UP主:w海底捞不动w,【bilibili-api】爬取某个视频的所有评论 | python开发b站常用功能

1.1 bilibili-api

        引用开发文档中的简介。

这是一个用 Python 写的调用 Bilibili 各种 API 的库, 范围涵盖视频、音频、直播、动态、专栏、用户、番剧等。

        这里简单说明一些重要的内容,详细的内容可查看开发文档。

1.1.1 安装
pip3 install bilibili-api-python
1.1.2 示例

        粘贴开发文档中提供的代码。

import asyncio
from pprint import pprintfrom bilibili_api import videoasync def main() -> None:# 实例化 Video 类v = video.Video(bvid="BV1uv411q7Mv")# 获取信息info = await v.get_info()# 打印信息pprint(info)if __name__ == "__main__":asyncio.get_event_loop().run_until_complete(main())

        注:这里修改 print pprint,目的是更优雅的查看结果。结果如下,部分省略。

DeprecationWarning: There is no current event loopasyncio.get_event_loop().run_until_complete(main())
{'aid': 243922477,'argue_info': {'argue_link': '', 'argue_msg': '', 'argue_type': 0},'bvid': 'BV1uv411q7Mv','cid': 214334689,'copyright': 1,'ctime': 1595168654,'desc': '相关游戏:\n''----Minecraft、しゅがてん!-sugarfull tempering\n''====================\n''制作名单:\n''----Minecraft 游戏内建筑:-落忆-\n''----程序:-落忆-\n''----游戏内摄影:-落忆-、Passkou\n''----视频后期:Passkou\n''----音乐编曲:Passkou\n'
...and more

        注意,这里报 DeprecationWarning,可能是开发文档长期未维护的原因吧。正确(不报异常)的代码如下:

# coding=utf-8
# @Author: Fulai Cui (cuifulai@mail.hfut.edu.cn)
# @Time: 2024/9/15 15:22
from pprint import pprintfrom bilibili_api import video, syncdef main() -> None:# 实例化 Video 类v = video.Video(bvid="BV1uv411q7Mv")# 获取信息info = sync(v.get_info())# 打印信息pprint(info)if __name__ == "__main__":main()
1.1.3 Credential

        正如开发文档所讲,

如何给这个视频点赞?我们需要登录自己的账号。

这里设计是传入一个 Credential 类,获取所需的信息参照:获取 Credential 类所需信息

        bilibili-api 提供了一个 Credential 类,用于处理用户的“专属信息”。

        主要的内容就是开发文档的第二章:获取 Credential 类所需信息。具体内容:

  • SESSDATA

        用于一般在获取对应用户信息时提供,通常是 GET 操作下提供,此类操作一般不会进行操作,仅读取信息。如获取个人简介、获取个人空间信息等情况下需要提供。

  • BILI_JCT

        用于进行操作用户数据时提供,通常是 POST 操作下提供,此类操作会修改用户数据。如发送评论、点赞三连、上传视频等等情况下需要提供。

  • BUVID3 / BUVID4我只找到BUVID3

        设备验证码。通常不需要提供,但如放映室内部分接口需要提供,同时与风控有关。

  • DEDEUSERID

        通常为用户 UID几乎不需要提供。

  • AC_TIME_VALUE这个我没找到,没有对我来说没有影响

        在登录时获取,登录状态过期后用于刷新 Cookies,没有此值则只能重新登录,如不需要凭据刷新则不需要提供。

1.1.4 config.ini

        将上诉关键信息保存在 config.ini,以免意外泄露个人账号相关信息。以下为 config.ini 内容。

[Credential]
SESSDATA = XXX
BILI_JCT = XXX
BUVID3 = XXX
DEDEUSERID = XXX

        读取 config 可以使用 import configparser 包来完成。        

import configparserdef get_configs():parser = configparser.RawConfigParser()parser.read("../config.ini")configs = {'SESSDATA': parser.get('Credential', 'SESSDATA'),'BILI_JCT': parser.get('Credential', 'BILI_JCT'),'BUVID3': parser.get('Credential', 'BUVID3'),'DEDEUSERID': parser.get('Credential', 'DEDEUSERID')}return configs

        然后, bilibili_api.Credential 类的对象可以通过检索 configs 的值来定义。

configs = get_configs()credential = Credential(sessdata=configs['SESSDATA'],bili_jct=configs['BILI_JCT'],buvid3=configs['BUVID3'],dedeuserid=configs['DEDEUSERID']
)

         需要注意的是,这里的 credential 在后续频繁被使用。

2 自定义 Video 类

2.1 bvid

        BV 号(bvid),比如 URL https://www.bilibili.com/video/BV1Bx4y1s7n3 中,bvid 是连同 BV 在内的 BV1Bx4y1s7n3。获取某视频相关的内容都需要该 BV 号。

2.2 代码

       这里先直接 post 我自定义的 Video 类的 全部代码,后续再详细挑重点进行解释。

# coding=utf-8
# @Author: Fulai Cui (cuifulai@mail.hfut.edu.cn)
# @Time: 2024/7/12 15:14
import jsonfrom time import sleep
from random import randint
from tqdm import trange, tqdmfrom bilibili_api import comment
from bilibili_api import Credential
from bilibili_api import video
from bilibili_api import sync
from bilibili_api import Danmaku
from bilibili_api import assimport requestsHEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',"Referer": "https://www.bilibili.com",
}class Video:def __init__(self, credential: Credential, bv_id: str):self.credential = credentialself.bv_id = bv_idself.video: video.Video = self.get_video()self.aid = self.video.get_aid()self.info = self.get_info()def get_video(self):return video.Video(bvid=self.bv_id, credential=self.credential)def get_info(self):return sync(self.video.get_info())def get_comments(self, page_index: int = 1):num = 0comments: dict = sync(comment.get_comments(oid=self.aid,type_=comment.CommentResourceType.VIDEO,page_index=page_index,order=comment.OrderType.TIME,credential=self.credential,))all_comments = commentswhile True:sleep(randint(1, 3))page_index += 1num += comments['page']['size']if num >= comments['page']['count']:breakcomments: dict = sync(comment.get_comments(oid=self.aid,type_=comment.CommentResourceType.VIDEO,page_index=page_index,order=comment.OrderType.TIME,credential=self.credential,))all_comments['replies'].extend(comments['replies'])return all_commentsdef get_upper(self, page_index: int = 1):comments: dict = sync(comment.get_comments(oid=self.aid,type_=comment.CommentResourceType.VIDEO,page_index=page_index,order=comment.OrderType.TIME,credential=self.credential,))upper = comments['upper']if self.check_ad(upper):replies = self.get_sub_comments(upper)upper['replies'] = repliesreturn upperelse:return Nonedef get_sub_comments(self, upper):replies = []for pn in trange((upper['top']['rcount'] // 10) + 1, desc=f'Get sub comments of upper 【{self.bv_id}】'):url = ''.join(['https://api.bilibili.com/x/v2/reply/reply'f'?oid={self.aid}''&type=1'f'&root={upper['top']['rpid']}''&ps=10'f'&pn={pn + 1}''&web_location=333.788'])response = requests.get(url, headers=HEADERS).textresponse = json.loads(response)sleep(randint(1, 3))replies.extend(response['data']['replies'])return repliesdef get_danmakus(self):danmakus: list[Danmaku] = sync(self.video.get_danmakus(page_index=0,date=None,cid=None,from_seg=0,to_seg=self.info['duration'] // 360))def to_json(danmaku: Danmaku):txt = danmaku.text.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")return {"dm_time": danmaku.dm_time,"send_time": danmaku.send_time,"crc32_id": danmaku.crc32_id,"color": danmaku.color,"weight": danmaku.weight,"id_": danmaku.id_,"id_str": danmaku.id_str,"action": danmaku.action,"mode": danmaku.mode,"font_size": danmaku.font_size,"is_sub": danmaku.is_sub,"pool": danmaku.pool,"attr": danmaku.attr,"content": txt}xmls = {'danmakus': []}for _ in tqdm(danmakus, desc=f'Get danmakus【{self.bv_id}】'):xmls['danmakus'].append(to_json(_))return xmlsdef get_subtitle(self, root_dir):sync(ass.make_ass_file_subtitle(obj=self.video,page_index=0,cid=self.info['cid'],out=f"{root_dir}/{self.bv_id}.ass",lan_name="中文(自动生成)",lan_code="ai-zh",credential=self.credential))@staticmethoddef check_ad(upper):if upper['top']:if 'https://b23.tv/mall' in str(upper['top']['content']['jump_url']):return Trueelse:return False
2.2.1 get_video()

        调用 bilibili_api.video.Video 类来获取 video 对象。

def get_video(self):return video.Video(bvid=self.bv_id, credential=self.credential)

bilibili_api.video.Video
def __init__(self,
             bvid: str | None = None,
             aid: int | None = None,
             credential: Credential | None = None) -> Any
 
Args:

bvid (str | None, optional) : BV 号. bvid 和 aid 必须提供其中之一。  

aid (int | None, optional) : AV 号. bvid 和 aid 必须提供其中之一。  

credential (Credential | None, optional): Credential 类. Defaults to None.

2.2.2 get_info()

        获取视频信息。

def get_info(self):return sync(self.video.get_info())

        需要注意到,bilibili_api.sync 多次使用,其目的是“同步执行异步函数”。

2.2.3 get_comments()

        获取评论信息。

def get_comments(self, page_index: int = 1):num = 0comments: dict = sync(comment.get_comments(oid=self.aid,type_=comment.CommentResourceType.VIDEO,page_index=page_index,order=comment.OrderType.TIME,credential=self.credential,))all_comments = comments
...more code

bilibili_api.comment
async def get_comments(oid: int,
                       type_: CommentResourceType,
                       page_index: int = 1,
                       order: OrderType = OrderType. TIME,
                       credential: Credential | None = None) -> Coroutine[Any, Any, dict]
 
获取资源评论列表。  

第二页以及往后需要提供 `credential` 参数。  

Args:

oid (int) : 资源 ID。  

type_ (CommentsResourceType) : 资源类枚举。  

page_index (int, optional) : 页码. Defaults to 1.  

order (OrderType, optional) : 排序方式枚举. Defaults to OrderType. TIME.  

credential (Credential, optional): 凭据。Defaults to None.  

Returns:

dict: 调用 API 返回的结果

         为了获取全部评论,自然需要递增 page_index,直到全部获取。也就自然而然的有了接着的代码。

def get_comments(self, page_index: int = 1):num = 0comments: dict = sync(comment.get_comments(oid=self.aid,type_=comment.CommentResourceType.VIDEO,page_index=page_index,order=comment.OrderType.TIME,credential=self.credential,))all_comments = commentswhile True:sleep(randint(1, 3))page_index += 1num += comments['page']['size']if num >= comments['page']['count']:breakcomments: dict = sync(comment.get_comments(oid=self.aid,type_=comment.CommentResourceType.VIDEO,page_index=page_index,order=comment.OrderType.TIME,credential=self.credential,))all_comments['replies'].extend(comments['replies'])return all_comments
2.2.4 get_sub_comments()

        我这里额外的关注置顶评论的子评论,但是发现 bilibili_api 并没有提供这样的 API 接口。由此定义了一个获取评论的子评论的方法。

        这里采用的是 requests.get() 的方法。

def get_sub_comments(self, upper):replies = []for pn in trange((upper['top']['rcount'] // 10) + 1, desc=f'Get sub comments of upper 【{self.bv_id}】'):url = ''.join(['https://api.bilibili.com/x/v2/reply/reply'f'?oid={self.aid}''&type=1'f'&root={upper['top']['rpid']}''&ps=10'f'&pn={pn + 1}''&web_location=333.788'])response = requests.get(url, headers=HEADERS).textresponse = json.loads(response)sleep(randint(1, 3))replies.extend(response['data']['replies'])return replies

         这样能获取的原因是 Bilibili 对该 api 的反爬比较“松”。

2.2.5 get_danmakus()

        获取弹幕信息。

def get_danmakus(self):danmakus: list[Danmaku] = sync(self.video.get_danmakus(page_index=0,date=None,cid=None,from_seg=0,to_seg=self.info['duration'] // 360))
...more code

bilibili_api.video.Video
async def get_danmakus(self,
                       page_index: int = 0,
                       date: date | None = None,
                       cid: int | None = None,
                       from_seg: int | None = None,
                       to_seg: int | None = None) -> Coroutine[Any, Any, list[Danmaku]]
 
获取弹幕。  

Args:

page_index (int, optional): 分 P 号,从 0 开始。Defaults to None  

date (datetime. Date | None, optional): 指定日期后为获取历史弹幕,精确到年月日。Defaults to None.  

cid (int | None, optional): 分 P 的 ID。Defaults to None  

from_seg (int, optional): 从第几段开始(0 开始编号,None 为从第一段开始,一段 6 分钟). Defaults to None.  

to_seg (int, optional): 到第几段结束(0 开始编号,None 为到最后一段,包含编号的段,一段 6 分钟). Defaults to None.  

注意

- 1. 段数可以使用 `get_danmaku_view()["dm_seg"]["total"]` 查询。

- 2. `from_seg` 和 `to_seg` 仅对 `date == None` 的时候有效果。

- 3. 例:取前 `12` 分钟的弹幕:`from_seg=0, to_seg=1`  

Returns:

List[Danmaku]: Danmaku 类的列表

2.2.6 get_subtitle()

        获取字幕信息。

def get_subtitle(self, root_dir):sync(ass.make_ass_file_subtitle(obj=self.video,page_index=0,cid=self.info['cid'],out=f"{root_dir}/{self.bv_id}.ass",lan_name="中文(自动生成)",lan_code="ai-zh",credential=self.credential))

bilibili_api.ass
async def make_ass_file_subtitle(obj: Video | Episode,
                                 page_index: int | None = 0,
                                 cid: int | None = None,
                                 out: str | None = "test. ass",
                                 lan_name: str | None = "中文(自动生成)",
                                 lan_code: str | None = "ai-zh",
                                 credential: Credential = Credential()) -> Coroutine[Any, Any, None]
 
生成视频字幕文件  

Args:

obj (Union[Video,Episode]): 对象  

page_index (int, optional) : 分 P 索引  

cid (int, optional) : cid  

out (str, optional) : 输出位置. Defaults to "test. ass".  

lan_name (str, optional) : 字幕名,如”中文(自动生成)“,是简介的 subtitle 项的'list'项中的弹幕的'lan_doc'属性。Defaults to "中文(自动生成)".  

lan_code (str, optional) : 字幕语言代码,如 ”中文(自动翻译)” 和 ”中文(自动生成)“ 为 "ai-zh"  

credential (Credential) : Credential 类. 必须在此处或传入的视频 obj 中传入凭据,两者均存在则优先此处

3 示例

        使用代码如下。

# coding=utf-8
# @Author: Fulai Cui (cuifulai@mail.hfut.edu.cn)
# @Time: 2024/7/12 15:19
import configparserfrom bilibili_api import Credential
from video import Videoimport jsondef get_configs():parser = configparser.RawConfigParser()parser.read("../config.ini")configs = {'SESSDATA': parser.get('Credential', 'SESSDATA'),'BILI_JCT': parser.get('Credential', 'BILI_JCT'),'BUVID3': parser.get('Credential', 'BUVID3'),'DEDEUSERID': parser.get('Credential', 'DEDEUSERID')}return configsdef json_write(json_filename: str, json_dict: dict):if json_dict:with open(json_filename, 'w', encoding='utf-8') as f:json.dump(json_dict, f, indent=4, ensure_ascii=False)def main():bv_id = 'BV1iC4y177Sb'root_dir = '../Data'configs = get_configs()credential = Credential(sessdata=configs['SESSDATA'],bili_jct=configs['BILI_JCT'],buvid3=configs['BUVID3'],dedeuserid=configs['DEDEUSERID'])video = Video(credential=credential, bv_id=bv_id)# comments = video.get_comments()upper = video.get_upper()if upper:danmakus = video.get_danmakus()json_write(f'{root_dir}/Info/{bv_id}.json', video.info)# json_write(f'{root_dir}/Comment/{bv_id}.json', comments)json_write(f'{root_dir}/Upper/{bv_id}.json', upper)json_write(f'{root_dir}/Danmaku/{bv_id}.json', danmakus)if __name__ == '__main__':main()

相关文章:

Python:抓取 Bilibili(B站)评论、弹幕、字幕等

个人学习需求&#xff0c;需要获取一些 UGC&#xff08;user generated content&#xff09;&#xff0c;包括 UP 的内容、弹幕、评论等。于是从 哔哩哔哩 (゜-゜)つロ 干杯~-bilibili 抓取了一些数据&#xff0c;以下内容仅供学习参考。 目录 1. Python 包&#xff1a;bilib…...

Ubuntu系统Docker部署数据库管理工具DbGate并实现远程查询数据

文章目录 前言1. 安装Docker2. 使用Docker拉取DbGate镜像3. 创建并启动DbGate容器4. 本地连接测试5. 公网远程访问本地DbGate容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 前言 本文主要介绍如何在Linux Ubuntu系统中使用Docker部署DbGate数…...

18063 圈中的游戏

### 思路 1. 创建一个循环链表表示围成一圈的 n 个人。 2. 从第一个人开始报数&#xff0c;每报到 3 的人退出圈子。 3. 重复上述过程&#xff0c;直到只剩下一个人。 4. 输出最后留下的人的编号。 ### 伪代码 1. 创建一个循环链表&#xff0c;节点表示每个人的编号。 2. 初始…...

【Spring Boot】SpringBoot自动装配-Import

目录 一、前言二、 定义三、使用说明3.1 创建项目3.1.1 导入依赖3.1.2 创建User类 3.2 测试导入Bean3.2.1 修改启动类 3.3 测试导入配置类3.3.1 创建UserConfig类3.3.2 修改启动类 3.4 测试导入ImportSelector3.4.1 创建UseImportSelector类3.4.2 修改启动类3.4.3 启动测试 3.5…...

C++:opencv计算轮廓周长--cv::arcLength

cv::arcLength 是 OpenCV 中用于计算轮廓的周长或曲线长度的函数。它是计算图像轮廓特征时非常有用的工具&#xff0c;特别是在处理形状分析、对象检测等任务时。 函数原型 double cv::arcLength(const cv::InputArray& curve, bool closed);curve: 输入的曲线或轮廓&…...

探索学习Python的最佳开发环境和编辑器

Python&#xff0c;作为目前最受欢迎的编程语言之一&#xff0c;因其简洁明了的语法和强大的功能性而备受开发者喜爱。无论是数据科学、机器学习、Web开发还是自动化脚本&#xff0c;Python都有着广泛的应用。选择合适的开发环境和编辑器对于提高编程效率和学习体验至关重要。 …...

【Pycharm】Pycharm创建Django提示pip版本需要升级

目录 1、现象 2、分析 3、本质 前言&#xff1a;经常使用pycharm创建django、flask等项目时候提示pip版本需要升级&#xff0c;解决方案 1、现象 使用Pycharm创建Django项目提示安装Django超时&#xff0c;报错建议pip升级22升级到24 2、分析 之前使用命令升级了pip到了24…...

模拟退火算法(SA算法)求解实例---旅行商问题 (TSP)

目录 一、采用SA求解 TSP二、 旅行商问题2.1 实际例子&#xff1a;求解 6 个城市的 TSP2.2 **求解该问题的代码**2.3 代码运行过程截屏2.4 代码运行结果截屏&#xff08;后续和其他算法进行对比&#xff09; 三、 如何修改代码&#xff1f;3.1 减少城市坐标&#xff0c;如下&am…...

衡石分析平台使用手册--替换衡石 metadb

替换衡石 metadb​ 在使用 HENGSHI SENSE 服务过程中&#xff0c;可以根据业务需要替换 HENGSHI 自带的 metadb。本文讲述使用云服务 PostgreSQL 替代衡石 metadb 的过程。 准备工作​ 在进行配置前&#xff0c;请在云服务 PostgreSQL 上完成如下准备工作。 [必须] 配置衡石…...

【Unity学习心得】如何制作俯视角射击游戏

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、导入素材二、制作流程 1.制作地图2.实现人物动画和移动脚本3.制作单例模式和对象池4.制作手枪pistol和子弹bullet和子弹壳bulletShell5.制作散弹枪shotgun总…...

【资料分析】常见的坑

in 比较或计数类问题 差别大的基期比较&#xff0c;可以直接用现期进行比较 注意单位可能不同&#xff01; 注意顺序是从小到大还是从大到小 以及老问题&#xff0c;名字本身就叫XX增量&#xff0c;XX增加值&#xff0c;而非还要另外去算的东东 给出的图表可能是不完整的 2…...

GitLab权限及设置

之前很少关注这些&#xff0c;项目的权限&#xff0c;一般由专门的管理人员设置。 但自己创建的项目自己可以设置权限。下面是一些笔记。 GitLab中用户权限_gitlab 权限-CSDN博客 开发中遇到要将自己这块的代码上传到Git&#xff0c;由其他组的同事拉取后继续开发。上传代码后…...

算法练习题24——查找杨辉三角中的组合数

题目描述 杨辉三角中的每个元素是一个组合数。第 ( i ) 行的第 ( j ) 个元素表示组合数 ( C(i, j) ) &#xff0c;即从 ( i ) 个元素中选 ( j ) 个元素的组合方式。已知一个正整数 ( N )&#xff0c;要求在杨辉三角中找到这个数&#xff0c;并输出它在杨辉三角中的具体位置。位…...

string类的模拟实现

实现string的模拟实现分为三个文件&#xff0c;分别为&#xff1a;string.h、sting.cpp、test.cpp string.h 其中包含一些短小常用的函数的实现&#xff0c;头文件&#xff0c;函数的声明 #include<iostream> #include<string> #include<assert.h>using n…...

如何训练机器学习力场

机器学习力场&#xff08;MLFF&#xff09;的训练主要依赖于通过量子力学计算生成的高质量训练数据集&#xff0c;并利用不同的机器学习算法来拟合分子系统中的势能面&#xff08;Potential Energy Surface, PES&#xff09;和原子间作用力。这种训练过程包括数据准备、特征提取…...

AI创作新手册:精通Prompt提示词的提问策略

文章目录 &#x1f34a;AI创作核心&#xff1a;提示词 Prompt 的重要性1. 什么是提示词工程&#xff1f;1.1 提示词的作用原理1.2 提示词工程师的薪资与行业前景1.3 提示词工程的适用性 2. 提示词的编写技巧3. 常见的提示词框架3.1 CO-STAR 框架3.2 BORKE 框架 4. 提示词的实际…...

gingivitis

gingivitis 牙龈炎 1&#xff09;这个是啥不知道 2&#xff09;七叶莲片 3&#xff09;甲硝唑芬布芬胶囊 4&#xff09;盐酸左氧氟沙星胶囊 5&#xff09;纳珍 开始学习记录医生开的药。日常备药记录一下。【不要乱吃药哈】...

开源 AI 智能名片小程序:开启内容营销新境界

摘要&#xff1a;本文深入探讨了在当今数字化时代&#xff0c;内容营销的重要性以及如何实现让用户主动找你的最佳效果。通过引入开源 AI 智能名片小程序这一创新工具&#xff0c;阐述了其在明确目标用户群体、迎合用户需求痛点和打造风格特色方面的独特优势&#xff0c;为企业…...

p12docker 进入容器的命令和拷贝的命令

进入当前正在运行的容器 第一种方式是执行docker exec -it 8d57ffda7a29 /bin/bash这个时候可以根据docker容器的id进入到指定id的容器当中***(这个是比较常用的)*** 老师的笔记 第二种方式是docker attach 8d57ffda7a29 这里还是直接引用老师的笔记吧 从容器内部拷贝文…...

代码随想录Day 45|leetcode题目:115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 题目题目一&#xff1a; 115.不同的子序列解题思路&#xff1a;1. 确定dp数组&#xff08;dp table&#xff09;以及下标的含义2. 确定递推公式3. dp数组如何初始化4. 确定遍历顺序5. 举例推导dp数…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

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. 执行器…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...