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

【2024年最新】BilibiliB站视频动态评论爬虫

废话不多说,直接先放git仓库:GitHub - linyuye/Bilibili_crawler: bilibili爬虫,基于selenium获取oid与cookie,request获取api内容

〇:概念简述

oid:视频/动态的uuid,b站对于发布内容的通用唯一识别码

cookie:内含个人登录信息,爬虫头必需

其余内容请看该文档含义:

bilibili-API-collect/docs/comment/list.md at master · SocialSisterYi/bilibili-API-collect · GitHub哔哩哔哩-API收集整理【不断更新中…】. Contribute to SocialSisterYi/bilibili-API-collect development by creating an account on GitHub.[这里是图片001]https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/comment/list.md

一:前言

首先,让我们了解,动态网站/静态网站的区别:

动态网站除了要设计网页外,还要通过数据库和编程序来使网站具有更多自动的和高级的功能。动态网站体现在网页一般是以asp,jsp,php,aspx等技术,而静态网页一般是HTML(标准通用标记语言的子集)结尾,动态网站服务器空间配置要比静态的网页要求高,费用也相应的高,不过动态网页利于网站内容的更新,适合企业建站。动态是相对于静态网站而言。——百度百科

通俗来说,就是网页内容是否写在网站源代码里面的区别。

以编写日期时,bilibili每周必看视频榜一为例:https://www.bilibili.com/video/BV1ay411h74i/

对于第一条评论:在网页源代码中不存在,所以数据是从后端/数据库返回的,那么我们就可以通过查看网络请求。发现数据在mainoid这里面返回得到,至此,我们知道了评论是从哪里返回的。

二:API详解

api分析来源:GitHub - SocialSisterYi/bilibili-API-collect: 哔哩哔哩-API收集整理【不断更新中…】哔哩哔哩-API收集整理【不断更新中…】. Contribute to SocialSisterYi/bilibili-API-collect development by creating an account on GitHub.[这里是图片006]https://github.com/SocialSisterYi/bilibili-API-collect

https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/comment/list.md

通过翻阅上述API文档,我们得知,使用正常API获取评论,在页数到达400页之后无法返回内容,好在b站提供了一个懒加载api能够爬取所有内容。

https://api.bilibili.com/x/v2/reply/main懒加载api,无需wbi签名

https://api.bilibili.com/x/v2/reply/reply获取子评论的api

对评论区请求需要以下data数据:(1为评论,2为子评论)

参数名

类型

内容

必要性

备注

access_key

str

APP 登录 Token

APP 方式必要

type

num

评论区类型代码

必要

类型代码见表

oid

num

目标评论区 id

必要

mode

num

排序方式

非必要

默认为 3
0 3:仅按热度
1:按热度+按时间
2:仅按时间

next

num

评论页选择

非必要

按热度时:热度顺序页码(0 为第一页)
按时间时:时间倒序楼层号
默认为 0

ps

num

每页项数

非必要

默认为 20
定义域:1-30

access_key

str

APP登录 Token

APP 方式必要

type

num

评论区类型代码

必要

类型代码见表

oid

num

目标评论区 id

必要

root

num

根回复 rpid

必要

ps

num

每页项数

非必要

默认为20
定义域:1-49
但 data_replies 的最大内容数为20,因此设置为49其实也只会有20条回复被返回

pn

num

页码

非必要

默认为1

data_2 = {二级评论的data
'type': type,  # 类型
'oid': oid,  # 原视频/动态oid
'ps': ps,  # 每页含有条数,不能大于20
'pn': str(page_pn),  # 二级评论页数,需要转换为字符串
'root': rpid  # 一级评论的rpid
}

三:爬虫

使用了request库,对api访问,解析返回数据

for comment in json_data['data']['replies']:count = comment['rcount']rpid = str(comment['rpid'])name = comment['member']['uname']sex = comment['member']['sex']ctime = comment['ctime']dt_object = datetime.datetime.fromtimestamp(ctime, datetime.timezone.utc)formatted_time = dt_object.strftime('%Y-%m-%d %H:%M:%S') + ' 北京时间'  # 可以加上时区信息,但通常不需要like = comment['like']message = comment['content']['message'].replace('
', ',')# 检查是否存在 location 字段location = comment['reply_control'].get('location', '未知')  # 如果不存在,使用 '未知'location = location.replace('IP属地:', '')  if location else locationcurrent_level = comment['member']['level_info']['current_level']mid = str(comment['member']['mid'])

四:小白化处理

因为对于小白来说,获取cookie和oid比较困难,所以使用了selenium库,自动抓包自己的cookie和视频/动态oid

last_request = None# 遍历所有请求
for request in driver.requests:if "main?oid=" in request.url and request.response:# 更新last_request为当前请求last_request = request# 检查是否找到了符合条件的请求
if last_request:print("URL:", last_request.url)# 从URL中提取oidparsed_url = urlparse(last_request.url)query_params = parse_qs(parsed_url.query)oid = query_params.get("oid", [None])[0]type = query_params.get("type", [None])[0]print("OID:", oid)print("type:", type)

五:完整代码

from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time
from urllib.parse import urlparse, parse_qs
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
import csv
import pytz
import datetime
from fake_useragent import UserAgent
import randomoptions = {'ignore_http_methods': ['GET', 'POST'],  # 提取XHR请求,通常为GET或POST。如果你不希望忽略任何方法,可以忽略此选项或设置为空数组'custom_headers': {'X-Requested-With': 'XMLHttpRequest'  # 筛选XHR请求}
}# 配置Selenium
chrome_options = Options()
chrome_service = Service("前面是你这个文件夹的绝对路径\venv\chrome-win64\chromedriver.exe")
driver = webdriver.Chrome(service=chrome_service, options=chrome_options)# 打开目标网页,改成你想爬的网页,直接是网址就行
driver.get("https://www.bilibili.com/video/BV1WM4m1Q75H/")login_div = driver.find_element(By.XPATH, "//div[contains(@class, 'right-entry__outside') and contains(@class, 'go-login-btn')]")
login_div.click()
time.sleep(5)
# 注意替换下面的选择器以匹配你要自动登录的网站
username_input = driver.find_element(By.XPATH, "//input[@placeholder='请输入账号']")
password_input = driver.find_element(By.XPATH, "//input[@placeholder='请输入密码']")
login_button = driver.find_element(By.XPATH, "//div[contains(@class,'btn_primary') and contains(text(),'登录')]")
#第一个写账号,第二个写密码
username_input.send_keys("")
password_input.send_keys("")
# 点击登录按钮
time.sleep(5)
# login_button.click()
# 等待几秒确保登录成功
driver.implicitly_wait(10)  # 替换为你需要的等待时间
# 等待页面加载完成(根据实际情况调整时间或使用更智能的等待方式)
time.sleep(5)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(5)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 获取捕获的网络请求
# 初始化一个变量,用来保存最后一个符合条件的请求
last_request = None# 遍历所有请求
for request in driver.requests:if "main?oid=" in request.url and request.response:# 更新last_request为当前请求last_request = request# 检查是否找到了符合条件的请求
if last_request:print("URL:", last_request.url)# 从URL中提取oidparsed_url = urlparse(last_request.url)query_params = parse_qs(parsed_url.query)oid = query_params.get("oid", [None])[0]type = query_params.get("type", [None])[0]print("OID:", oid)print("type:", type)# 从WebDriver中获取所有cookiesall_cookies = driver.get_cookies()cookies_dict = {cookie['name']: cookie['value'] for cookie in all_cookies}cookies_str = '; '.join([f"{name}={value}" for name, value in cookies_dict.items()])# 从cookies中获取bili_jct的值bili_jct = cookies_dict.get('bili_jct', '')print("bili_jct:", bili_jct)sessdata = cookies_dict.get('SESSDATA', '')print("SESSDATA:", sessdata)# 打印请求头response = last_request.responsedriver.quit()# 重试次数限制
MAX_RETRIES = 5
# 重试间隔(秒)
RETRY_INTERVAL = 10file_path_1 = 'comments/主评论_1.1.csv'
file_path_2 = 'comments/二级评论_1.2.csv'beijing_tz = pytz.timezone('Asia/Shanghai')#时间戳转换为北京时间
ua=UserAgent()#创立随机请求头ps= 20down = 1 #开始爬的页数a
up = 30#结束爬的页数one_comments = []
all_comments = []#构造数据放在一起的容器  总共评论,如果只希望含有一级评论,请注释 line 144
all_2_comments = []#构造数据放在一起的容器 二级评论
comments_current = []
comments_current_2 = []# 将所有评论数据写入CSV文件
with open(file_path_1, mode='a', newline='', encoding='utf-8-sig') as file:writer = csv.writer(file)writer.writerow(['昵称', '性别', '时间', '点赞', '评论', 'IP属地','二级评论条数','等级','uid','rpid'])writer.writerows(all_comments)
with open(file_path_2, mode='a', newline='', encoding='utf-8-sig') as file:#二级评论条数writer = csv.writer(file)writer.writerow(['昵称', '性别', '时间', '点赞', '评论', 'IP属地','二级评论条数,条数相同说明在同一个人下面','等级','uid','rpid'])writer.writerows(all_2_comments)with requests.Session() as session:retries = Retry(total=3,  # 最大重试次数,好像没有这个函数backoff_factor=0.1,  # 间隔时间会乘以这个数status_forcelist=[500, 502, 503, 504])for page in range(down, up + 1):for retry in range(MAX_RETRIES):try:headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',#'ua.random',#随机请求头,b站爸爸别杀我,赛博佛祖保佑'Cookie': cookies_str,'SESSDATA': sessdata,'csrf' : bili_jct,}url =      'https://api.bilibili.com/x/v2/reply?'#正常api,只能爬8kurl_long = 'https://api.bilibili.com/x/v2/reply/main'#懒加载api,理论无上限url_reply = 'https://api.bilibili.com/x/v2/reply/reply'#评论区回复api#示例:https://api.bilibili.com/x/v2/reply/main?next=1&type=1&oid=544588138&mode=3(可访问网站)data = {'next':str(page),  # 页数,需要转换为字符串,与pn同理,使用懒加载api'type': type,  # 类型 11个人动态 17转发动态 视频1)'oid': oid,  #id,视频为av,文字动态地址栏id,可自查'ps':ps, #(每页含有条数,不能大于20)用long的话不能大于30'mode': '3'  #3为热度       0 3:仅按热度      1:按热度+按时间 2:仅按时间 使用懒加载api}proxies = {#"http": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": tunnel},#"https": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": tunnel}#代理ip来源:https://www.kuaidaili.com/free/inha/}prep = session.prepare_request(requests.Request('GET', url_long, params=data, headers=headers))print(prep.url)response = session.get(url_long, params=data, headers=headers)# 检查响应状态码是否为200,即成功if response.status_code == 200:json_data = response.json()#获得json数据if 'data' in json_data and 'replies' in json_data['data']: #以下为核心内容,爬取的数据for comment in json_data['data']['replies']:#one_comments.clear()count = comment['rcount']rpid = str(comment['rpid'])name = comment['member']['uname']sex = comment['member']['sex']ctime = comment['ctime']dt_object = datetime.datetime.fromtimestamp(ctime, datetime.timezone.utc)formatted_time = dt_object.strftime('%Y-%m-%d %H:%M:%S') + ' 北京时间'  # 可以加上时区信息,但通常不需要like = comment['like']message = comment['content']['message'].replace('
', ',')# 检查是否存在 location 字段location = comment['reply_control'].get('location', '未知')  # 如果不存在,使用 '未知'location = location.replace('IP属地:', '') if location else location# 将提取的信息追加到列表中current_level = comment['member']['level_info']['current_level']mid = str(comment['member']['mid'])all_comments.append([name, sex, formatted_time, like, message, location,count,current_level,mid,rpid])comments_current.append([name, sex, formatted_time, like, message, location, count, current_level,mid,rpid])with open(file_path_1, mode='a', newline='', encoding='utf-8-sig') as file:writer = csv.writer(file)writer.writerows(all_comments)all_comments.clear()#每次结束,重置计数器if(count != 0):print(f"在第{page}页中含有二级评论,该条回复下面总共含有{count}个二级评论")total_pages = ((count // 20 ) +2) if count > 0 else 0for page_pn in range(total_pages):data_2 = {# 二级评论的data'type': type,  # 类型'oid': oid,  # id'ps': ps,  # 每页含有条数,不能大于20'pn': str(page_pn),  # 二级评论页数,需要转换为字符串'root': rpid  # 一级评论的rpid}if page_pn == 0:continueresponse = session.get(url_reply, params=data_2, headers=headers, proxies=proxies)prep = session.prepare_request(requests.Request('GET', url_reply, params=data_2, headers=headers))print(prep.url)if response.status_code == 200:json_data = response.json()  # 获得json数据if 'data' in json_data and 'replies' in json_data['data']:if not json_data['data']['replies']:  # 检查replies是否为空,如果为空,跳过这一页print(f"该页replies为空,没有评论")continuefor comment in json_data['data']['replies']:rpid = str(comment['rpid'])name = comment['member']['uname']sex = comment['member']['sex']ctime = comment['ctime']dt_object = datetime.datetime.fromtimestamp(ctime,datetime.timezone.utc)formatted_time = dt_object.strftime('%Y-%m-%d %H:%M:%S') + ' 北京时间'  # 可以加上时区信息,但通常不需要like = comment['like']message = comment['content']['message'].replace('
', ',')# 检查是否存在 location 字段location = comment['reply_control'].get('location','未知')  # 如果不存在,使用 '未知'location = location.replace('IP属地:', '') if location else locationcurrent_level = comment['member']['level_info']['current_level']mid = str(comment['member']['mid'])all_2_comments.append([name, sex, formatted_time, like, message, location, count,current_level,mid,rpid])comments_current_2.append([name, sex, formatted_time, like, message, location, count,current_level,mid,rpid])with open(file_path_2, mode='a', newline='',encoding='utf-8-sig') as file:  # 二级评论条数writer = csv.writer(file)writer.writerows(all_2_comments)all_2_comments.clear()else:#print(f"在第{page_pn + 1}页的JSON响应中缺少 'data' 或 'replies' 键。跳过此页。")print(f"在页面{page}下第{page_pn + 1}条评论没有子评论。")else:print(f"获取第{page_pn + 1}页失败。状态码: {response.status_code}")random_number = random.uniform(0.2, 0.3)time.sleep(random_number)print(f"已经爬取第{page}页. 状态码: {response.status_code} ")else:print(f"在页面 {page} 的JSON响应中缺少 'data' 或 'replies' 键。跳过此页。")else:print(f"获取页面 {page} 失败。状态码: {response.status_code} 即为失败,请分析原因并尝试重试")random_number = random.uniform(0.2, 0.3)print(random_number)time.sleep(random_number)breakexcept requests.exceptions.RequestException as e:print(f"连接失败: {e}")if retry < MAX_RETRIES - 1:print(f"正在重试(剩余尝试次数:{MAX_RETRIES - retry - 1})...")time.sleep(RETRY_INTERVAL)  # 等待一段时间后重试else:raise  # 如果达到最大重试次数,则抛出原始异常

相关文章:

【2024年最新】BilibiliB站视频动态评论爬虫

废话不多说&#xff0c;直接先放git仓库&#xff1a;GitHub - linyuye/Bilibili_crawler: bilibili爬虫&#xff0c;基于selenium获取oid与cookie&#xff0c;request获取api内容 〇&#xff1a;概念简述 oid&#xff1a;视频/动态的uuid&#xff0c;b站对于发布内容的通用唯…...

清空DNS 缓存

如果遇到修改了host文件&#xff0c;但是IP和域名的映射有问题的情况&#xff0c;可以尝试刷新DNS缓存。 ipconfig/flushdns win建加R建&#xff0c;然后输入cmd&#xff0c;然后回车 然后回车&#xff0c;或者点击确定按钮。 出现如下所示标识清空DNS 缓存成功。...

东土智能交通服务器助力北京市车路云一体化建设

背景及意义 北京高级别自动驾驶示范区自2020年启动建设&#xff0c;至今已经发展建设到3.0阶段&#xff0c;通州区作为3.0阶段扩建的重点区域之一&#xff0c;扩区建设范围共计约175平方公里&#xff0c;涉及18个属地街镇&#xff0c;涵盖580个路口。 作为北京市车路云一体化…...

HarmonyOS NEXT 实战之元服务:静态案例效果---妙语集语

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; import { authentication } …...

python基础项目

1.联系人案例 # 导入的模块 from input_util import * import re import csv# 定义一个变量保存文件读取的信息 users {}# 封装读取文件的函数 def reader_file(path_name: str ./python基础/2024-11-15python基础项目/data/a.csv) -> None:try:with open(path_name, enco…...

mysql返回N/A

在写统计图的接口&#xff0c;sql查询一直无数据&#xff0c;给的默认值也没有实现&#xff1a; SELECTifnull( unit.num, 0 ) riskUnitCount,ifnull( EVENT.num, 0 ) riskEventCount,ifnull( measure.num, 0 ) riskMeasureCount FROMtb_companyLEFT JOIN (SELECTrisk.qyid,co…...

C++---------迭代策略与迭代器

一、迭代策略与迭代器 迭代器的概念 迭代器是一种对象&#xff0c;它提供了一种统一的方式来访问容器&#xff08;如数组、向量、列表等&#xff09;中的元素&#xff0c;而不暴露容器的内部结构。迭代器的行为类似于指针&#xff0c;可以用于遍历容器中的元素、修改元素以及…...

深入解析 Oracle 的聚合函数 ROLLUP

目录 深入解析 Oracle 的聚合函数 ROLLUP一、ROLLUP 函数概述二、ROLLUP 函数语法三、ROLLUP 实例详解&#xff08;一&#xff09;基础分组聚合&#xff08;二&#xff09;引入 ROLLUP 函数&#xff08;三&#xff09;ROLLUP 与 NULL 值&#xff08;四&#xff09;多列复杂分组…...

kipotix4靶机实战

信息收集 1.判断靶机ip 原理&#xff1a;开靶机之前nmap扫一次网段&#xff0c;再开靶机之后扫一次&#xff0c;查看多出来的ip就是靶机ip ip192.168.98.1742.判断端口服务&#xff0c;系统版本 a.确定端口 b.-p指定端口进一步收集 c.信息筛选 1.端口&#xff1a;22,80,139,…...

Java中处理if-else的几种高级方法

前言 在我看来多写几个if-else没啥大不了的&#xff0c;但是就是看起来没啥逼格&#xff0c;领导嫌弃。我根据开发的经历写几个不同的替代方法 一、枚举法替代 我先前写了一篇文章&#xff0c;可以去看看。 通过枚举替换if-else语句的解决方案_枚举代替if else c语言-CSDN博…...

LaTeX 是一种基于标记的排版系统,广泛用于创建高质量的文档,特别是在需要复杂数学公式、表格、文献引用等的场景中

LaTeX 是一种基于标记的排版系统&#xff0c;广泛用于创建高质量的文档&#xff0c;特别是在需要复杂数学公式、表格、文献引用等的场景中。以下是关于 LaTeX 的详细解释&#xff1a; 1. LaTeX 的基本概念 本质&#xff1a;LaTeX 是基于 TeX 的排版系统&#xff0c;提供了更高…...

Go入门篇:(一)golang的安装和编辑工具安装

一、前言 最近我有幸接触到Go语言,深入了解后,发现go语言确实有很多让人惊叹的地方。作为一个有着多年Java编程经验的程序员,我深深地被它所吸引,并且决定记录下我的学习之路,以便与大家分享我的经验和感悟。 与Java不同,Go语言的语法和运行效率都非常高,特别是对于并…...

【10】Selenium+Python UI自动化测试 邮件发送测试报告(某积载系统实例-04)

测试报告需要发送给相关人员&#xff0c;但每次都要在report目录下去复制太麻烦&#xff0c;可以使用邮件模块自动将生成的报告发送给相关人员 1、 新增utils文件夹&#xff0c;用于存放工具文件 在utils下新增sendmail.py文件 代码 sendmail.py import smtplib from email.…...

Playwright爬虫xpath获取技巧

示例一 <button class"MuiButtonBase-root MuiButton-root MuiLoadingButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeLarge MuiButton-containedSizeLarge MuiButton-colorPrimary MuiButton-fullWidth MuiButton-root MuiLoadingButton…...

运算符 - 算术、关系、逻辑运算符

引言 在编程中&#xff0c;运算符是用于执行特定操作的符号。C 提供了多种类型的运算符&#xff0c;包括算术运算符、关系运算符和逻辑运算符等。理解这些运算符及其用法对于编写高效且无误的代码至关重要。本文将详细介绍 C 中的这三种基本运算符&#xff0c;并通过实例帮助读…...

中关村科金外呼机器人智能沟通破解营销难题

当今&#xff0c;传统的营销方式在效率、成本控制、客户管理等方面逐渐显现出局限性&#xff0c;难以满足现代企业的需求。如何提升营销效率、降低运营成本、有效管理客户会员&#xff0c;成为企业的难题。中关村科金外呼机器人通过智能化沟通技术&#xff0c;为企业提供了一站…...

css绘制圆并绘制圆的半径

<div class"item1"></div>.item1 {position: relative;width: 420px;height: 420px;border-radius: 50%; /* 圆形 */color: white; /* 文本颜色 */background-color: rgba(154, 227, 36, 0.4); } .item1::before {content: "";position: absol…...

实现类似gpt 打字效果

1. css的动画&#xff08;animation) css中实现动画有两种方式&#xff1a;transition过渡动画、 animation自定义动画。 具体的可以看MDN链接&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/CSS/animation 使用keyframes自定义关键帧动画并未其命名使用自定义动…...

【乐企文件生成工程】根据特定要素动态选择需要生成的发票板式文件实现

乐企版式文件生成工程,涉及到多个票种,不乏特殊票种的生成,如果每个特殊票种都单独写逻辑,那整个代码写起来体量就不得了,如何实现代码逻辑的同时也更优雅的实现代码扩展性呢,您接着往下看。 使用设计模式 工厂模式 1、定义接口InvoiceFileService public interface Inv…...

near-synonym反义词生成(2):Prompt +Bert-MLM(FT)

near-synonym之反义词生成方法二 near-synonym, 中文反义词/近义词/同义词(antonym/synonym)工具包. 方法一为(neg_antonym): Word2vec -> ANN -> NLI -> Length 方法二为(mlm_antonym): Prompt Bert-MLM(FT) Beam-Search 项目地址 github: https://github.com/yon…...

dockfile 配置 /etc/apt/source.list.d/debian.list 清华镜像

docker:3.12.7 镜像使用的是 debian 系统&#xff0c;比 ubuntu 更轻量。debian 系统内&#xff0c;apt 镜像源列表位于 /etc/apt/source.list.d/debian.list&#xff08;作为对比&#xff0c;ubuntu 的镜像列表位于 /etc/apt/source.list&#xff0c;二者语法相同&#xff09;…...

DAY38|动态规划Part06|LeetCode:322. 零钱兑换、279.完全平方数、139.单词拆分

目录 LeetCode:322. 零钱兑换 基本思路 C代码 LeetCode:279.完全平方数 C代码 LeetCode:139.单词拆分 基本思路 C代码 LeetCode:322. 零钱兑换 力扣题目链接 文字讲解&#xff1a;LeetCode:322. 零钱兑换 视频讲解&#xff1a;动态规划之完全背包&#xff0c;装满背包最…...

Spring事务回滚

Transactional注解 Transactional作用&#xff1a;就是在当前这个方法执行开始之前来开启事务&#xff0c;方法执行完毕之后提交事务。如果在这个方法执行的过程当中出现了异常&#xff0c;就会进行事务的回滚操作。 Transactional注解&#xff1a;我们一般会在业务层当中来控制…...

【目标跟踪】checkpoint文件到底是什么?

说实话&#xff0c;我一直决定计算机视觉是个很玄的东西&#xff0c;里面的很多东西都是看了概念之后云里雾里&#xff0c;今天就把我复现代码时遇到的不懂得讲一讲——checkpoint文件是个啥&#xff1f; checkpoint文件顾名思义就是一个模型检查点文件&#xff0c;用于保存训练…...

hiprint结合vue2项目实现静默打印详细使用步骤

代码地址是&#xff1a;vue-plugin-hiprint: hiprint for Vue2/Vue3 ⚡打印、打印设计、可视化设计器、报表设计、元素编辑、可视化打印编辑 本地安装包地址&#xff1a;electron-hiprint 发行版 - Gitee.com 1、先安装hipint安装包在本地 2、项目运行npm&#xff08;socket.…...

apt和apt-get软件包管理工具-debian

apt 和 apt-get 是在基于Debian的Linux发行版&#xff08;如Ubuntu&#xff09;中使用的两个软件包管理工具&#xff0c;它们都属于APT&#xff08;Advanced Package Tool&#xff09;的前端工具&#xff0c;用于管理软件包的安装、更新、升级和删除。以下是它们的特性和一些比…...

小程序租赁系统开发的优势与实践探索

内容概要 小程序租赁系统开发正在引起广泛关注&#xff0c;特别是在数字化快速发展的今天。很多企业开始意识到&#xff0c;小程序不仅能为他们带来更多的客户&#xff0c;还能极大地提高管理效率。借助小程序&#xff0c;用户在租赁时可以更加方便地浏览和选择产品&#xff0…...

sheng的学习笔记-AI-模型评估-留出法、交叉验证法、自助法

Ai目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 评估方法&#xff1a; 数据集可以分为 训练集&#xff0c;交叉验证集&#xff0c;测试集。 训练集相当于自己做作业&#xff0c;验证集相当于考试测试一下自己的实力&#xff0c;测试集就是真刀真枪的干&#xff08;当你…...

【Unity3D】ECS入门学习(六)状态组件 ISystemStateComponentData

当需要获知组件是否被销毁时&#xff0c;ECS是没有回调告知的&#xff0c;因此可以将组件继承于ISystemStateComponentData接口&#xff0c;这样即使组件的实体被销毁了&#xff0c;该组件本身是不会消失的&#xff0c;所以可以通过在组件实体销毁后&#xff0c;去设置状态组件…...

DVWA靶场第三关 CSRF

CSRF的中文叫&#xff1a;”跨站请求攻击“&#xff0c;它是通过仿照某一个特殊的网页&#xff08;重置密码&#xff09;来进行诱惑性攻击。 难度&#xff08;low级&#xff09; 审计代码&#xff1a; <?phpif( isset( $_GET[ Change ] ) ) {// Get input$pass_new $_GE…...

工作流审批功能的一些概念

1. 引言 在当今数字化时代&#xff0c;企业与组织的运营效率在很大程度上依赖于高效、精准的工作流审批系统。随着业务日益复杂且多样化&#xff0c;审批流程变得愈加细致和灵活。一个完善的工作流审批系统不仅能确保任务在组织内部有序流转、协调各方资源&#xff0c;还能实现…...

深度学习与图像处理(国产深度学习框架——飞桨官方指定教材)

计算机视觉从小白到大师之路 《深度学习与图像处理&#xff08;PaddlePaddle版&#xff09;》这一本就够了 1.引言 随着人工智能技术的飞速发展&#xff0c;各行各业对深度学习、图像处理相关领域的人才需求日益迫切。本书旨在通过系统的理论讲解与丰富的实战案例&#xff0…...

音视频入门知识(二)、图像篇

⭐二、图像篇 视频基本要素&#xff1a;宽、高、帧率、编码方式、码率、分辨率 ​ 其中码率的计算&#xff1a;码率(kbps)&#xff1d;文件大小(KB)&#xff0a;8&#xff0f;时间(秒)&#xff0c;即码率和视频文件大小成正比 YUV和RGB可相互转换 ★YUV&#xff08;原始数据&am…...

计算机网络——期末复习(3)4-6章考试重点

第四章 根据IPv4第1个十进制数值判断&#xff0c;127以下为A类&#xff0c;128~191为B类&#xff0c;192~223为C类不能分配给主机或路由器接口的&#xff1a;A类网络号0和127&#xff0c;主机号全为0或全为1私有地址&#xff08;Private IP Address&#xff09;是指一类专门保…...

openfeign自动将Boolean默认为false

最近发现项目服务间&#xff0c;通过openfeign调用API时&#xff0c;为null的Boolean类型&#xff0c;接收端反系列化后变为false了&#xff0c;经查发现是通用组件中做了处理&#xff0c;特记录下。 主要是设置了这个 SerializerFeature.WriteNullBooleanAsFalse Bean Cond…...

如何实现底部导航栏

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了TextField Widget,本章回中将介绍BottomNavigationBar Widget。闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在本章回中将介绍一个新的Widget:BottomNavigationBar,它就是我们经常在App中看到了底部…...

【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案,附案例。

【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案&#xff0c;附案例。 【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案&#xff0c;附案例。 文章目录 【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案&#xff0c;附案例。1. 错…...

org.apache.zookeeper.server.quorum.QuorumPeerMain

QuorumPeerMain源代码 package org.apache.zookeeper.server.quorum;import java.io.IOException; import javax.management.JMException; import javax.security.sasl.SaslException; import org.apache.yetus.audience.InterfaceAudience; import org.apache.zookeeper.audi…...

如何在yolov8中使用ATSS策略

在yolov8中使用的标签匹配策略是TAL,本篇文章解析一下ATSS代码相关实现以及如何把ATSS放到yolov8中使用 看过本专栏中的另外两篇文章的同学应该对v8解析box那一套很熟悉了&#xff0c;ATSS的第一步就是去得到一系列的anchor-box(如果是anchor-based检测方法)或者anchor-point(基…...

常见的邮件协议SMTP和POP3

常见的邮件协议包括SMTP和POP3&#xff0c;SMTP用来发送邮件&#xff0c;POP3用来接收邮件信息。 SMTP SMTP 是一种用于发送电子邮件的协议。它的主要作用是将**电子邮件**从邮件客户端&#xff08;如 Outlook、Thunderbird&#xff09;或邮件服务器发送到接收服务器。 SMTP …...

线性代数行列式

目录 二阶与三阶行列式 二元线性方程组与二阶行列式 三阶行列式 全排列和对换 排列及其逆序数 对换 n阶行列式的定义 行列式的性质 二阶与三阶行列式 二元线性方程组与二阶行列式 若是采用消元法解x1、x2的话则得到以下式子 有二阶行列式的规律可得&#xff1a;分…...

cin/cout性能问题讨论和优化⽅法

样例解析&#xff1a; 在上面的两个案例中&#xff0c;我们发现虽然代码的逻辑是相同的&#xff0c;唯一的不同点在于scanf和cout的使用区别&#xff0c;一份超时一份ac&#xff0c;这是为什么呢&#xff1f;是否有可行的优化方法呢&#xff1f; 背景知识&#xff1a; 在 C 中…...

轮胎识别数据集,可对生产流水线里的轮胎图片标注,支持yolo,coco json,voc xml格式的标注,一共785张采集图片

轮胎识别数据集&#xff0c;可对生产流水线里的轮胎图片标注&#xff0c;支持yolo&#xff0c;coco json&#xff0c;voc xml格式的标注&#xff0c;一共785张采集图片 数据集分割 训练组90&#xff05; 706图片 有效集6% 46图片 测试集4% 33图片 预处理…...

ARM64 Windows 10 IoT工控主板运行x86程序效率测试

ARM上的 Windows 10 IoT 企业版支持仿真 x86 应用程序&#xff0c;而 ARM上的 Windows 11 IoT 企业版则支持仿真 x86 和 x64 应用程序。英创推出的名片尺寸ARM64工控主板ESM8400&#xff0c;可预装正版Windows 10 IoT企业版操作系统&#xff0c;x86程序可无需修改而直接在ESM84…...

Git核心概念

版本控制 什么是版本控制 版本控制是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 除了项目源代码&#xff0c;你可以对任何类型的文件进行版本控制。 为什么要版本控制 有了它你就可以将某个文件回溯到之前的状态&#xff0c;甚至将整…...

Spring Boot spring.factories文件详细说明

优质博文&#xff1a;IT-BLOG-CN 前言&#xff1a;经常看到 spring.factories 文件&#xff0c;却没有对它进行深入的了解和分析&#xff0c;今天我们就一起揭开面纱看看它的内在。 spring.factories 文件是 Spring Boot 自动配置机制的核心部分之一。它位于每个 Spring Boo…...

QWidget应用封装为qt插件,供其他qt应用调用

在之前的文章中,有介绍通过QProcess的方式启动QWidget应用,然后将其窗口嵌入到其他的qt应用中,作为子窗口使用.这篇文章主要介绍qt插件的方式将QWidget应用的窗口封装为插件,然后作为其他Qt应用中的子窗口使用. 插件优点: 与主程序为同一个进程,免去了进程间繁琐的通信方式,…...

Nginx的性能分析与调优简介

Nginx的性能分析与调优简介 一、Nginx的用途二、Nginx负载均衡策略介绍与调优三、其他调优方式简介四、Nginx的性能监控 一、Nginx的用途 ‌Nginx是一种高性能的HTTP和反向代理服务器&#xff0c;最初作为HTTP服务器开发&#xff0c;主要用于服务静态内容如HTML文件、图像、视…...

学习threejs,导入CTM格式的模型

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.ColladaLoader DAE模…...

Lua元表

哈喽&#xff0c;好久没有做记录了&#xff0c;最近刚好有时间打算整理一些基础常用内容&#xff0c;先做一期关于Lua相关的内容热热身。如果内容有误&#xff0c;欢迎大家指出我会积极做出响应。 在Lua中&#xff0c;元表&#xff08;metatable&#xff09; 和 元方法&#xf…...