【爬虫】DrissionPage-6
官方文档:
https://www.drissionpage.cn/browser_control/visit
https://www.drissionpage.cn/browser_control/page_operation
1. Tab 对象概述
Tab 对象 是 DrissionPage 中用于控制浏览器标签页的主要单位。每个 Tab 对象对应一个浏览器标签页,负责执行各种网页操作,如页面跳转、元素管理、执行脚本等。
2. 页面跳转
Tab 对象提供了多种方法来控制页面的跳转和导航。
📌 get()
get()
方法用于跳转到指定的网址,支持访问本地文件路径,并内置了重试机制以应对连接失败的情况。
参数说明:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
url | str | 必填 | 目标 URL,可以是网页地址或本地文件路径。 |
show_errmsg | bool | False | 连接出错时是否显示和抛出异常。 |
retry | int | None | 重试次数。如果为 None ,则使用页面参数,默认值为 3 。 |
interval | float | None | 重试间隔(秒)。如果为 None ,则使用页面参数,默认值为 2 。 |
timeout | float | None | 加载超时时间(秒)。如果未指定,则使用 ChromiumPage 的 timeouts 属性中的 page_load 值。 |
params | dict | None | URL 请求参数(仅在 s 模式下有效)。 |
data | dict / str | None | 携带的数据。 |
json | dict / str | None | 要发送的 JSON 数据,会自动设置 Content-Type 为 application/json 。 |
headers | dict | None | 请求头。 |
cookies | dict / CookieJar | None | Cookies 信息。 |
files | Any | None | 要上传的文件,可以是字典,键为文件名,值为文件对象或文件路径。 |
auth | Any | None | 身份认证信息。 |
allow_redirects | bool | True | 是否允许重定向。 |
proxies | dict | None | 代理信息。 |
hooks | Any | None | 回调方法。 |
stream | bool | None | 是否使用流式传输。 |
verify | bool / str | None | 是否验证 SSL 证书。 |
cert | str / Tuple[str, str] | None | SSL 客户端证书文件的路径(.pem 格式),或 ('cert', 'key') 元组。 |
返回类型:bool
说明:返回访问是否成功。
示例:
from DrissionPage import Chromiumtab = Chromium().latest_tab
success = tab.get('https://www.example.com')
print(success) # 输出: True 或 False
📌 back()
back()
方法用于在浏览历史中后退若干步。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
steps | int | 1 | 后退步数。 |
返回类型:None
示例:
tab.back(2) # 后退两个网页
📌 forward()
forward()
方法用于在浏览历史中前进若干步。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
steps | int | 1 | 前进步数。 |
返回类型:None
示例:
tab.forward(2) # 前进两步
📌 refresh()
refresh()
方法用于刷新当前页面。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
ignore_cache | bool | False | 刷新时是否忽略缓存。 |
返回类型:None
示例:
tab.refresh() # 刷新页面
📌 stop_loading()
stop_loading()
方法用于强制停止当前页面加载。
参数:无
返回类型:None
📌 set.blocked_urls()
set.blocked_urls()
方法用于设置忽略的连接。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
urls | str / list / tuple / None | 必填 | 要忽略的 URL,可以传入多个,可用 * 通配符,传入 None 时清空已设置的项。 |
返回类型:None
示例:
tab.set.blocked_urls('*.css*') # 设置不加载 CSS 文件
3. 元素管理
📌 add_ele()
add_ele()
方法用于创建一个新元素,并可选择是否将其插入到 DOM 中。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
html_or_info | str / Tuple[str, dict] | 必填 | 新元素的 HTML 文本或信息。如果为 tuple ,则可以新建不添加到 DOM 的元素。 |
insert_to | str / ChromiumElement / Tuple[str, str] | None | 插入到哪个元素中,可以接收元素对象和定位符。如果为 None ,且 html_or_info 是 str ,则添加到 body ,否则不添加到 DOM。 |
before | str / ChromiumElement / Tuple[str, str] | None | 在哪个子节点前面插入,可以接收对象和定位符,为 None 时插入到父元素末尾。 |
返回类型:ChromiumElement
说明:新建的元素对象。
示例:
from DrissionPage import Chromiumtab = Chromium().latest_tab
tab.get('https://www.baidu.com')
html = '<a href="http://DrissionPage.cn" target="blank">DrissionPage </a> '
ele = tab.add_ele(html, '#s-top-left', '新闻') # 插入到导航栏
ele.click()
添加一个不可见的元素:
from DrissionPage import Chromiumtab = Chromium().latest_tab
info = ('a', {'innerText': 'DrissionPage', 'href': 'http://DrissionPage.cn', 'target': 'blank'})
ele = tab.add_ele(info)
ele.click('js') # 需用 JS 点击
📌 remove_ele()
remove_ele()
方法用于从页面上删除一个元素。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
loc_or_ele | str / Tuple[str, str] / ChromiumElement | 必填 | 要删除的元素,可以是元素或定位符。 |
返回类型:None
示例:
# 删除一个已获得的元素
ele = tab('tag:a')
tab.remove_ele(ele)# 删除用定位符找到的元素
tab.remove_ele('tag:a')
4. 执行脚本或命令
📌 run_js()
run_js()
方法用于执行 JavaScript 脚本。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
script | str | 必填 | JavaScript 脚本文本或脚本文件路径。 |
*args | - | 无 | 传入的参数,按顺序在 JS 文本中对应 arguments[0] 、arguments[1] … |
as_expr | bool | False | 是否作为表达式运行,为 True 时 args 参数无效。 |
timetout | float | None | JS 超时时间(秒),为 None 则使用页面 timeouts.script 设置。 |
返回类型:Any
说明:脚本执行结果。
示例:
# 用传入参数的方式执行 JS 脚本,显示弹出框显示 Hello world!
tab.run_js('alert(arguments[0]+arguments[1]);', 'Hello', ' world!')
注意:
- 如果
as_expr
为True
,脚本应是返回一个结果的形式,并且不能有return
。 - 如果
as_expr
不为True
,脚本应尽量写成一个方法。
📌 run_js_loaded()
run_js_loaded()
方法用于运行 JavaScript 脚本,执行前等待页面加载完毕。
参数:与 run_js()
方法相同。
返回类型:Any
说明:脚本执行结果。
📌 run_async_js()
run_async_js()
方法用于以异步方式执行 JavaScript 代码。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
script | str | 必填 | JavaScript 脚本文本。 |
*args | - | 无 | 传入的参数,按顺序在 JS 文本中对应 arguments[0] 、arguments[1] … |
as_expr | bool | False | 是否作为表达式运行,为 True 时 args 参数无效。 |
返回类型:None
📌 run_cdp()
run_cdp()
方法用于执行 Chrome DevTools Protocol 语句。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
cmd | str | 必填 | 协议项目。 |
**cmd_args | - | 无 | 项目参数。 |
返回类型:dict
说明:执行返回的结果。
示例:
# 停止页面加载
tab.run_cdp('Page.stopLoading')
📌 run_cdp_loaded()
run_cdp_loaded()
方法用于执行 Chrome DevTools Protocol 语句,执行前先确保页面加载完毕。
参数:与 run_cdp()
方法相同。
返回类型:dict
说明:执行返回的结果。
5. Cookies 及缓存
📌 set.cookies()
set.cookies()
方法用于设置 Cookie,可以设置一个或多个。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
cookies | Cookie / CookieJar / list / tuple / str / dict | 必填 | Cookies 信息。 |
返回类型:None
示例:
# 可以接受多种类型的参数
cookies1 = ['name1=value1', 'name2=value2']
cookies2 = 'name1=value1; name2=value2; path=/; domain=.example.com;'
cookies3 = {'name1': 'value1', 'name2': 'value2', 'domain': '.example.com'}
tab.set.cookies(cookies1)
📌 set.cookies.clear()
set.cookies.clear()
方法用于清除所有 Cookie。
参数:无
返回类型:None
📌 set.cookies.remove()
set.cookies.remove()
方法用于删除一个 Cookie。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
name | str | 必填 | Cookie 的 name 字段。 |
url | str | None | Cookie 的 url 字段。 |
domain | str | None | Cookie 的 domain 字段。 |
path | str | None | Cookie 的 path 字段。 |
返回类型:None
📌 set.session_storage()
set.session_storage()
方法用于设置或删除某项 sessionStorage
信息。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
item | str | 必填 | 要设置的项。 |
value | str / False | 必填 | 为 False 时,删除该项。 |
返回类型:None
示例:
tab.set.session_storage(item='abc', value='123')
📌 set.local_storage()
set.local_storage()
方法用于设置或删除某项 localStorage
信息。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
item | str | 必填 | 要设置的项。 |
value | str / False | 必填 | 为 False 时,删除该项。 |
返回类型:None
📌 clear_cache()
clear_cache()
方法用于清除缓存,可选择要清除的项。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
session_storage | bool | True | 是否清除 sessionStorage 。 |
local_storage | bool | True | 是否清除 localStorage 。 |
cache | bool | True | 是否清除 cache 。 |
cookies | bool | True | 是否清除 cookies 。 |
返回类型:None
示例:
tab.clear_cache(cookies=False) # 除了 cookies,其它都清除
6. 运行参数设置
📌 set.retry_times()
set.retry_times()
方法用于设置连接失败时重连次数。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
times | int | 必填 | 次数。 |
返回类型:None
📌 set.retry_interval()
set.retry_interval()
方法用于设置连接失败时重连间隔。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
interval | float | 必填 | 秒数。 |
返回类型:None
📌 set.timeouts()
set.timeouts()
方法用于设置三种超时时间,单位为秒。可单独设置,为 None
表示不改变原来设置。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
base | float | None | 整体超时时间。 |
page_load | float | None | 页面加载超时时间。 |
script | float | None | 脚本运行超时时间。 |
返回类型:None
示例:
tab.set.timeouts(base=10, page_load=30)
📌 set.load_mode
set.load_mode
属性用于设置页面加载策略,调用其方法选择某种策略。
方法:
方法名称 | 参数 | 说明 |
---|---|---|
normal() | 无 | 等待页面完全加载完成,为默认状态。 |
eager() | 无 | 等待文档加载完成就结束,不等待资源加载。 |
none() | 无 | 页面连接完成就结束。 |
示例:
tab.set.load_mode.normal()
tab.set.load_mode.eager()
tab.set.load_mode.none()
📌 set.user_agent()
set.user_agent()
方法用于为浏览器当前标签页设置 user agent
。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
ua | str | 必填 | user agent 字符串。 |
platform | str | None | 平台类型,如 'android' 。 |
返回类型:None
📌 set.headers()
set.headers()
方法用于设置额外添加到当前页面请求 headers
的参数。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
headers | dict / str | 必填 | headers 信息。 |
返回类型:None
示例:
# dict 格式
h = {'connection': 'keep-alive', 'accept-charset': 'GB2312,utf-8;q=0.7,*;q=0.7'}
tab.set.headers(headers=h)# 文本格式
h = '''connection: keep-alive
accept-charset: GB2312,utf-8;q=0.7,*;q=0.7'''
tab.set.headers(headers=h)
7. 窗口管理
📌 set.window.max()
set.window.max()
方法用于使窗口最大化。
参数:无
返回类型:None
示例:
tab.set.window.max()
📌 set.window.mini()
set.window.mini()
方法用于使窗口最小化。
参数:无
返回类型:None
📌 set.window.full()
set.window.full()
方法用于使窗口切换到全屏模式。
参数:无
返回类型:None
📌 set.window.normal()
set.window.normal()
方法用于使窗口切换到普通模式。
参数:无
返回类型:None
📌 set.window.size()
set.window.size()
方法用于设置窗口大小。只传入一个参数时,另一个参数不会变化。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
width | int | None | 窗口宽度。 |
height | int | None | 窗口高度。 |
返回类型:None
示例:
tab.set.window.size(500, 500)
📌 set.window.location()
set.window.location()
方法用于设置窗口位置。只传入一个参数时,另一个参数不会变化。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
x | int | None | 距离顶部距离。 |
y | int | None | 距离左边距离。 |
返回类型:None
示例:
tab.set.window.location(500, 500)
📌 set.window.hide()
set.window.hide()
方法用于隐藏浏览器窗口。
注意:
- 这个方法直接隐藏浏览器进程,在任务栏上也会消失。仅支持 Windows 系统,并且必须已安装
pypiwin32
库才可使用。 - 窗口隐藏后,如果有新窗口出现,整个浏览器又会显现出来。
参数:无
返回类型:None
示例:
tab.set.window.hide()
注意:
- 浏览器隐藏后并没有关闭,下次运行程序还会接管已隐藏的浏览器。
- 浏览器隐藏后,如果有新建标签页,会自行显示出来。
📌 set.window.show()
set.window.show()
方法用于显示当前浏览器窗口。
参数:无
返回类型:None
8. 页面滚动
📌 scroll() / scroll.down()
scroll()
和 scroll.down()
方法用于使页面向下滚动若干像素,水平位置不变。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
pixel | int | 必填 | 滚动的像素。 |
返回类型:ChromiumTab
/ MixTab
/ ChromiumFrame
说明:返回页面对象自身。
📌 scroll.up()
scroll.up()
方法用于使页面向上滚动若干像素,水平位置不变。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
pixel | int | 必填 | 滚动的像素。 |
返回类型:ChromiumTab
/ MixTab
/ ChromiumFrame
说明:返回页面对象自身。
示例:
tab.scroll.up(30)
📌 scroll.right()
scroll.right()
方法用于使页面向右滚动若干像素,垂直位置不变。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
pixel | int | 必填 | 滚动的像素。 |
返回类型:ChromiumTab
/ MixTab
/ ChromiumFrame
说明:返回页面对象自身。
📌 scroll.left()
scroll.left()
方法用于使页面向左滚动若干像素,垂直位置不变。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
pixel | int | 必填 | 滚动的像素。 |
返回类型:ChromiumTab
/ MixTab
/ ChromiumFrame
说明:返回页面对象自身。
📌 scroll.to_top()
scroll.to_top()
方法用于滚动页面到顶部,水平位置不变。
参数:无
返回类型:ChromiumTab
/ MixTab
/ ChromiumFrame
说明:返回页面对象自身。
示例:
tab.scroll.to_top()
📌 scroll.to_bottom()
scroll.to_bottom()
方法用于滚动页面到底部,水平位置不变。
参数:无
返回类型:ChromiumTab
/ MixTab
/ ChromiumFrame
说明:返回页面对象自身。
📌 scroll.to_half()
scroll.to_half()
方法用于滚动页面到垂直中间位置,水平位置不变。
参数:无
返回类型:ChromiumTab
/ MixTab
/ ChromianFrame
说明:返回页面对象自身。
📌 scroll.to_rightmost()
scroll.to_rightmost()
方法用于滚动页面到最右边,垂直位置不变。
参数:无
返回类型:ChromiumTab
/ MixTab
/ ChromiumFrame
说明:返回页面对象自身。
📌 scroll.to_leftmost()
scroll.to_leftmost()
方法用于滚动页面到最左边,垂直位置不变。
参数:无
返回类型:ChromiumTab
/ MixTab
/ ChromiumFrame
说明:返回页面对象自身。
📌 scroll.to_location()
scroll.to_location()
方法用于滚动页面到指定位置。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
x | int | 必填 | 水平位置,单位是像素。 |
y | int | 必填 | 垂直位置,单位是像素。 |
返回类型:ChromiumTab
/ MixTab
/ ChromiumFrame
说明:返回页面对象自身。
示例:
tab.scroll.to_location(300, 50)
📌 scroll.to_see()
scroll.to_see()
方法用于滚动页面直到元素可见。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
loc_or_ele | str / tuple / ChromiumElement | 必填 | 元素的定位信息,可以是元素、定位符。 |
center | bool / None | None | 是否尽量滚动到页面正中,为 None 时如果被遮挡,则滚动到页面正中。 |
返回类型:ChromiumTab
/ MixTab
/ ChromiumFrame
说明:返回页面对象自身。
示例:
# 滚动到某个已获得到的元素
ele = tab.ele('tag:div')
tab.scroll.to_see(ele)# 滚动到按定位符查找到的元素
tab.scroll.to_see('tag:div')
9. 滚动设置
📌 set.scroll.smooth()
set.scroll.smooth()
方法设置网站是否开启平滑滚动。建议用此方法为网页关闭平滑滚动。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
on_off | bool | True | bool 表示开或关。 |
返回类型:None
示例:
tab.set.scroll.smooth(on_off=False)
📌 set.scroll.wait_complete()
set.scroll.wait_complete()
方法用于设置滚动后是否等待滚动结束。在不想关闭网页平滑滚动功能时,可开启此设置以保障滚动结束后才执行后面的步骤。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
on_off | bool | True | bool 表示开或关。 |
返回类型:None
示例:
tab.set.scroll.wait_complete(on_off=True)
10. 弹出消息处理
📌 handle_alert()
handle_alert()
方法用于处理提示框。它能够设置等待时间,等待提示框出现才进行处理,若超时没等到提示框,返回 False
。也可以只获取提示框文本而不处理提示框。还可以处理下一个出现的提示框,这在处理离开页面时触发的弹窗非常有用。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
accept | bool / None | True | True 表示确认,False 表示取消,None 不会按按钮但依然返回文本值。 |
send | str | None | 处理 prompt 提示框时可输入文本。 |
timeout | float | None | 等待提示框出现的超时时间(秒),为 None 时使用页面整体超时时间。 |
next_one | bool | False | 是否处理下一个出现的弹窗,为 True 时 timeout 参数无效。 |
返回类型:str
/ False
说明:提示框内容文本,未等到提示框则返回 False
。
示例:
# 确认提示框并获取提示框文本
txt = tab.handle_alert()# 点击取消
tab.handle_alert(accept=False)# 给 `prompt` 提示框输入文本并点击确定
tab.handle_alert(accept=True, send='some text')# 不处理提示框,只获取提示框文本
txt = tab.handle_alert(accept=None)
📌 自动处理
标签页对象 可使用 set.auto_handle_alert()
方法设置自动处理该 tab
的提示框,使提示框不会弹窗而直接被处理掉。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
on_off | bool | True | 开或关。 |
accept | bool | True | 确定还是取消。 |
返回类型:None
示例:
from DrissionPage import Chromiumtab = Chromium().latest_tab
tab.set.auto_handle_alert() # 这之后出现的弹窗都会自动确认
全局自动处理:
如果需要设置所有标签页都自动处理 alert
,可用 Chromium
对象进行设置。
from DrissionPage import Chromiumbrowser = Chromium()
browser.set.auto_handle_alert()
或者
from DrissionPage import Chromiumtab = Chromium().latest_tab
tab.browser.set.auto_handle_alert()
11. 关闭及重连
📌 disconnect()
disconnect()
方法用于页面对象断开与页面的连接,但不关闭标签页。断开后,对象不能对标签页进行操作。Tab
和 ChromiumFrame
对象都有此方法。
参数:无
返回类型:None
📌 reconnect()
reconnect()
方法用于关闭与页面连接,然后重建一个新连接。这主要用于应付长期运行导致内存占用过高,断开连接可释放内存,然后重连继续控制浏览器。Tab
和 ChromiumFrame
对象都有此方法。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
wait | float | 0 | 关闭后等待多少秒再连接。 |
返回类型:None
📌 close()
close()
方法用于关闭标签页。可关闭自己或自己以外的。
参数:
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
others | bool | False | 是否关闭自己以外的标签页。 |
session | bool | False | 是否同时关闭内置 Session 对象,只对自己有效。 |
返回类型:None
相关文章:
【爬虫】DrissionPage-6
官方文档: https://www.drissionpage.cn/browser_control/visit https://www.drissionpage.cn/browser_control/page_operation 1. Tab 对象概述 Tab 对象 是 DrissionPage 中用于控制浏览器标签页的主要单位。每个 Tab 对象对应一个浏览器标签页,负责执行各种网页…...
C/C++实践(十)C语言冒泡排序深度解析:发展历史、技术方法与应用场景
一、发展历史 冒泡排序(Bubble Sort)作为计算机科学领域最基础的排序算法之一,其历史可追溯至计算机编程的早期阶段。尽管具体起源时间难以考证,但它在20世纪50年代至60年代间被广泛讨论和应用。冒泡排序的名称来源于其独特的排序…...
git提交库常用词
新功能 feat修改BUG fix文档修改 docs格式修改 style重构 refactor性能提升 perf测试 test构建系统 build对CI配置文件修改 ci修改构建流程、或增加依赖库、工具 chore回滚版本 revert...
结构化思考力_第一章_明确理念打基础
接收信息的3个步骤 1. 梳理:观点、理由、事实和数据; 2. 画3这的结构图 3. 一句话概括 可套用固定格式。在——的基础上,从——、——、——N个方面,说明了————。 一句话概括主要内容的前提是,一定是结构非常…...
【C语言练习】046. 编写插入排序算法
046. 编写插入排序算法 046. 编写插入排序算法C语言实现插入排序代码说明示例运行输入:输出:插入排序的特点一、插入排序的适用场景二、C语言代码示例及分步讲解代码实现代码解析三、示例执行过程四、性能分析五、总结046. 编写插入排序算法 插入排序(Insertion Sort)是一…...
Kotlin与机器学习实战:Android端集成TensorFlow Lite全指南
本文将手把手教你如何在Android应用中集成TensorFlow Lite模型,实现端侧机器学习推理能力。我们以图像分类场景为例,提供可直接运行的完整代码示例。 环境准备 1. 开发环境要求 Android Studio Arctic Fox以上版本AGP 7.0Kotlin 1.6Minimum SDK 21 2.…...
【Linux笔记】nfs网络文件系统与autofs(nfsdata、autofs、autofs.conf、auto.master)
一、nfs概念 NFS(Network File System,网络文件系统) 是一种由 Sun Microsystems 于1984年开发的分布式文件系统协议,允许用户通过网络访问远程计算机上的文件,就像访问本地文件一样。它广泛应用于 Unix/Linux 系统&a…...
Redis持久化机制详解:保障数据安全的关键策略
在现代应用开发中,Redis作为高性能的内存数据库被广泛使用。然而,内存的易失性特性使得持久化成为Redis设计中的关键环节。本文将全面剖析Redis的持久化机制,包括RDB、AOF以及混合持久化模式,帮助开发者根据业务需求选择最适合的持…...
经典算法 求C(N, K) % mod,保证mod是质数
求C(N, K) % mod,保证mod是质数 问题描述 给你三个整数N,K,mod保证mod是一个质数,求组合数C(N, K) % mod。 输入描述 输入有多组,输入第一行为两个整数T,mod。接下来2 - T 1行,每行输入N, K。 输出描…...
NY309NY318美光科技颗粒NY319NY320
NY309NY318美光科技颗粒NY319NY320 技术解析:架构创新与性能突围 美光科技的NY系列颗粒(如NY309、NY318、NY319、NY320)延续了其在存储技术领域的创新基因。以NY319为例,其采用16层BiCS3 3D NAND工艺,通过浮栅&#…...
Buildroot 移植MiniGUI: 编写简单示例(基于君正X2000)
概述 上一篇文章: Buildroot 移植MiniGUI, 在编译打包完文件系统后, 编写一个Demo进一步验证MiniGUI的功能. 目标平台: 键值CPUX2000架构mips内存128MB存储256MBLCD600*1024 MiniGUI 的三种运行模式 在编写第一个 MiniGUI 程序之前,需要了解如下事实࿱…...
flutter长列表 ListView、GridView、SingleChildScrollView、CustomScrollView区别
组件名称用途/适合场景是否懒加载支持列表结构用法复杂度SingleChildScrollView适用于内容数量不大、不重复的页面(如表单、静态内容)❌ 否❌ 否⭐⭐ListView适用于垂直方向的长列表,自动滚动;适合展示大量数据✅ 支持✅ 是⭐⭐Li…...
OpenCV透视变换
概念 OpenCV 透视变换是将图像从一个视平面投影到另一个视平面的过程,也叫投影映射 ,属于空间立体三维变换。它基于透视原理,通过 33 的变换矩阵作用于图像像素坐标来实现映射转换 ,能模拟人眼或相机镜头观看三维空间物体时的透视…...
Node.js 实战四:数据库集成最佳实践
你写了个登录接口,用上了 JWT;然后,产品来了句: “用户数据能分页查吗?能关联公司信息吗?我们这边还有多语言字段…” 你发现:SQL 写得越来越长,关联越来越绕,字段越来越…...
【JDBC】JDBC概述、历史版本及特征
1_JDBC概述 什么是JDBC JDBC(Java DataBase Connectivity, Java数据库连接) ,是一种用于执行SQL语句的Java API,为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成 有了JDBC,程序员只需用JDBC API写一个程序…...
redis的pipline使用结合线程池优化实战
文章目录 代码讲解与事务 (MULTI/EXEC) 的区别在你这段代码里的价值可能的坑实战建议 代码 /*** 批量根据用户 ID 查询用户信息** param findUsersByIdsReqDTO* return*/Overridepublic Response<List<FindUserByIdRspDTO>> findByIds(FindUsersByIdsReqDTO findUs…...
【RabbitMQ】整合 SpringBoot,实现工作队列、发布/订阅、路由和通配符模式
文章目录 工作队列模式引入依赖配置声明生产者代码消费者代码 发布/订阅模式引入依赖声明生产者代码发送消息 消费者代码运行程序 路由模式声明生产者代码消费者代码运行程序 通配符模式声明生产者代码消费者代码运行程序 工作队列模式 引入依赖 我们在创建 SpringBoot 项目的…...
MySQL初阶:sql事务和索引
索引(index) 可以类似理解为一本书的目录,一个表可以有多个索引。 索引的意义和代价 在MySQL中使用select进行查询时会经过: 1.先遍历表 2.将条件带入每行记录中进行判断,看是否符合 3.不符合就跳过 但当表中的…...
使用教程:8x16模拟开关阵列可级联XY脚双向导通自动化接线
以下通过点亮LED进行基本使用流程演示,实际可以连接复杂外设(SPI、CAN、ADC等) 单模块使用 RX、TX、5V和GND接到串口模块;X5接5V;Y2接LED;LED-接GND 串口模块插上电脑后,LED没有亮;因为此时模…...
很啰嗦,再次总结 DOM
DOM (文档对象模型) 详解 一、DOM 基础概念 1. 定义与作用 DOM(Document Object Model)即文档对象模型,是一种用于 HTML 和 XML 文档的编程接口。它将文档解析为一个由节点和对象组成的树状结构,允许程序和脚本动态访问、修改文…...
文件读取漏洞路径与防御总结
文件读取漏洞路径与防御总结 文件读取漏洞允许攻击者通过路径遍历等手段访问未授权的文件。以下是Linux和Windows系统中常见敏感路径的归纳及防御建议: Linux 系统常见敏感路径 系统关键文件: /etc/passwd:用户账户信息(可被用来…...
电池的充放电电流中C的含义
充电电池的充放电电流标注为 -0.2C、1C、2C 等参数时,其含义与电池的容量和充放电速率直接相关。以下是详细解释: 1. 什么是 “C” 值? • C 是电池的 额定容量(Capacity) 的缩写,单位为 Ah(安时…...
文章记单词 | 第91篇(六级)
一,单词释义 stride /straɪd/- v. 大步走;跨越;迈进 /n. 大步;进展;步幅diplomatic /ˌdɪpləˈmtɪk/- adj. 外交的;有手腕的conquer /ˈkɒŋkə(r)/- v. 征服;战胜;克服geogra…...
Nginx应用场景详解与配置指南
1. 什么是Nginx? Nginx(发音为"engine-x")是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。它以高性能、稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。 2. Nginx的主要应用场景 2.1 …...
【Ubuntu】Waydroid-Linux安卓模拟器安装
✅ 1. 安装 Waydroid sudo apt update sudo apt install curl ca-certificates gnupg git -y curl -s https://repo.waydro.id | sudo bash sudo apt install waydroid -y sudo apt install dbus-x11✅ 2. 初始化 Waydroid 使用普通system版本: sudo waydroid in…...
设计模式 - 单例模式 - Tips
为什么双重检查会带来空指针异常问题? if (instance null) { synchronized (Singleton.class) { if (instance null) { instance new Singleton(); } } …...
设计模式7大原则与UML类图详解
设计模式7大原则与UML类图详解 引言 🌟 在软件工程领域,设计模式和UML(统一建模语言)是提高代码质量、增强系统可维护性的重要工具。设计模式提供了解决软件设计中常见问题的通用方案,而UML则为我们提供了一种可视化的…...
如何分析动态采样引起的计划不稳定 | OceanBase SQL 调优实践
这篇博客涉及两个知识点,一个是动态采样,另一个是 DAS 执行。 用户的问题和相关结论 我们看看用户在OceanBase 社区论坛发帖中提出的疑问及其所得出的结论。 问题:收集统计信息之前,为什么会出现计划不稳定的情况? …...
NY321NY322美光闪存芯片NY323NY336
NY321NY322美光闪存芯片NY323NY336 在存储技术飞速发展的今天,美光科技的闪存芯片凭借其创新架构与高性能表现,已成为工业自动化、智能终端等领域的核心组件。本文将围绕技术解析、产品评测、行业趋势、应用案例及市场动态五大维度,深入探讨…...
HMDB51数据集划分
生成训练集、验证集和测试集 每个split文件应该包含: 训练集(id1): 70个视频测试集(id2): 30个视频未使用(id0): 剩余视频 这是一个70/30的训练/测试分割比例。标记为0的视频被排除在当前实验之外。实际上训练集(id1),验证集&am…...
25、DeepSeek-R1论文笔记
DeepSeek-R1论文笔记 1、研究背景与核心目标2、核心模型与技术路线3、蒸馏技术与小模型优化4、训练过程简介5、COT思维链(Chain of Thought)6、强化学习算法(GRPO)7、冷启动**1. 冷启动的目的****2. 冷启动的实现步骤****3. 冷启动…...
CodeBuddy 打造响应式测试平台:ScreenLab 的诞生记
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 开发工具:CodeBuddy(AI 代码伙伴) 技术栈:Vue3 Vite 原生 CSS…...
STM32实战指南:SG90舵机控制原理与代码详解
知识点1【SG90的简述】 SG90是一款微型舵机(Micro Servo),由TowerPro等厂商提供,广泛用于机器人,舵机云台,舵机控制教学等项目中。 1、基本参数 2、工作原理 SG90内部有电机,齿轮组ÿ…...
基于Spring Boot和Vue的在线考试系统架构设计与实现(源码+论文+部署讲解等)
源码项目获取联系 请文末卡片dd我获取更详细的演示视频 系统介绍 基于Spring Boot和Vue的在线考试系统。为学生和教师/管理员提供一个高效、便捷的在线学习、考试及管理平台。系统采用前后端分离的架构,后端基于成熟稳定的Spring Boot框架,负责数据处理…...
开源RTOS(实时操作系统):nuttx 编译
开源RTOS(实时操作系统):nuttx 编译 手册:Installing — NuttX latest documentation 源码:GitHub - apache/nuttx: Apache NuttX is a mature, real-time embedded operating system (RTOS) Installing The fir…...
C++学习:六个月从基础到就业——C++11/14:decltype关键字
C学习:六个月从基础到就业——C11/14:decltype关键字 本文是我C学习之旅系列的第四十二篇技术文章,也是第三阶段"现代C特性"的第四篇,主要介绍C11/14中的decltype关键字。查看完整系列目录了解更多内容。 引言 在现代C…...
【51】快速获取数码管段选表(含小数点)及字母表的工具(分享)
1 介绍 1.1 画面 1.2 用法 输入IO口和段码字母的映射关系,比如这里e4d5dp2,指的是bit4是e段,bit5是d段,bit2是小数点dp段。 然后选择有效电平(1表示亮 or 0表示亮)。 点击生成段码配置,即可得到…...
高频面试题(含笔试高频算法整理)基本总结回顾120
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...
5月17日
这几天不知道为啥没更新。可能是玩得太疯了。或者是考试有点集中?? 线性代数开课了,英语昨天完成了debate 昨天中午debate结束我们就出去玩了,去的那里时光民俗,别墅很好,770平米,但是缺点是可…...
摩方 12 代 N200 迷你主机(Ubuntu 系统)WiFi 抓包环境配置教程
摩方12代N200迷你主机标配 Intel AX201无线网卡,支持 WiFi 6 协议(802.11ax)及蓝牙5.2。此网卡兼容主流抓包工具,但需注意: 驱动兼容性:Ubuntu 20.04及以上内核版本(5.4)默认支持AX2…...
从零开始:使用 PyTorch 构建深度学习网络
从零开始:使用 PyTorch 构建深度学习网络 目录 PyTorch 简介环境配置PyTorch 基础构建神经网络训练模型评估与测试案例实战:手写数字识别进阶技巧常见问题解答 PyTorch 简介 PyTorch 是一个开源的深度学习框架,由 Facebook(现…...
应用层自定义协议与序列化
应用层自定义协议与序列化 应用层协议网络版计算器序列化和反序列化序列化反序列化 重新理解read、write、recv、send和TCP为什么支持全双工代码结构Jsoncpp特性安装序列化使用Json::Value的toStyledString方法使用Json::StreamWriter使用Json::FastWriter 反序列化使用Json::R…...
2025春训第二十场
问题 B: 狗是啥呀 题目描述 在神秘的地狱深处,有着一种神秘的犬类生物,据传这种生物长了x个脑袋,并且具有强大的生命力。由于见过它的人全都下落不明,至今没有人知道它的真面目。 一位勇士为了斩杀这奇怪的生物,来到地…...
分糖果--思维+while判断
1.从左到右只考虑右边一遍,再从右到左考虑左边一遍,相当于左右考虑了 2.然后关键是1遍不一定行,while循环直到成功 https://www.luogu.com.cn/problem/B4091 #include<bits/stdc.h> using namespace std; #define N 100011 typedef …...
[system-design] ByteByteGo_Note Summary
目录 通信协议 REST API 与 GraphQL gRPC 如何工作? 什么是Webhook? 如何提高应用程序接口的性能? HTTP 1.0 -> HTTP 1.1 -> HTTP 2.0 -> HTTP 3.0 (QUIC) SOAP vs REST vs GraphQL vs RPC 代码优先与应用程序接口优先 HTT…...
Flask项目实践:构建功能完善的博客系统(含评论与标签功能)
引言 在Python Web开发领域,Flask以其轻量级、灵活性和易用性赢得了众多开发者的青睐。本文将带您从零开始构建一个功能完善的博客系统,包含文章发布、评论互动和标签分类等核心功能。通过这个实战项目,您不仅能掌握Flask的核心技术…...
Python爬虫实战:获取1688商品信息
在电商领域,获取1688商品信息对于市场分析、竞品研究、用户体验优化等至关重要。1688作为国内领先的B2B电商平台,提供了丰富的商品资源。通过Python爬虫技术,我们可以高效地获取1688商品的详细信息,包括商品名称、价格、图片、描述…...
Canva 推出自有应用生成器以与 Bolt 和 Lovable 竞争
AI 目前是一个巨大的市场,每个人都想从中分一杯羹。 即使是 Canva,这个以拖放图形设计而闻名的流行设计平台,也在其 Canva Create 2025 活动中发布了自己版本的代码生成器,加入了 AI 竞赛。 但为什么一个以设计为先的平台会提供代码生成工具呢? 乍看之下,这似乎有些不…...
多平台屏幕江湖生存指南
UniApp 屏幕适配大师:多平台屏幕江湖生存指南 屏幕江湖:尺寸混战 屏幕适配就像是应对不同体型的客人:从迷你的手机屏,到标准的平板,再到巨大的电视屏幕,你的应用必须有如武林高手般的适应力。 ┌──────────────────────────────────…...
BootCDN介绍(Bootstrap主导的前端开源项目免费CDN加速服务)
文章目录 BootCDN前端开源项目CDN加速服务全解析什么是BootCDN技术原理与架构CDN技术基础BootCDN架构特点1. 全球分布式节点网络2. 智能DNS解析系统3. 高效缓存管理机制4. 自动同步更新机制5. HTTPS和HTTP/2协议支持 BootCDN的核心优势速度与稳定性开源免费资源丰富度技术规范遵…...