请注意,我使用的浏览器框架是 DrissionPage,框架的查找语法为:
ele2 = ele1.ele('xpath://div')
# 获取 ele1 的第二层父元素
ele2 = ele1.parent(2)
# 获取 ele1 父元素中 id 为 id1 的元素
ele2 = ele1.parent('#id1')
# 获取 ele1 后面第一个兄弟元素
ele2 = ele1.next()
# 获取 ele1 后面第 3 个兄弟元素
ele2 = ele1.next(3)
# 获取 ele1 前面第一个兄弟元素
ele2 = ele1.prev()
# 获取 ele1 前面第 3 个兄弟元素
ele2 = ele1.prev(3)
# 获取 ele1 前面第 3 个元素
ele2 = ele1.before(3)
# 获取 ele1 前面第 3 个 div 元素
ele2 = ele1.before('tag:div', 3)
# 获取 ele1 前面第一个文本节点的文本
txt = ele1.before('xpath:text()', 1)
<div class="EUJzwIMS">
<div class="aaXMdnbr"><img class="kcsILzHu lxo0LycR"
src="https://p3.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-i-0813_66c4e34ae8834399bbf967c3d3c919db.jpeg?from=3782654143">
</div>
<div class="_bWlYXcH hTpiS0Ay mrl0UYGr">
<div class="biFaMC6S">
<div class="gZdlhsqq">程序员马工</div>
</div>
<div class="wiYIhq4q">
<div class="DDOhSZqR C0_yyLLi">
<pre class="MnyOYvbN">1</pre>
</div>
<div class="skNuRdW_"> · 刚刚</div>
</div>
</div>
<div class="hcPUqxqn">
<div class="tJjNB1rt ge6Vyp_V o9h6ErL7">1</div>
</div>
</div>
有如上元素,现在已经根据 ele_msg_red_pot = ele_list_dlg.ele('xpath://div[@class="hcPUqxqn"]') 找到了 未读消息1,情帮我根据相对定位 如 ele_msg_red_pot.prev().child(1) 或xpath 语法 来找到名字,头像,消息。最后的消息格式为: {"name":"程序员马工", "avator":"urlxxx", "new_msg":2, "time":"刚刚"}
假设要做一个直播信息统计的工具,产生的数据如下:
可能需要统计的信息如下:
根据以上需求,如果设计一个合理的软件数据架构,在 PostgreSQL 、本地 SQLite 、对象存储 等方案中,你会怎么设计? 但是如果只创建一个弹幕表,或者只有一个直播间表,那么数据量会非常庞大,如果每天有几千个主播开直播,那么一个弹幕表和礼物表显然会非常庞大,如果每天有上万场直播,那么一张表的数据量会达到几亿甚至几十亿。 一个可能的构思如下:
上述是否合理,给出最佳合理的表结构,以及如何设计数据存储方案。
anchors (主播表)
anchor_id (主键) nickname avatar description ... (其他主播相关信息) live_rooms (直播间表)
room_id (主键) anchor_id (外键,关联anchors表) room_name ... (其他直播间相关信息) live_sessions (直播场次表)
session_id (主键) room_id (外键,关联live_rooms表) start_time end_time viewer_count ... (其他直播场次相关信息) danmus (弹幕表) —— 使用表分区
danmu_id (主键) session_id (外键,关联live_sessions表) content user_id (发送弹幕的用户ID) timestamp ... (其他弹幕相关信息) 可以根据session_id进行表分区,以提高查询效率。 gifts (礼物表) —— 使用表分区
gift_id (主键) session_id (外键,关联live_sessions表) user_id (发送礼物的用户ID) gift_name timestamp ... (其他礼物相关信息) 同样可以根据session_id进行表分区。 users (用户表) —— 记录所有观众和主播的信息
user_id (主键) nickname avatar ... (其他用户相关信息)
总结 使用PostgreSQL作为主要的数据库解决方案,利用其强大的功能和表分区技术来管理大规模数据。 根据直播场次(session_id)对弹幕和礼物表进行分区,以提高查询效率和数据管理。 避免在单个表中存储过多的数据,通过合理的表设计和分区策略来优化性能。 对于非结构化数据(如用户头像等),可以考虑使用对象存储进行保存,并在数据库中保存相应的链接或标识符。