【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站视频动态评论爬虫
废话不多说,直接先放git仓库:GitHub - linyuye/Bilibili_crawler: bilibili爬虫,基于selenium获取oid与cookie,request获取api内容 〇:概念简述 oid:视频/动态的uuid,b站对于发布内容的通用唯…...
清空DNS 缓存
如果遇到修改了host文件,但是IP和域名的映射有问题的情况,可以尝试刷新DNS缓存。 ipconfig/flushdns win建加R建,然后输入cmd,然后回车 然后回车,或者点击确定按钮。 出现如下所示标识清空DNS 缓存成功。...
东土智能交通服务器助力北京市车路云一体化建设
背景及意义 北京高级别自动驾驶示范区自2020年启动建设,至今已经发展建设到3.0阶段,通州区作为3.0阶段扩建的重点区域之一,扩区建设范围共计约175平方公里,涉及18个属地街镇,涵盖580个路口。 作为北京市车路云一体化…...
HarmonyOS NEXT 实战之元服务:静态案例效果---妙语集语
背景: 前几篇学习了元服务,后面几期就让我们开发简单的元服务吧,里面丰富的内容大家自己加,本期案例 仅供参考 先上本期效果图 ,里面图片自行替换 效果图1完整代码案例如下: 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
在写统计图的接口,sql查询一直无数据,给的默认值也没有实现: SELECTifnull( unit.num, 0 ) riskUnitCount,ifnull( EVENT.num, 0 ) riskEventCount,ifnull( measure.num, 0 ) riskMeasureCount FROMtb_companyLEFT JOIN (SELECTrisk.qyid,co…...
C++---------迭代策略与迭代器
一、迭代策略与迭代器 迭代器的概念 迭代器是一种对象,它提供了一种统一的方式来访问容器(如数组、向量、列表等)中的元素,而不暴露容器的内部结构。迭代器的行为类似于指针,可以用于遍历容器中的元素、修改元素以及…...
深入解析 Oracle 的聚合函数 ROLLUP
目录 深入解析 Oracle 的聚合函数 ROLLUP一、ROLLUP 函数概述二、ROLLUP 函数语法三、ROLLUP 实例详解(一)基础分组聚合(二)引入 ROLLUP 函数(三)ROLLUP 与 NULL 值(四)多列复杂分组…...
kipotix4靶机实战
信息收集 1.判断靶机ip 原理:开靶机之前nmap扫一次网段,再开靶机之后扫一次,查看多出来的ip就是靶机ip ip192.168.98.1742.判断端口服务,系统版本 a.确定端口 b.-p指定端口进一步收集 c.信息筛选 1.端口:22,80,139,…...
Java中处理if-else的几种高级方法
前言 在我看来多写几个if-else没啥大不了的,但是就是看起来没啥逼格,领导嫌弃。我根据开发的经历写几个不同的替代方法 一、枚举法替代 我先前写了一篇文章,可以去看看。 通过枚举替换if-else语句的解决方案_枚举代替if else c语言-CSDN博…...
LaTeX 是一种基于标记的排版系统,广泛用于创建高质量的文档,特别是在需要复杂数学公式、表格、文献引用等的场景中
LaTeX 是一种基于标记的排版系统,广泛用于创建高质量的文档,特别是在需要复杂数学公式、表格、文献引用等的场景中。以下是关于 LaTeX 的详细解释: 1. LaTeX 的基本概念 本质:LaTeX 是基于 TeX 的排版系统,提供了更高…...
Go入门篇:(一)golang的安装和编辑工具安装
一、前言 最近我有幸接触到Go语言,深入了解后,发现go语言确实有很多让人惊叹的地方。作为一个有着多年Java编程经验的程序员,我深深地被它所吸引,并且决定记录下我的学习之路,以便与大家分享我的经验和感悟。 与Java不同,Go语言的语法和运行效率都非常高,特别是对于并…...
【10】Selenium+Python UI自动化测试 邮件发送测试报告(某积载系统实例-04)
测试报告需要发送给相关人员,但每次都要在report目录下去复制太麻烦,可以使用邮件模块自动将生成的报告发送给相关人员 1、 新增utils文件夹,用于存放工具文件 在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…...
运算符 - 算术、关系、逻辑运算符
引言 在编程中,运算符是用于执行特定操作的符号。C 提供了多种类型的运算符,包括算术运算符、关系运算符和逻辑运算符等。理解这些运算符及其用法对于编写高效且无误的代码至关重要。本文将详细介绍 C 中的这三种基本运算符,并通过实例帮助读…...
中关村科金外呼机器人智能沟通破解营销难题
当今,传统的营销方式在效率、成本控制、客户管理等方面逐渐显现出局限性,难以满足现代企业的需求。如何提升营销效率、降低运营成本、有效管理客户会员,成为企业的难题。中关村科金外呼机器人通过智能化沟通技术,为企业提供了一站…...
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的动画(animation) css中实现动画有两种方式:transition过渡动画、 animation自定义动画。 具体的可以看MDN链接: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 系统,比 ubuntu 更轻量。debian 系统内,apt 镜像源列表位于 /etc/apt/source.list.d/debian.list(作为对比,ubuntu 的镜像列表位于 /etc/apt/source.list,二者语法相同)…...
DAY38|动态规划Part06|LeetCode:322. 零钱兑换、279.完全平方数、139.单词拆分
目录 LeetCode:322. 零钱兑换 基本思路 C代码 LeetCode:279.完全平方数 C代码 LeetCode:139.单词拆分 基本思路 C代码 LeetCode:322. 零钱兑换 力扣题目链接 文字讲解:LeetCode:322. 零钱兑换 视频讲解:动态规划之完全背包,装满背包最…...
Spring事务回滚
Transactional注解 Transactional作用:就是在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作。 Transactional注解:我们一般会在业务层当中来控制…...
【目标跟踪】checkpoint文件到底是什么?
说实话,我一直决定计算机视觉是个很玄的东西,里面的很多东西都是看了概念之后云里雾里,今天就把我复现代码时遇到的不懂得讲一讲——checkpoint文件是个啥? checkpoint文件顾名思义就是一个模型检查点文件,用于保存训练…...
hiprint结合vue2项目实现静默打印详细使用步骤
代码地址是:vue-plugin-hiprint: hiprint for Vue2/Vue3 ⚡打印、打印设计、可视化设计器、报表设计、元素编辑、可视化打印编辑 本地安装包地址:electron-hiprint 发行版 - Gitee.com 1、先安装hipint安装包在本地 2、项目运行npm(socket.…...
apt和apt-get软件包管理工具-debian
apt 和 apt-get 是在基于Debian的Linux发行版(如Ubuntu)中使用的两个软件包管理工具,它们都属于APT(Advanced Package Tool)的前端工具,用于管理软件包的安装、更新、升级和删除。以下是它们的特性和一些比…...
小程序租赁系统开发的优势与实践探索
内容概要 小程序租赁系统开发正在引起广泛关注,特别是在数字化快速发展的今天。很多企业开始意识到,小程序不仅能为他们带来更多的客户,还能极大地提高管理效率。借助小程序,用户在租赁时可以更加方便地浏览和选择产品࿰…...
sheng的学习笔记-AI-模型评估-留出法、交叉验证法、自助法
Ai目录:sheng的学习笔记-AI目录-CSDN博客 评估方法: 数据集可以分为 训练集,交叉验证集,测试集。 训练集相当于自己做作业,验证集相当于考试测试一下自己的实力,测试集就是真刀真枪的干(当你…...
【Unity3D】ECS入门学习(六)状态组件 ISystemStateComponentData
当需要获知组件是否被销毁时,ECS是没有回调告知的,因此可以将组件继承于ISystemStateComponentData接口,这样即使组件的实体被销毁了,该组件本身是不会消失的,所以可以通过在组件实体销毁后,去设置状态组件…...
DVWA靶场第三关 CSRF
CSRF的中文叫:”跨站请求攻击“,它是通过仿照某一个特殊的网页(重置密码)来进行诱惑性攻击。 难度(low级) 审计代码: <?phpif( isset( $_GET[ Change ] ) ) {// Get input$pass_new $_GE…...
工作流审批功能的一些概念
1. 引言 在当今数字化时代,企业与组织的运营效率在很大程度上依赖于高效、精准的工作流审批系统。随着业务日益复杂且多样化,审批流程变得愈加细致和灵活。一个完善的工作流审批系统不仅能确保任务在组织内部有序流转、协调各方资源,还能实现…...
深度学习与图像处理(国产深度学习框架——飞桨官方指定教材)
计算机视觉从小白到大师之路 《深度学习与图像处理(PaddlePaddle版)》这一本就够了 1.引言 随着人工智能技术的飞速发展,各行各业对深度学习、图像处理相关领域的人才需求日益迫切。本书旨在通过系统的理论讲解与丰富的实战案例࿰…...
音视频入门知识(二)、图像篇
⭐二、图像篇 视频基本要素:宽、高、帧率、编码方式、码率、分辨率 其中码率的计算:码率(kbps)=文件大小(KB)*8/时间(秒),即码率和视频文件大小成正比 YUV和RGB可相互转换 ★YUV(原始数据&am…...
计算机网络——期末复习(3)4-6章考试重点
第四章 根据IPv4第1个十进制数值判断,127以下为A类,128~191为B类,192~223为C类不能分配给主机或路由器接口的:A类网络号0和127,主机号全为0或全为1私有地址(Private IP Address)是指一类专门保…...
openfeign自动将Boolean默认为false
最近发现项目服务间,通过openfeign调用API时,为null的Boolean类型,接收端反系列化后变为false了,经查发现是通用组件中做了处理,特记录下。 主要是设置了这个 SerializerFeature.WriteNullBooleanAsFalse Bean Cond…...
如何实现底部导航栏
文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了TextField Widget,本章回中将介绍BottomNavigationBar Widget。闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在本章回中将介绍一个新的Widget:BottomNavigationBar,它就是我们经常在App中看到了底部…...
【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案,附案例。
【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案,附案例。 【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案,附案例。 文章目录 【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案,附案例。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那一套很熟悉了,ATSS的第一步就是去得到一系列的anchor-box(如果是anchor-based检测方法)或者anchor-point(基…...
常见的邮件协议SMTP和POP3
常见的邮件协议包括SMTP和POP3,SMTP用来发送邮件,POP3用来接收邮件信息。 SMTP SMTP 是一种用于发送电子邮件的协议。它的主要作用是将**电子邮件**从邮件客户端(如 Outlook、Thunderbird)或邮件服务器发送到接收服务器。 SMTP …...
线性代数行列式
目录 二阶与三阶行列式 二元线性方程组与二阶行列式 三阶行列式 全排列和对换 排列及其逆序数 对换 n阶行列式的定义 行列式的性质 二阶与三阶行列式 二元线性方程组与二阶行列式 若是采用消元法解x1、x2的话则得到以下式子 有二阶行列式的规律可得:分…...
cin/cout性能问题讨论和优化⽅法
样例解析: 在上面的两个案例中,我们发现虽然代码的逻辑是相同的,唯一的不同点在于scanf和cout的使用区别,一份超时一份ac,这是为什么呢?是否有可行的优化方法呢? 背景知识: 在 C 中…...
轮胎识别数据集,可对生产流水线里的轮胎图片标注,支持yolo,coco json,voc xml格式的标注,一共785张采集图片
轮胎识别数据集,可对生产流水线里的轮胎图片标注,支持yolo,coco json,voc xml格式的标注,一共785张采集图片 数据集分割 训练组90% 706图片 有效集6% 46图片 测试集4% 33图片 预处理…...
ARM64 Windows 10 IoT工控主板运行x86程序效率测试
ARM上的 Windows 10 IoT 企业版支持仿真 x86 应用程序,而 ARM上的 Windows 11 IoT 企业版则支持仿真 x86 和 x64 应用程序。英创推出的名片尺寸ARM64工控主板ESM8400,可预装正版Windows 10 IoT企业版操作系统,x86程序可无需修改而直接在ESM84…...
Git核心概念
版本控制 什么是版本控制 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 除了项目源代码,你可以对任何类型的文件进行版本控制。 为什么要版本控制 有了它你就可以将某个文件回溯到之前的状态,甚至将整…...
Spring Boot spring.factories文件详细说明
优质博文:IT-BLOG-CN 前言:经常看到 spring.factories 文件,却没有对它进行深入的了解和分析,今天我们就一起揭开面纱看看它的内在。 spring.factories 文件是 Spring Boot 自动配置机制的核心部分之一。它位于每个 Spring Boo…...
QWidget应用封装为qt插件,供其他qt应用调用
在之前的文章中,有介绍通过QProcess的方式启动QWidget应用,然后将其窗口嵌入到其他的qt应用中,作为子窗口使用.这篇文章主要介绍qt插件的方式将QWidget应用的窗口封装为插件,然后作为其他Qt应用中的子窗口使用. 插件优点: 与主程序为同一个进程,免去了进程间繁琐的通信方式,…...
Nginx的性能分析与调优简介
Nginx的性能分析与调优简介 一、Nginx的用途二、Nginx负载均衡策略介绍与调优三、其他调优方式简介四、Nginx的性能监控 一、Nginx的用途 Nginx是一种高性能的HTTP和反向代理服务器,最初作为HTTP服务器开发,主要用于服务静态内容如HTML文件、图像、视…...
学习threejs,导入CTM格式的模型
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.ColladaLoader DAE模…...
Lua元表
哈喽,好久没有做记录了,最近刚好有时间打算整理一些基础常用内容,先做一期关于Lua相关的内容热热身。如果内容有误,欢迎大家指出我会积极做出响应。 在Lua中,元表(metatable) 和 元方法…...