gpt.md 5.4 KB

DrissionPage

请注意,我使用的浏览器框架是 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_">&nbsp;·&nbsp;刚刚</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":"刚刚"}

构思

假设要做一个直播信息统计的工具,产生的数据如下:

  • 每个主播开启一个独立的直播间,可能有上万个主播,也就是数万个直播间。
  • 每个主播可能每天开几场直播,或者每个月开几十场直播
  • 每个直播间有几百或上百万用户观看
  • 每个观众可能会发布弹幕或礼物信息,一场直播可能有几千到几百万条弹幕或礼物数据
  • 每条弹幕或礼物数据包含发表弹幕的用户头像、信息、主页链接、昵称等等。
  • 所有的内容都是 json 格式的数据,少则 几k多则 64k 的数据。
  • 每个观众和主播都可以用用户 id 来表示

可能需要统计的信息如下:

  • 每个主播、每场直播开播时长,频率,收到的礼物总数
  • 每个主播每天的直播时长,直播间数,观众数,平均每小时的观众数,平均每小时的弹幕数
  • 记录直播间总弹幕、礼物数
  • 分析每一条弹幕频率,或分析观众在直播间的建议和需求

根据以上需求,如果设计一个合理的软件数据架构,在 PostgreSQL 、本地 SQLite 、对象存储 等方案中,你会怎么设计? 但是如果只创建一个弹幕表,或者只有一个直播间表,那么数据量会非常庞大,如果每天有几千个主播开直播,那么一个弹幕表和礼物表显然会非常庞大,如果每天有上万场直播,那么一张表的数据量会达到几亿甚至几十亿。 一个可能的构思如下:

  • 主播表 anchors ,记录每个主播的基本信息,包括头像、昵称、简介等
  • 直播间表 live_rooms ,记录每场直播的开播时间、直播间 id、主播 id 等
  • 直播场次表 live_sessions ,记录每场直播的开播时间、结束时间,直播间 id、主播 id 等
  • 主播直播间弹幕表 danmus ,根据 livesessions id 进行表分区,例如 CREATE TABLE danmus{live_sessions_id} PARTITION OF danmus
  • 主播直播间礼物表 gifts ,根据 livesessions id 进行表分区,例如 CREATE TABLE gifts{live_sessions_id} PARTITION OF gifts

上述是否合理,给出最佳合理的表结构,以及如何设计数据存储方案。

数据库表设计

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)对弹幕和礼物表进行分区,以提高查询效率和数据管理。 避免在单个表中存储过多的数据,通过合理的表设计和分区策略来优化性能。 对于非结构化数据(如用户头像等),可以考虑使用对象存储进行保存,并在数据库中保存相应的链接或标识符。