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

【爬虫】DrissionPage-获取douyim用户下的视频

之前看过DrissionPage,觉得很厉害,比selenium简单,适合新手。因为盲目跟风逆向,今天看了一个DrissionPage案例直播,学习一下,真香哈。

DrissionPage官网:🛰️ 概述 | DrissionPage官网

需求分析:

爬取douyim用户下的视频。分四个步骤:(最后予完整代码)

 实现步骤:

1. 获取到数据包的 json 数据

浏览器开发者工具来分析:

按f2,就一个直接就找到了,可能运气成分:

代码部分:

# 导入自动化模块包
from DrissionPage import ChromiumPage as cpdp = cp()  # 实例化一个浏览器对象dp.listen.start('web/aweme/post')  # 开启监听,监听所有的操作dp.get('https://www.douyin.com/user/MS4wLjABAAAAx7--dRYA0mPwhwvxNJ-35i6sB8d1Kv4Sj1WmugquqiHK19QYlB18Ikx6cECT1RVO?from_tab_name=main&showTab=post')# 等待数据包并获取它
data = dp.listen.wait()
json_data = data.response.body  # 从数据包中获取json数据# 打印json数据
print(json_data)

2. 解析数据

就是通过键值对获取的方式

 代码部分:

# --------解析数据---------
# 遍历json数据的视频所在列表,拿到 标题 ,视频链接 ,视频ID
json_data = json_data['aweme_list']
for i in json_data:title = i['desc']  # 标题video_url = i['video']['play_addr']['url_list'][0]  # 视频链接video_id = i['aweme_id']  # 视频ID# 下载视频import osif not os.path.exists('./video'):  # 如果不存在video文件夹就创建一个os.mkdir('./video')video_content = requests.get(video_url,headers=headers).contentwith open(f'./video/{title}-{video_id}.mp4','wb') as f:  # 保存视频f.write(video_content)print(title,video_id,video_url)  # 打印

3. 保存视频

为什么要加 try 捕获异常是因为有些是图文,不是视频,程序运行会报错的。 

代码部分:

    # 下载视频import osif not os.path.exists('./video'):  # 如果不存在video文件夹就创建一个os.mkdir('./video')video_content = requests.get(video_url,headers=headers).contentwith open(f'./video/{title}-{video_id}.mp4','wb') as f:  # 保存视频f.write(video_content)

 4. 滚动页面:

其实有很多方法,看看官网,这里用的是css定位元素的方式。

🛰️ 元素交互 | DrissionPage官网

# 模拟滚动
tab = dp.ele('css:.ayFW3zux')
dp.scroll.to_see(tab)

完整代码:

# --------请求下载视频---requests---------
# 导入请求模块
import requests# 模拟伪装,referer 防盗链参数必须加,是因为抖音的视频是通过referer来判断是否是来自抖音的请求
headers = {'Cookie':'UIFID_TEMP=d42e6e1cd8d751060412d7a6f8b88e73787f686280d2b04969f7be98a81bcfeab7c5fa21b4ba9f3b4996435adfa6ea387e4ef8c399c158c8c557c5155ba553eeab9e17f762b160298890a9671639ff40; fpk1=U2FsdGVkX1+4XWEGtp8nHfpnuY/mjw1pF1fs1QaREN2E+4sCUAI2f/8+whtBvZ2JpHtdCAx9Q4h3MYkr5XhObw==; fpk2=a16ddaab909d2cf27fce353f26dd2ff2; UIFID=d42e6e1cd8d751060412d7a6f8b88e73787f686280d2b04969f7be98a81bcfeab7c5fa21b4ba9f3b4996435adfa6ea388efa7e6a3c894c5d5ccaf7877f18bc3881332b3c108e7facfb7fbbf943b86af535c00cf61ac78c3e6d14a88d40438e519d8b3afe6b8ea3c5b940c528da4e1330372bad55ca598810a3770be41d5799542c939ff40099b794b2e4f44aa22a9a7dd44b9e5342a62bfc8341204fc8b3abbc; csrf_session_id=77f1ddc0d383baa6888bd27425ac0006; is_staff_user=false; SEARCH_RESULT_LIST_TYPE=%22single%22; passport_assist_user=CkFISWrdf4TGRRYuSvpBsN1e-LIzc61qD1l7RCpMxs77nNqyKHZAOMAX7IquTQw8jiH0FtCDUcXqKDnFg_TeH-KqNBpKCjxDfhRMGtgLZZ0jvyBDqN13Em4qO3zQVYMgYaWN5SR0Wk5WNOEe1rRbLXaG8hyztNvo7-tnHSSbQ2rzpA4QpbrmDRiJr9ZUIAEiAQO605iB; uid_tt=3aad5a01473a92a367fbb427a8dc8fd1; uid_tt_ss=3aad5a01473a92a367fbb427a8dc8fd1; sid_tt=f2a11ada0a99bd065517c0d345e4d54a; sessionid=f2a11ada0a99bd065517c0d345e4d54a; sessionid_ss=f2a11ada0a99bd065517c0d345e4d54a; passport_csrf_token=5bffbc8074e17276b412b6937e7a16a5; bd_ticket_guard_client_web_domain=2; douyin.com; device_web_cpu_core=16; device_web_memory_size=8; hevc_supported=true; dy_swidth=1707; dy_sheight=1067; __security_mc_1_s_sdk_crypt_sdk=40f47ba1-4dc9-863a; __security_mc_1_s_sdk_cert_key=e63c5915-4014-a214; __security_mc_1_s_sdk_sign_data_key_web_protect=56cd4cb0-4e38-9fb8; is_dash_user=1; volume_info=%7B%22isUserMute%22%3Afalse%2C%22isMute%22%3Afalse%2C%22volume%22%3A0.51%7D; s_v_web_id=verify_m9tpjol8_8AiUEWPm_mVrq_47t0_Bfpz_VDjuchxS8I4Y; sid_guard=f2a11ada0a99bd065517c0d345e4d54a%7C1745399076%7C5184000%7CSun%2C+22-Jun-2025+09%3A04%3A36+GMT; sid_ucp_v1=1.0.0-KGQ0ZGYxY2UwMDM1ODg0NDQwMmYzMjRiZDAyNTk3MTJkMDk0YzBlMzEKGwi4tNDQ0I27BRCk2qLABhjvMSAMOAZA9AdIBBoCbGYiIGYyYTExYWRhMGE5OWJkMDY1NTE3YzBkMzQ1ZTRkNTRh; ssid_ucp_v1=1.0.0-KGQ0ZGYxY2UwMDM1ODg0NDQwMmYzMjRiZDAyNTk3MTJkMDk0YzBlMzEKGwi4tNDQ0I27BRCk2qLABhjvMSAMOAZA9AdIBBoCbGYiIGYyYTExYWRhMGE5OWJkMDY1NTE3YzBkMzQ1ZTRkNTRh; live_use_vvc=%22false%22; xgplayer_user_id=740434788336; xgplayer_device_id=46605573762; ttwid=1%7CYtvmoWaQoIoT6lDfBN3mTA4u5Gdp0-z8cMxUyA5Z2MY%7C1745411664%7C646ab1cdbb2bf9c40fd7e5b6cd236061e3e4c8b5870ee035ee5417e6efdc1ef5; passport_fe_beating_status=true; xg_device_score=7.659677575262982; my_rd=2; stream_player_status_params=%22%7B%5C%22is_auto_play%5C%22%3A0%2C%5C%22is_full_screen%5C%22%3A0%2C%5C%22is_full_webscreen%5C%22%3A0%2C%5C%22is_mute%5C%22%3A0%2C%5C%22is_speed%5C%22%3A1%2C%5C%22is_visible%5C%22%3A0%7D%22; publish_badge_show_info=%220%2C0%2C0%2C1745477129551%22; strategyABtestKey=%221745546882.414%22; biz_trace_id=190a294e; _bd_ticket_crypt_cookie=aa406af6d4786da0e1a600d8eec6733c; FOLLOW_RED_POINT_INFO=%221%22; FOLLOW_NUMBER_YELLOW_POINT_INFO=%22MS4wLjABAAAAs5GeYafYBCD76fhhG9xmPTMGt4m7bxVsVgtI2xIrDd4f2F5bwoyXWl1x0SgcymKW%2F1745596800000%2F1745574470779%2F1745574470586%2F0%22; FRIEND_NUMBER_RED_POINT_INFO=%22MS4wLjABAAAAs5GeYafYBCD76fhhG9xmPTMGt4m7bxVsVgtI2xIrDd4f2F5bwoyXWl1x0SgcymKW%2F1745596800000%2F1745574475173%2F0%2F0%22; SelfTabRedDotControl=%5B%7B%22id%22%3A%227234445667354019898%22%2C%22u%22%3A714%2C%22c%22%3A714%7D%2C%7B%22id%22%3A%227176589422232619008%22%2C%22u%22%3A224%2C%22c%22%3A224%7D%2C%7B%22id%22%3A%227326135789812811827%22%2C%22u%22%3A44%2C%22c%22%3A44%7D%2C%7B%22id%22%3A%227316397227957651508%22%2C%22u%22%3A435%2C%22c%22%3A435%7D%5D; __ac_nonce=0680b5ccd00011b417918; __ac_signature=_02B4Z6wo00f01JJnf8gAAIDCHE9VYiYp8giSR3tAAEyX4c; stream_recommend_feed_params=%22%7B%5C%22cookie_enabled%5C%22%3Atrue%2C%5C%22screen_width%5C%22%3A1707%2C%5C%22screen_height%5C%22%3A1067%2C%5C%22browser_online%5C%22%3Atrue%2C%5C%22cpu_core_num%5C%22%3A16%2C%5C%22device_memory%5C%22%3A8%2C%5C%22downlink%5C%22%3A10%2C%5C%22effective_type%5C%22%3A%5C%224g%5C%22%2C%5C%22round_trip_time%5C%22%3A100%7D%22; FOLLOW_LIVE_POINT_INFO=%22MS4wLjABAAAAs5GeYafYBCD76fhhG9xmPTMGt4m7bxVsVgtI2xIrDd4f2F5bwoyXWl1x0SgcymKW%2F1745596800000%2F0%2F1745576152449%2F0%22; home_can_add_dy_2_desktop=%221%22; bd_ticket_guard_client_data=eyJiZC10aWNrZXQtZ3VhcmQtdmVyc2lvbiI6MiwiYmQtdGlja2V0LWd1YXJkLWl0ZXJhdGlvbi12ZXJzaW9uIjoxLCJiZC10aWNrZXQtZ3VhcmQtcmVlLXB1YmxpYy1rZXkiOiJCSk8vYktlRmJjcnNKN3ZFdk9mWUlpTGtGcFBFRE9HYlJ2Uk9UN2ZSZEszRko3L3EzbEdpYjF1L3J5WUw3QTU3aFZiYVgvcXZxeXBPRFBuVnV6L0hEWnc9IiwiYmQtdGlja2V0LWd1YXJkLXdlYi12ZXJzaW9uIjoyfQ%3D%3D; odin_tt=68649f1a25bb97f1351835ecad1f6853050360fba260ef27a15c43e1850bc75557c2534169ba7a75e2e3d601f117d4aa; IsDouyinActive=true','Referer':'https://www.douyin.com/user/MS4wLjABAAAAx7--dRYA0mPwhwvxNJ-35i6sB8d1Kv4Sj1WmugquqiHK19QYlB18Ikx6cECT1RVO?from_tab_name=main&showTab=post','User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 115Browser/27.0.6.3'
}# ---------抓包获得数据---DrissionPage--------------
# 导入自动化模块包
from DrissionPage import ChromiumPage as cpdp = cp()  # 实例化一个浏览器对象dp.listen.start('web/aweme/post')  # 开启监听,监听所有的操作dp.get('https://www.douyin.com/user/MS4wLjABAAAAx7--dRYA0mPwhwvxNJ-35i6sB8d1Kv4Sj1WmugquqiHK19QYlB18Ikx6cECT1RVO?from_tab_name=main&showTab=post')
for j in range(1,11):try:print(f'第{j}页数据获取中......')# 等待数据包并获取它data = dp.listen.wait(timeout=5)json_data = data.response.body  # 从数据包中获取json数据# 打印json数据# print(json_data)# --------解析数据---------# 遍历json数据的视频所在列表,拿到 标题 ,视频链接 ,视频IDjson_data = json_data['aweme_list']for i in json_data:title = i['desc']  # 标题video_url = i['video']['play_addr']['url_list'][0]  # 视频链接video_id = i['aweme_id']  # 视频ID# 下载视频import osif not os.path.exists('./video'):  # 如果不存在video文件夹就创建一个os.mkdir('./video')video_content = requests.get(video_url,headers=headers).contentwith open(f'./video/{title}-{video_id}.mp4','wb') as f:  # 保存视频f.write(video_content)print(title,video_id,video_url)  # 打印except Exception as e:  # 如果超时就跳过pass# 模拟滚动tab = dp.ele('css:.ayFW3zux')dp.scroll.to_see(tab)

相关文章:

【爬虫】DrissionPage-获取douyim用户下的视频

之前看过DrissionPage,觉得很厉害,比selenium简单,适合新手。因为盲目跟风逆向,今天看了一个DrissionPage案例直播,学习一下,真香哈。 DrissionPage官网:🛰️ 概述 | DrissionPage官…...

Kubernetes 节点 Not Ready 时 Pod 驱逐机制深度解析(下)

#作者:邓伟 文章目录 三、深度解析:源码逻辑与调优策略四、常见问题与排查五、最新动态与技术演进总结 三、深度解析:源码逻辑与调优策略 TaintManager 核心源码逻辑 (1)参数定义(kube-controller-manage…...

markdown自动标题序号,标题序号,目录处理

在vscode下有插件 markdown aheads markdown标题与目录处理插件。 使用方法:在vscode中 ctrlshiftp 输入 AHeads 选择功能。 包含以下功能: "AHeads:AddIndex": "添加标题序号" "AHeads:RemoveIndex": "移除标题…...

模式设计简介

设计模式简介 设计模式是软件开发中经过验证的最佳实践解决方案,它是针对特定问题的通用解决方案,能够帮助开发者提升代码的可维护性、可扩展性和复用性。设计模式并非具体的代码实现,而是一种解决问题的思路和方法论,它源于大量的实践经验总结,旨在解决软件开发过程中反…...

Linux字符设备驱动开发的详细步骤

1. 确定主设备号​​ ​​手动指定​​:明确设备号时,使用register_chrdev_region()静态申请(需确保未被占用)。​​动态分配​​:通过alloc_chrdev_region()由内核自动分配主设备号(更灵活,推…...

融合注意力机制和BiGRU的电力领域发电量预测项目研究,并给出相关代码

大家好,我是微学AI,今天给大家介绍一下融合注意力机制和BiGRU的电力领域发电量预测项目研究,并给出相关代码。 文章目录 一、项目背景二、融合注意力机制和BiGRU的技术原理(一)双向门控循环单元(BiGRU&…...

基于 Netmiko 的网络设备自动化操作

学习目标 掌握 Netmiko 库的核心功能与使用场景。能够通过 Netmiko 连接多厂商设备并执行命令和配置。实现批量设备管理、配置备份与自动化巡检。掌握异常处理、日志记录与性能优化技巧。理解 Netmiko 在自动化运维体系中的角色。 1. Netmiko 简介 1.1 什么是 Netmiko Netmi…...

eclipse怎么导入junit4

JUnit 4 是 Java 编程语言里常用的单元测试框架,在 Eclipse 中导入 JUnit 4 可按以下步骤操作: 1. 新建或打开 Java 项目 如果你已经有一个 Java 项目,可直接打开它;若没有,就新建一个 Java 项目。操作步骤如下&…...

深入理解C语言函数之模拟实现strcpy()strcat()

文章目录 前言一、strcpy的模拟实现二、strcat的模拟实现总结 前言 前面我们用三种方法模拟实现了一下strlen,所以这篇文章模拟实现以下strcpy()strcat() 一、strcpy的模拟实现 首先我们去官网找到strcpy的用法和原…...

[mysql]窗口函数

目录 窗口函数: 为何要学习窗口函数,与mysql5.7实现语句对比 现在我们介绍一下窗口函数: 函数规则 1序号函数 2分布函数 3前后函数 5其他函数 总结 窗口函数: 首先数据库的迁移是非常慢的,大家学习新特性的时候要考虑自己公司的数据库版本是不是和自己学习的吻合 为何…...

IT人力外包定义-优势-服务流程介绍

IT人力外包:企业灵活用工的“技术人才蓄水池” 在数字化转型的浪潮中,企业对IT人才的需求日益增长,但招聘、培养和管理技术团队的成本和风险也随之攀升。此时,IT人力外包应运而生,成为企业高效获取技术资源的解决方案…...

Cancer Cell|scRNA-seq + scTCR + 空间多组学整合分析,揭示CD8⁺ T细胞在免疫治疗中的“双路径” | 临床问题的组学解答

Cancer Cell|scRNA-seq scTCR 空间多组学整合分析,揭示CD8⁺ T细胞在免疫治疗中的“双路径” 👋 欢迎关注我的生信学习专栏~ 如果觉得文章有帮助,别忘了点赞、关注、评论,一起学习 近日,《Cancer Cell》…...

数字人民币杠杆破局预付乱象 XBIT智能合约筑牢资金安全防线

在加密货币市场与实体经济加速融合的当下,数字人民币试点工作正以创新姿态突破传统金融边界。青岛、广州、厦门等地近期密集落地的数字人民币智能合约应用,为预付式消费领域资金监管难题提供了破局方案,而XBIT去中心化交易所平台凭借其技术优…...

React.memo 和 useMemo

现象 React 中,通常父组件的某个state发生改变,会引起父组件的重新渲染(和其他state的重新计算),从而会导致子组件的重新渲染(和其他非相关属性的重新计算) 问题一:如何避免因为某个…...

命令行指引的尝试

效果 步骤 首先初始化一个空的项目,然后安装一些依赖 npm init -y npm install inquirer execa chalk ora至于这些依赖是干嘛的,如下图所示: 然后再 package.json 中补充一个 bin 然后再根目录下新建一个 index.js , 其中的内容如下 #!/…...

《深入理解计算机系统》阅读笔记之第三章 程序的机器级表示

概述 历史观点 程序编码 数据格式 访问信息 操作数指示符 数据传送指令 压入和弹出栈数据 算术和逻辑操作 小结 本章没有细看,其中主要以C语言中的一些汇编等知识来做介绍。算是一种对C语言的相关底层知识的详细介绍吧。但是从原理上理解我觉得《编码》这本书更好理…...

解析excel中的图片

解析excel中的图片 前言一、pom依赖二、使用步骤1.示例数据2.代码如下(示例): 总结 前言 初始化数据是,需要将excel中的数据解析并插入数据库。 但是某几列存放的是图片,这时候怎么办呢。 主要解决的是:获…...

红队系列-网络安全知识锦囊-CTF(持续更新)

CTF CTF系列-AWD专题篇CTF-比赛培训基础1 CTF 介绍HTTP协议分析进阶001.CTF简介_宽字节注入高级 2018CTF——黑客大赛特训CTF-PWNPWNCTF竞赛中的主要题型之一了解CTF Capture The Flag 夺旗描述:# gets从标准输入设备读字符串函数#下面是对main函数中的汇编代码的解释:modifi…...

强化学习:基础理论与高级DQN算法及策略梯度基础

如果您想学习强化学习,我推荐David Sliver的讲座😊:RL Course by David Silver - Lecture 1: Introduction to Reinforcement Learning - YouTube 基础理论 马尔可夫决策过程(MDP) 1.MDP五元组定义 状态空间&#xf…...

如何修复宝可梦时时刻刻冒险无法正常工作

宝可梦的时时刻刻冒险模式是一项强大的功能,即使应用程序关闭,它也能追踪你的步行距离。它的工作原理是将你的步数与 iOS 上的 Apple Health 或 Android 上的 Google Fit 同步。它对于孵化宝可梦蛋和赚取好友糖果至关重要,但一旦它停止工作&a…...

RAG5个常见错误

向量数据库并非硬性规定 几乎互联网上所有关于RAG的教程都使用向量存储。如果你一直在搜索RAG相关内容,你就会明白我们在说什么。 基于向量的检索无疑是RAG成功的重要因素。向量嵌入非常适合映射文本的语义含义。它们也能很好地处理不同大小的文本。你的查询可能只…...

VuePress可以做什么?

VuePress 可以做什么 VuePress 是一个基于 Vue.js 的静态站点生成器,专注于文档和内容展示。它结合了 Markdown 的简洁性和 Vue 的灵活性,适合多种场景的开发需求。以下是 VuePress 的主要用途和功能: 1. 技术文档网站 VuePress 最初是为编写 Vue.js 官方文档而设计的,因…...

TDengine 数据缓存技术

简介 在现代物联网(IoT)和工业互联网(IIoT)应用中,数据的高效管理对系统性能和用户体验至关重要。为了应对高并发环境下的实时读写需求,TDengine 设计了一套完整的缓存机制,包括写缓存、读缓存…...

如何成功防护T级超大流量的DDoS攻击

防护T级超大流量的DDoS攻击需要综合技术、架构与运营策略的多层次防御体系。以下是基于最新技术实践和行业案例总结的关键防护策略: 一、流量清洗与分布式处理 部署流量清洗中心 T级攻击的核心防御依赖于专业的流量清洗技术。通过部署分布式流量清洗集群&#xff0c…...

【Linux内核设计与实现】第三章——进程管理02

文章目录 7. 进程创建7.1. 进程之间的关系7.2. 进程创建的写时拷贝机制(copy-on-write)7.3. fork() 函数的入口7.4. 创建新进程的核心函数 kernel_clone()7.4.1. 检查参数并调用 copy_process 创建并复制进程7.4.2. 获取新进程 PID 作为返回值7.4.3. 唤醒…...

企业部署Power BI 报表服务器,在第三方系统嵌套该报表服务器,并实现单点登录

简介 Power BI Report Server 简称PBIRS,中文名"Power BI 报表服务器" 微软的文档:Power BI 报表服务器文档 - Power BI | Microsoft Learn 借用官网的介绍: Power BI 报表服务器类似于 SQL Server Reporting Services 和 Power BI…...

Leetcode 2845 题解

还是要把自己做题的思路写出来的,但是结果可能还是得去观摩一下题解,无论是大佬写的题解还是leetcode官方写的题解,看完题解后再去反思才能有收获,即使下次遇见一样的题不见得能写出来,但有思路比没思路更重要。 今天写…...

前端基础之《Vue(12)—插件封装》

一、插件封装 1、在Vue生态中,除了Vue本身,其它所有的与Vue相关的第三方包,都是插件 例子: import VueRouter form vue-router Vue.use(VueRouter) // 注册插件 2、如何封装Vue插件 (1)第一种写法 const…...

arcpy列表函数的应用(2)

arcpy.ListRasters() 该函数用于列出指定工作空间中的所有栅格数据集。 语法: python arcpy.ListRasters(wild_cardNone, raster_typeNone)• wild_card:用于筛选栅格数据集名称的通配符。 • raster_type:用于筛选栅格数据集的类型&…...

智能电网第7期 | 断网不断控:电力监控网络高可靠通信解决方案

随着智能电网建设加速推进,电力监控系统的可靠性已成为保障电网安全运行的核心要素。在变电站、配电房等关键场景中,网络中断可能导致监控失效、故障扩大等严重后果。当前电力通信网络面临的主要挑战包括: 网络脆弱性:单一链路故障…...

Nacos简介—2.Nacos的原理简介

大纲 1.Nacos集群模式的数据写入存储与读取问题 2.基于Distro协议在启动后的运行规则 3.基于Distro协议在处理服务实例注册时的写路由 4.由于写路由造成的数据分片以及随机读问题 5.写路由 数据分区 读路由的CP方案分析 6.基于Distro协议的定时同步机制 7.基于Distro协…...

offset voltage of Comparator

静态失调电压(static offset voltage) 主要影响因素:μCox(载流子传输速率和栅氧层电容的的乘积)、阈值电压。 静态失配方差与器件尺寸成反比,可以增大关键对mos管的尺寸 动态失调电压(dynamic offset voltage&…...

Spring-Ai-McpSever从外到内

MCP是什么 Model Context Protocol (MCP) 是一个开放协议,它使 LLM 应用与外部数据源和工具之间的无缝集成成为可能。无论你是构建 AI 驱动的 IDE、改善 chat 交互,还是构建自定义的 AI 工作流,MCP 提供了一种标准化的方式,将 LL…...

Vue多地址代理端口调用

第一种方法 config.ts文件 配置多条代理服务端口 如下所示:proxy: {/app: {// 其他的端口target: http://125.124.5.117:12877/,changeOrigin: true}/api: {//默认的端口// http://192.168.31.53:5173/target: http://192.168.31.199:18777/,changeOrigin: true,rewrite: pat…...

Android APP 热修复原理

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ dexElements Android 的 ClassLoader(如 PathClassLoader、DexClassLoader)内部结构如下: BaseDexClassLoader└── pat…...

一些有关ffmpeg 使用(1)

1 解封装流程 1.1 什么解封装 封装的逆向操作:封装是把音频流、视频流、字幕流等不同成分按一定规则组合成视频文件(如 MP4、FLV ),复用器负责此过程。解封装则相反,是用解复用器(针对 MP4、FLV 等格式有…...

Postman-win64-7.2.2 安装教程(Windows 64位详细步骤)

1. 下载安装包 Postman-win64-7.2.2-Setup.exe下载链接:https://pan.quark.cn/s/6b48480d95d5 2. 运行安装程序 双击下载的 .exe 文件,启动安装向导。 若系统提示权限确认,点击 “是” 允许安装。 3. 安装向导设置 选择安装选项&#xff0…...

C语言实现贪心算法

一、贪心算法核心思想 特征:在每一步选择中都采取当前状态下最优(局部最优)的选择,从而希望导致全局最优解 适用场景:需要满足贪心选择性质和最优子结构性质 二、经典贪心算法示例 1. 活动选择问题 目标&#xff1a…...

Linux 服务如何使用 curl 利用 HTTP Get 请求传入 SQL 语句修改数据库表内容和结构

本文是博主在部署项目时发现的一个小技巧,项目部署在 Linux 虚拟机上,数据库被设置了写权限,作为开发只能使用程序对数据库做增删改查,但是在开发测试阶段会出现很多问题,权限的问题大大降低了开发效率,所以…...

Java对象转换的多种实现方式

Java对象转换的多种实现方式 在Java开发中,对象转换是一个常见的需求。特别是在不同层次间传递数据时,通常需要将一个对象转换为另一个对象。虽然JSON序列化/反序列化是一种常见的方法,但在某些场景下可能并不是最佳选择。本文将总结几种常见…...

详解 LeetCode 第 242 题 - 有效的字母组

目录 题目描述 解题思路 代码分析 步骤说明 图解原理 优势分析 小结 码题目:LeetCode 242. 有效的字母组 题目描述 给定两个字符串 s 和 t,请判断是否为字母组(Anagram)。 如果 t 是通过打乱 s 的字符并重新排列所得到的…...

【滑动窗口+哈希表/数组记录】Leetcode 3. 无重复字符的最长子串

题目要求 给定一个字符串 s,找出其中不含有重复字符的最长子串的长度。 子字符串是字符串中连续非空字符序列。 示例 1 输入:s "abcabcbb" 输出:3 解释:无重复字符的最长子串是 "abc",长度为…...

springmvc-拦截器

目录 一,拦截器的职责 二,拦截器的应用场景 三,拦截器的工作原理 拦截器在Spring MVC请求处理流程中的位置: 四,使用拦截器 一 ,编写拦截类,实现HandlerInterceptor接口,重写方…...

【Agent】LangManus深度解析:AI自动化框架的对比与langgraph原理

LangManus深度解析:AI自动化框架的技术演进与实践 本文将带你深入探索LangManus这一AI自动化框架的核心技术与其基于langgraph的实现原理,并与OpenManus进行全面对比,助你掌握多智能体系统的前沿技术。 本文3万字,没有时间的话可以…...

【FreeRTOS】事件标志组

文章目录 1 简介1.1事件标志1.2事件组 2事件标志组API2.1创建动态创建静态创建 2.2 删除事件标志组2.3 等待事件标志位2.4 设置事件标志位在任务中在中断中 2.5 清除事件标志位在任务中在中断中 2.6 获取事件组中的事件标志位在任务中在中断中 2.7 函数xEventGroupSync 3 事件标…...

如何通过电路测量运放的增益带宽积(GBP)和压摆率(SR)

一、增益带宽积(GBP)的测量 定义:增益带宽积是运算放大器的开环增益下降到直流增益的 ​(即 - 3dB)时对应的频率与该频率下增益的乘积,数学表达式为: 其中 A0​ 是直流开环增益,f0​…...

SAP接口超时:对 FOR ALL ENTRIES IN 的优化

SAP接口超时 经分析要10多分钟以上才出结果,且是这个语句耗时较长: SELECTaufnrmatnrbdmnglgortmeinschargFROM resbINTO CORRESPONDING FIELDS OF TABLE lt_lylcddxhFOR ALL ENTRIES IN lt_lylcddWHERE aufnr IN r_aufnr发现RESB有420万条记录&#xf…...

ElementUi的Dropdown下拉菜单的详细介绍及使用

Dropdown是 ElementUI 中用于创建下拉菜单项的一个组件,通常el-dropdown-item 包裹在 el-dropdown 组件中使用。以下从功能特性(一些属性及方法)、使用和高级功能(高亮显示,滚动,额外传参数)三个方面进行详细介绍。 一、功能特性 1.触发方式…...

C++类模板编程练习(从基础到进阶)

一、基础模板类设计 泛型盒子&#xff08;Box&#xff09; 实现一个 Box 类模板&#xff0c;存储任意类型的值&#xff0c;并提供获取/修改方法。 Box<int> intBox(42); cout << intBox.get(); // 输出 42 intBox.set(100);类型转换器&#xff08;Converter&…...

基于物联网的智能家居安全防护系统设计

资料下载地址&#xff1a;基于物联网的智能家居安全防护系统仿真&#xff08;仿真代码&#xff09; 目录 一、功能介绍 二、仿真图 三、程序 一、功能介绍 1.单片机和app、OneNet云平台通过wifi进行通信 2.马达模拟家里的用电设备&#xff0c;可通过按键开关 3.可检测用电量…...