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

【爬虫】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官…...

【Python爬虫基础篇】--3.cookie和session

目录 1.cookie 1.1.定义 1.2.参数 1.3.分类 2.session 3.使用cookie登录微博 4.使用session登录 1.cookie 由于http是一个无状态的协议,请求与请求之间无法相互传递或者记录一些信息,cookie和session正是为了解决这个问题而产生。 例子&#xff1…...

React 文件链条

在 React 项目中&#xff0c;首次展示在前台的是以下文件组合作用的结果&#xff1a; --- ### **核心文件链条** 1. **public/index.html** - 这是浏览器实际加载的入口文件 - 包含一个 <div id"root"></div> 容器 - 通过 <script> 标…...

分数线降低,25西电马克思主义学院(考研录取情况)

1、马克思主义学院各个方向 2、马克思主义学院近三年复试分数线对比 学长、学姐分析 由表可看出&#xff1a; 1、马克思主义理论25年相较于24年下降10分&#xff0c;为355分 3、25vs24推免/统招人数对比 学长、学姐分析 由表可看出&#xff1a; 1、 马克思主义学院25年共接…...

微信、抖音、小红书emoji符号大全

1、Emoji 日常符号 &#x1f463;&#x1f440;&#x1f441;️&#x1f444;&#x1f48b;&#x1f442;&#x1f9bb;&#x1f443;&#x1f445;&#x1f9e0;&#x1fac0;&#x1fac1;&#x1f9b7;&#x1f9b4;&#x1f4aa;&#x1f9be;&#x1f9bf;&#x1f9b5;&a…...

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

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

ubuntu(28):ubuntu系统多版本conda和多版本cuda共存

0. cuda(包括cudnn)、conda安装照常 注意&#xff1a; &#xff08;1&#xff09;多个conda不要安装到一个目录了&#xff0c;可以见下面的示例目录&#xff1b; &#xff08;2&#xff09;cuda&#xff08;包括cudnn&#xff09;不用纠结是否添加超链接 1. 需要修改环境配置…...

C# 下 using 块的作用 + VS2022 下 using 语法糖怎样工作

&#x1f50d; using 的本意是什么&#xff1f; using 是 C# 中用于 自动释放资源 的语法糖&#xff0c;适用于实现了 IDisposable 接口的对象&#xff08;比如数据库连接、文件、网络流等&#xff09;。 &#x1f9d0; 首先看下SqlSugarClient类部分源码&#xff1a; SqlSug…...

实体店的小程序转型之路:拥抱新零售的密码-中小企实战运营和营销工作室博客

实体店的小程序转型之路&#xff1a;拥抱新零售的密码-中小企实战运营和营销工作室博客 在当今数字化浪潮的冲击下&#xff0c;实体店面临着前所未有的挑战&#xff0c;但小程序的出现为实体店转型新零售带来了新的曙光。先来看一组惊人的数据&#xff0c;据相关统计&#xff…...

UML 类图基础和类关系辨析

UML 类图 目录 1 概述 2 类图MerMaid基本表示法 3 类关系详解 3.1 实现和继承 3.1.1 实现&#xff08;Realization&#xff09;3.1.2 继承/泛化&#xff08;Inheritance/Generalization&#xff09; 3.2 聚合和组合 3.2.1 组合&#xff08;Composition&#xff09;3.2.2 聚…...

15.三数之和(LeetCode)java

个人理解&#xff1a; 1.使用双指针做法&#xff0c;首先对数组进行排序 第一重for循环控制第一个数&#xff0c;对数组进行遍历。双指针初始化为lefti1, rigthnums.length-1。然后使用while循环移动双指针寻找合适的数。因为返回的是数&#xff0c;不是下标&#xff0c;数不能…...

Spark读取Apollo配置

--conf spark.driver.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 --conf spark.executor.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 在spark的提交命令中&…...

如何通过 Websoft9 应用自托管平台一键安装任意版本 Odoo?

手工安装 Odoo 的复杂流程 环境准备阶段&#xff1a;安装 Docker 需熟悉 Linux 系统操作&#xff0c;需配置软件源、解决依赖冲突&#xff1b; 镜像获取阶段&#xff1a;从 Docker Hub 拉取官方镜像时可能因网络问题失败&#xff0c;且需自行验证版本兼容性&#xff1b; 容器…...

Anaconda3使用conda进行包管理

一、基础包管理操作 ‌安装包‌ 使用 conda install <包名> 安装指定包&#xff0c;支持多包批量安装和版本指定&#xff1a; conda install numpy # 安装单个包 conda install numpy scipy pandas # 批量安装多个包 conda install numpy1.21 # 指定版本 conda instal…...

exec和spawn

前言 需求&#xff1a;做一个electron应用&#xff0c;用node打开exe软件&#xff0c;打开后返回成功与否&#xff0c;打开的软件不会随electron应用的关闭而关闭 exec exec 第一个参数为要运行的command命令&#xff0c;参数以空格分隔。 child_process.exec(command[, opti…...

整平机:精密制造的“隐形守护者”

在金属加工车间里&#xff0c;一块表面凹凸不平的钢板经过一组高速旋转的辊轮后&#xff0c;神奇地变得如镜面般平整——这看似简单的场景背后&#xff0c;隐藏着现代工业对材料精度近乎苛刻的追求。整平机&#xff0c;这个常被忽视的工业设备&#xff0c;实则是高端制造业的基…...

Lesar: 面向 Lustre/Scade 语言的形式化模型检测工具

在《同步反应式系统》的第一课中&#xff0c;介绍了同步数据流语言 Lustre 生态中的形式化模型检查器 Lesar 的用法。Lesar 可对 lustre v4 语言以及 Scade 语言中部分数据流核心特性进行模型检查。 Lesar 介绍 Lesar 是 Verimag 研发维护的形式化方法模型检查工具。该工具的理…...

C++中的vector和list的区别与适用场景

区别 特性vectorlist底层实现动态数组双向链表内存分配连续内存块非连续内存块随机访问支持&#xff0c;通过索引访问&#xff0c;时间复杂度O(1)不支持&#xff0c;需遍历&#xff0c;时间复杂度O(n)插入/删除末尾操作效率高&#xff0c;时间复杂度O(1)任意位置操作效率高&am…...

VRRP与防火墙双机热备实验

目录 实验一&#xff1a;VRRP负载均衡与故障切换 实验拓扑​编辑一、实验配置步骤 1. 基础网络配置 2. VRRP双组配置 二、关键验证命令 1. 查看VRRP状态 2. 路由表验证 三、流量分析 正常负载均衡场景&#xff1a; 故障切换验证&#xff1a; 实验二&#xff1a;防火…...

win11什么都不动之后一段时间黑屏桌面无法显示,但鼠标仍可移动,得要熄屏之后才能进入的四种解决方法

现象&#xff1a; 1. 当时新建运行的资源管理器的任务卡了或者原本资源管理器卡了 比如&#xff1a;当时在文本框中输入explorer 注&#xff1a;explorer.exe是Windows的文件资源管理器&#xff0c;它用于管理Windows的图形外壳&#xff0c;包括桌面和文件管理 按住CtrlAltEs…...

【前端】【业务场景】【面试】在前端开发中,如何优化 SVG(可缩放矢量图形)的性能,特别是在处理复杂图形和动画时

SVG 性能优化&#xff1a;循序渐进 4 步法 目标&#xff1a;先减负 → 再复用 → 后加速 → 最后按场景微调 ① 精简—把包袱先丢掉 删除无用元素 隐藏/被遮挡的 <path>、未引用的 <defs> 里渐变、滤镜。 合并路径 同填充色或描边的路径 ⇒ SVGO / SVGOMG「Mer…...

基于LAB颜色空间的增强型颜色迁移算法

本文算法使用Grok完成所有内容&#xff0c;包含算法改进和代码编写&#xff0c;可大大提升代码编写速度&#xff0c;算法改进速度&#xff0c;提供相关idea&#xff0c;提升效率&#xff1b; 概述 本文档描述了一种基于LAB颜色空间的颜色迁移算法&#xff0c;用于将缩略图D的…...

基于SIMMECHANICS的单自由度磁悬浮隔振器PID控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 单自由度磁悬浮减振器工作原理简介 4.2 SIMMECHANICS工具箱 5.完整工程文件 1.课题概述 基于SIMMECHANICS的单自由度磁悬浮隔振器PID控制系统simulink建模与仿真。其中&#xff0c;SIMMECHANICS是M…...

河北省大数据应用创新大赛样题

** 河北省大数据应用创新大赛样题 ** 1. 在Linux下安装Java并搭建完全分布式Hadoop集群。在Linux终端执行命令“initnetwork”&#xff0c;或双击桌面上名称为“初始化网络”的图标&#xff0c;初始化实训平台网络。 【数据获取】 使用wget命令获取JDK安装包&#xff1a; “w…...

RabbitMQ 的专业术语

术语定义示例/说明生产者&#xff08;Producer&#xff09;发送消息到 RabbitMQ 的客户端应用程序。日志系统将错误信息发送到 RabbitMQ。消费者&#xff08;Consumer&#xff09;从 RabbitMQ 队列中接收并处理消息的客户端应用程序。一个订单处理服务从队列中读取消息并更新数…...

【教程】安装 iterm2 打造漂亮且高性能的 mac 终端

【教程】安装 iterm2 打造漂亮且高性能的 mac 终端_mac 安装iterm2-CSDN博客 全面解析&#xff1a;Github网站无法访问的解决方法! 安装myzh 参考文章&#xff1a;https://blog.csdn.net/qq_44741467/article/details/135727124 下载地址&#xff1a;GitCode - 全球开发者的开源…...

redis特性及应用场景

文章目录 什么是redis&#xff1f;热库redis作为热库的特性redis适用场景 什么是redis&#xff1f; redis在系统架构中的位置就是冷热分离架构的热数据库位置&#xff0c; redis就是热库&#xff0c; 我们一般说缓存数据库。 其他的像MySQL、SQL Server这种关系数据库、MongoDB…...

算法 | 鲸鱼优化算法(WOA)原理,公式,应用,算法改进研究综述,完整matlab代码

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 鲸鱼优化算法 一、原理与公式二、应用领域三、算法改进研究四、完整MAT…...

前端面试常见部分问题,及高阶部分问题

面试中也极有可能让你徒手写代码,无聊的面试问题o( ̄︶ ̄)o 一、HTML/CSS 基础与进阶 常见问题 什么是语义化标签?有哪些常用语义化标签? 答案:语义化标签是指具有明确含义的 HTML 标签,如 <header>、<footer>、<article>、<section> 等。它们有…...

C++初登门槛

多态 一、概念 多态是指不同对象对同一消息产生不同响应的行为。例如&#xff0c;蓝牙、4G、Wi-Fi 对“发送数据”指令有不同的具体实现。 二、核心理解 本质&#xff1a;通过基类指针或引用操作子类对象&#xff0c;实现运行时动态绑定。 表现形式&#xff1a; 接口统一&a…...