![](https://n0099.net/v/assets/files/2022-07-31/1659297254-810371-v.png)
随后经由现任vtuber吧吧主梨木她同意了:
![](https://n0099.net/v/assets/files/2022-07-31/1659297260-84813-f88783e5-7734-4261-8a8b-a11f61e4a6ac.png)
由于我的个人原因直到近期在完成tbm爬虫c#重写和数据库结构迁移后才着手此事
根据网页端吧首页的计数器:
![](https://n0099.net/v/assets/files/2022-07-31/1659297332-91890-398bdd9a-e86c-4b0b-b1d7-530c9ebb10a9.png)
vtuber自由讨论吧共有主题数12025个,贴子数375782篇
但这个计数器是永远自增的(即即便帖子被系统或楼主删除也不会-1)
再加上 自2019年3月b吧事件后以来贴吧一直在4端(网页端 客户端 客户端网页 wap网页)的吧首页主题帖列表接口上限制可请求的分页数为最多10000条主题帖,如果请求分页offset超过10000就只会返回吧首页第一页的主题帖 的限制
导致我只能爬取到9029条主题帖,对应总共119899回复帖+71267楼中楼=191166条帖子和10947个贴吧用户:
![](https://n0099.net/v/assets/files/2022-07-31/1659297346-498379-tables.png)
表的解析:
_content结尾的表的content字段值存储着回复帖/楼中楼的正文,格式是贴吧客户端接口返回的protobuf二进制,可参考此.proto文件进行反序列化: https://github.com/n0099/tbclient.protobuf/blob/main/tbm_min/Wrapper/PostContentWrapper.proto
![](https://n0099.net/v/assets/files/2022-07-31/1659297389-118492-replies-content.png)
threads,replies,_subReplies表为主题帖/回复帖/楼中楼的元数据:
![](https://n0099.net/v/assets/files/2022-07-31/1659297395-372506-threads.png)
![](https://n0099.net/v/assets/files/2022-07-31/1659297395-453024-replies.png)
![](https://n0099.net/v/assets/files/2022-07-31/1659297395-518110-subreplies.png)
tiebaUsers表为贴吧用户的元数据:
![](https://n0099.net/v/assets/files/2022-07-31/1659297404-609211-users.png)
以上表中所有数字类型字段的NULL值表示实际值是0(即field ?? 0
),createdAt updatedAt lastSeen 3个字段的NULL值代表依次回退到前一个字段(即lastSeen ?? updatedAt ?? createdAt
)
reply_signatures表存储的是贴吧用户可在客户端上设置的回复帖小尾巴,反序列化signature字段的二进制值请参考此.proto:https://github.com/n0099/tbclient.protobuf/blob/main/tbm_min/Post/ReplyDeps/SignatureData.proto
![](https://n0099.net/v/assets/files/2022-07-31/1659297415-904867-reply-signature.png)
所有以tbm_revision开头的表为对应表中更新记录时的历史版本快照
![](https://n0099.net/v/assets/files/2022-07-31/1659297469-558006-revision-replies.png)
例如查询SELECT * FROM tbm_revision_replies WHERE pid = 144905649502 ORDER BY time DESC
![](https://n0099.net/v/assets/files/2022-07-31/1659297469-442528-revision-replies-144905649502.png)
我们可以知道在1659020767这个unix时间点,只有subReplyNum字段的值被更新为了3,其余字段值都保持不变
而如果将time字段值最大(1659076992)的记录(revision_replies表)与当前版本(1659091395)的记录(replies表)进行对比:
SELECT * FROM tbm_revision_replies WHERE pid = 144905649502 ORDER BY time DESC
![](https://n0099.net/v/assets/files/2022-07-31/1659297500-840386-revision-replies-144905649502-time.png)
SELECT * FROM tbm_f27278534_replies WHERE pid = 144905649502
![](https://n0099.net/v/assets/files/2022-07-31/1659297500-877674-replies-144905649502.png)
我们可以确定在1659076992时除revision记录中非NULL值的subReplyNum以外的字段值都跟当前版本(1659091395)一致
请注意字段NULL值且字段nullFieldsBitMask值中没有此字段名则表示该字段未在time字段此时修改过,只有字段nullFieldsBitMask值中有此字段名才能表示此字段当时的值的确是NULL
所有表中的id字段均为无意义的业务无关自增主键,即便删除也不影响数据解释
表_replies_img提取了在119899条回复帖中的28422(由于用户可以复制引用一张已上传的图片,所以去重后是27399个,如果额外考虑对下载后的图片二进制内容计算hash去重还会少104张)贴吧ugc图片:
![](https://n0099.net/v/assets/files/2022-07-31/1659297522-40964-replies-img.png)
以https?://(tiebapic|imgsrc|imgsa).baidu.com/forum/pic/item/hashOrUrl.jpg
的形式拼接url便可公网访问该图片
全部下载后有9.1G大,对其进行webp有损压缩转码并zip归档后有2.6G大
请注意所有这些.jpg扩展名只是一个文件名,图片实际格式可以是bmp png gif等非jpg,可以使用file根据图片二进制开头的幻数确定图片格式,或使用imagemagick的identify -verbose
提取图片文件详细信息
在这其中图片
cf180b19972bd407bcf63a936c899e510fb3096d
9110b1dea9ec8a13f41675ace003918fa0ecc028
是经过多次重试后可确认贴吧返回或用户上传时的图片是损坏的,其余27397张图片经过identify读取均无错误
以上所有表sql数据和27399张图片可在 https://n0099-my.sharepoint.cn/personal/n_n0099_partner_onmschina_cn/_layouts/15/onedrive.aspx?id=%2Fpersonal%2Fn_n0099_partner_onmschina_cn%2FDocuments%2Ftbm_f27278534&ga=1 或 https://pan.baidu.com/s/1QNIcxHHjJ8orAoIlaJeaLw?pwd=6uhu 获得
文件checksum:
img.jpg.zip
9, 465, 377, 287 bytes
MD5: 18BD74C7797C759B8097CA5547228F1D
SHA1: A32438D27DCF7F9C2D29BDB310E8015F71930F6F
img.webp.zip
2, 811, 026, 096 bytes
MD5: C1E384FC1BA71E5B1C8A8880F36348C6
SHA1: C4882B97631404CBE9677B5AF0472C8A10DAFCF6
tbm_f27278534.sql
58, 910, 411 bytes
MD5: A80DF5349DEAD0F9A370C956BEB1024F
SHA1: 49F6D8D9A5B7B052250C0D1CEE84A4139BF4432B
tbm_f27278534.sql.7z
10, 796, 070 bytes
MD5: E9A53F1ADF13767004CB97EEAE3536FD
SHA1: AD3A2AC79C253FE76FDC6B1603963CEF109A4362
img.webp.zip的目录结构:
succeed下为所有成功通过cwebp -m 6 -sharp_yuv -q 80
转换的webp图片
gif下为原图是gif格式,使用gif2webp -m 6 -loop_compatibility
转换为动态webp(相当于webm视频)
failed下为转webp失败的图片,主要是超过16384x16384px大小限制的jpg、非jpg/png/gif格式(如bmp)
tbm(贴吧云监控)是一个开源项目:https://github.com/n0099/TiebaMonitor,以爬取和展示贴吧数据为主要重心,已由本人间歇性开发长达5年时间
如果您有兴趣参与本项目的未来开发,欢迎加入我们的slack:https://n0099.zulipchat.com
在不久的将来我完成网页前端对爬虫c#重写所使用迁移后数据库结构的兼容时,可在 https://n0099.net/tbm/p/f/27278534 上在线浏览这些数据而无需下载到本地进行分析