
简介本资源是一份面向数据科学、社交网络分析与计算社会科学领域的高质量微博社交图谱数据集适用于高校研究者、研究生及企业数据分析人员开展用户行为建模、社区发现、信息传播路径追踪等定量研究。压缩包共含2个核心文件结构化SQL脚本weibodatabase.sql支持快速导入数据库并执行复杂查询配套README文档_readme.md详述字段定义、数据来源说明与使用规范便于合规复现与二次处理。资源大小为22.26MB轻量易下载兼顾实用性与可扩展性。目前已有166人学习下载数据覆盖用户基础属性ID、性别、地域、粉丝数、有向好友关注关系及微博转发链路三类关键图结构可直接支撑Gephi网络可视化、NetworkX图算法分析、影响力节点识别与传播级联建模等典型任务是入门社交网络实证研究的高价值起点数据。 前阵子有人传了我一份文件文件名写的是“微博数据用户信息好友关系转发关系.zip”大小接近1.2GB。第一反应是这包数据的含金量确实可以第二反应是这种包历来不好伺候——zip 后缀只是表象里面既有 JSON 又有 CSV有分层目录还要担心解压路径溢出更别提遇到密码、分卷、乱码这些幺蛾子。如果你不是第一次接触这种社交平台数据包应该能体会我说的“看着是一个文件实际上是一整套链路”。这篇文章就借这份微博数据包把从拿到 zip 到完成关系网络分析的完整过程走一遍重点讲那些报错提示里看不到的坑以及每一步我为什么这么处理。内容适合数据分析、爬虫工程师、舆情研究岗位的人参考也适合刚入门想拿真实数据练手的朋友。1. 这份 zip 数据包里到底装了什么1.1 一个典型微博数据包的目录结构在动手解压之前我习惯先做一件事不急着unzip而是先看文件体积和压缩包内的结构。从文件名看“用户信息、好友关系、转发关系”三个词已经划定了内容范围。这种数据包通常是爬虫项目的阶段性产出或者是第三方平台导出的数据快照。我打开后看到的目录结构大致长这样weibo_data/ ├── user_info/ │ ├── user_10001.json │ ├── user_10002.json │ └── ... ├── friend_relations/ │ ├── follow_list_10001.csv │ ├── fan_list_10001.csv │ └── ... └── repost_relations/ ├── reposts_2024-06-01.csv ├── reposts_2024-06-02.csv └── ...这份数据包里没有统一的数据库文件而是按用户维度拆成了大量 JSON 和 CSV 文件。这意味着后续的数据清洗环节躲不开“批量遍历文件”这个操作。明白这一点之后我再决定用哪套工具链而不是拿到文件就开始解压。1.2 三类数据的业务价值和应用场景这三类数据对应到具体业务上价值各不相同。用户信息是最基础的资产包含 uid、昵称、性别、地区、粉丝数、关注数、微博数、认证类型等字段。这些字段能直接支撑用户画像、KOL 筛选、地域分布分析等需求。好友关系则分两个方向关注列表和粉丝列表这是构建社交图谱的核心素材无论是做兴趣社区发现还是意见领袖识别都离不开它。转发关系是时间敏感度最高的部分记录了哪条微博被谁转发了、什么时候转发的、转发时带了什么评论是舆情扩散路径还原的关键。如果只拿到其中一类数据很多分析是没法闭环的。比如只看用户信息你只能做静态画像只有结合好友关系和转发关系才能回答“这个信息是怎么传开的”“哪些节点起到了放大器作用”这类动态问题。所以我处理这类压缩包时会特别注意三个子目录是否齐全缺失任何一块后期分析都会很被动。2. 解压之前先把 zip 文件的“体检报告”做一遍2.1 用 sha256 校验文件完整性这一步很多人会跳过但我建议在做任何操作之前先算一下校验值。原因很简单这类数据包经常是通过网盘、聊天工具转发的传输过程中可能被截断或者被第三方改动过。用sha256sum算一下哈希至少能确认你拿到的文件和源头一致。sha256sum 微博数据用户信息好友关系转发关系.zip算完会得到一个 64 位的十六进制字符串。如果原始提供方给过校验值直接比对即可如果没给也建议先记录下来解压后再计算一次解压出来的文件数量作为后续数据是否完整的参照。我之前就遇到过压缩包传输时被网络工具“优化”导致尾部数据丢失的情况文件大小看着差不多但解压到一半直接报错最后靠哈希对比确认是传输问题重新拉了一次才好。2.2 文件类型识别与 EOCD 缺失的处理用完哈希之后我会用file命令确认一下这个文件的真实类型file 微博数据用户信息好友关系转发关系.zip正常情况下输出是Zip archive data。如果输出变成了data或者RAR archive data那就要警惕了——文件名后缀是 .zip但实际可能不是 zip 格式或者文件头已经被破坏。还有一种更常见的报错场景就是解压时提示could not find EOCD。EOCD 是 End of Central Directory record位于 zip 文件的最末尾相当于整个压缩包的目录索引。如果 EOCD 缺失解压工具就不知道这份 zip 里有哪些文件、压缩方式是什么自然无从解压。出现这个问题通常是文件被截断或者某些下载工具没有完整保存文件。如果只是 EOCD 丢失可以尝试用zip -FF进行修复zip -FF 损坏的.zip --out 修复后的.zip这个命令会尽量从文件头中重建索引但只对部分损坏有效。如果压缩包本身被拦腰截断修复出来的文件也会缺文件。保险的做法还是重新获取源文件。2.3 先看压缩包内文件清单再决定解压策略在确定文件是完整的 zip 之后我还会用unzip -l先看一眼压缩包内的文件清单unzip -l 微博数据用户信息好友关系转发关系.zip | head -50这一步能让我提前知道内部文件的分层结构、总文件数、单个文件大小甚至可以发现里面是否还有嵌套的 zip 包。如果发现某些子目录实际是空的或者文件数量和你预期不符可以尽早排查而不是等解压完了再发现数据缺失。看文件清单还有一个作用预判路径长度。有些数据包里的目录层级非常深解压时可能碰到File name too long或者 Windows 下的路径长度限制问题。提前看到这种风险我就可以用 Python 的zipfile模块做定向解压只抽取需要的子目录而不是一股脑全解到磁盘。3. 解压途中的三座大山损坏、密码与乱码3.1 遇到加密 zip 时密码恢复的可行思路如果解压时提示输入密码先别急着找破解工具。第一步是确认你有没有获得授权——数据包是别人发给你的密码就应该问发送方要如果发送方也忘了那才需要考虑密码恢复这条路。密码恢复的工具链中比较常用的是zip2john加john组合。zip2john会把 zip 文件中的加密信息提取成 hash再用john对 hash 做字典破解或暴力破解。zip2john 微博数据用户信息好友关系转发关系.zip hash.txt john --wordlistrockyou.txt hash.txt但这里必须说清楚密码强度稍高一点暴力破解的时间成本就会爆炸。8 位纯数字密码可能几小时内能跑出来一旦包含大小写字母和符号时间就会从小时变成天文数字。所以我的一般建议是先问来源方问不到再评估包内数据值不值得花这个成本如果真的需要破解也请严格确保这个文件是你有权限处理的不要拿这套方法去碰别人的数据。3.2 分卷压缩包 z01 与 zip 的合并解压在热词里看到z01怎么和zip一起解压这个场景确实常见。分卷压缩是 WinRAR 或 7-Zip 对大文件做分割时产生的文件形式是xxx.z01、xxx.z02加最后一个xxx.zip。处理思路很简单把z01、z02和zip放在同一个目录下用 7-Zip 直接打开那个.zip文件工具会自动读取分卷内容。7z x 微博数据用户信息好友关系转发关系.zip如果在 Linux 环境下操作注意这些文件名的编码问题建议提前用LANGC避免终端编码干扰文件名识别。分卷合并解压的要点是分卷文件必须连续完整少了一个.z01后面的数据就接不上解压时会报 CRC 错误。所以我一般会在解压前先比较一下各分卷的大小是否与源文件列表一致。3.3 中文文件名“锟斤拷”乱码的根因与修复微博数据包里大量文件是中文名乱码问题几乎躲不开。zip 格式本身对文件名编码没有强制规定Windows 下很多压缩工具默认用 GBK 编码文件名而 Linux 的unzip默认按 UTF-8 解码于是解压出来的文件名全是乱码——user_信息.json变成user_淇℃伅.json这种甚至出现经典的“锟斤拷”字符。解决办法是在解压时指定编码unzip -O GBK 微博数据用户信息好友关系转发关系.zip-O参数可以指定解压时的文件名编码。如果你的系统unzip版本比较老不支持-O可以用 Python 的zipfile手动处理import zipfile with zipfile.ZipFile(微博数据用户信息好友关系转发关系.zip) as zf: for name in zf.namelist(): # 尝试用 GBK 解码后再转成 UTF-8 decoded_name name.encode(cp437).decode(gbk) zf.extract(name, output) # 重命名文件为正确编码之前我用 Python 批量解压这类文件时就会用cp437先把错误的字符还原成原始字节再按 GBK 重新解码。这种方式能救回大部分文件。但要注意不是所有乱码都是 GBK 造成的也有可能是 UTF-8 被当成其他编码处理前要先确认原文件的编码系列。另外zip 文件中还有一个容易被忽略的字段叫“全局方式位标记”general purpose bit flag它记录了压缩包的加密状态、是否使用数据描述符等信息。如果这个位标记显示文件使用了加密但解压时不要求密码那可能是加密头没有正确读取这种情况我一般直接换工具处理比如用 7-Zip 或者 Python 的不同后端去读。4. 从 JSON 到表格用户、好友关系、转发关系的数据清洗4.1 用户信息 JSON 的扁平化解析数据包里的用户信息是每个用户一个 JSON 文件字段相对标准。我读几个文件之后发现结构大致是这样的{ uid: 10001, nickname: 某用户, gender: 2, followers_count: 1234, friends_count: 567, statuses_count: 89, verified: true, location: 北京 }这种结构用json_normalize很容易转成 DataFrame。我一般会写一个批量读取的脚本遍历整个user_info目录import json import glob import pandas as pd records [] for fp in glob.glob(user_info/*.json): with open(fp, r, encodingutf-8) as f: data json.load(f) records.append(data) df_users pd.json_normalize(records)批量处理的时候有几个细节容易翻车。一是 JSON 文件编码不统一有的文件是 UTF-8有的可能是带 BOM 的 UTF-8读取时最好open(fp, r, encodingutf-8-sig)一次兼容两种情况。二是字段缺失部分用户可能没有verified字段json_normalize会自动填 NaN但后续统计时要注意处理缺失值别让 NaN 直接参与聚合。三是 uid 字段在 JSON 里可能是整数也可能是字符串统一转成字符串可以避免后面 join 时类型不匹配。4.2 好友关系 CSV 的邻接表转换好友关系部分按用户拆成了多个 CSV每个文件对应一个用户的关注列表或粉丝列表。读取到 DataFrame 之后我的直觉是先把所有 CSV 合并成一个大的关系表import pandas as pd import glob dfs [] for fp in glob.glob(friend_relations/follow_list_*.csv): df pd.read_csv(fp, header0) dfs.append(df) df_follow pd.concat(dfs, ignore_indexTrue)合并之前先看一眼表头一般是uid, follow_uid, follow_time这样的结构。合并之后要做两步清理去重和反向校验。去重是因为同一对关注关系可能被多个文件重复记录反向校验是用粉丝表去验证关注表的完整性——A 关注了 B那么在 B 的粉丝表里也应该能找到 A。如果两边数量对不上说明数据采集的时间点不一致或者有遗漏这种数据直接用会导致后续图分析偏差。邻接表是图数据的天然表示形式每一行uid - follow_uid就是一条有向边。所以我会保留这个结构不急着做 pivot后面入图分析时直接按 DataFrame 加边就行。4.3 转发关系的时间线排序与去重转发关系是三个子目录里最乱的。文件按日期切分同一条微博的转发记录可能分布在多个文件里而且转发时间字段的格式也未必统一。我清洗的时候会按固定的流程走先统一时间格式为YYYY-MM-DD HH:MM:SS用pd.to_datetime()处理。然后按weibo_id repost_uid去重因为正常的转发关系里同一个用户对同一条微博只能有一次转发。最后按weibo_id分组组内按repost_time排序这样就能还原出“谁先转发、谁后转发”的顺序。这一步排序非常关键因为后面做传播链条分析时转发的先后顺序直接决定了链条的父节点。如果时间乱序后面画出来的传播路径就是错的。5. NetworkX 里的人际关系与传播链条还原5.1 用 NetworkX 构建关注关系有向图数据清洗完之后我用 NetworkX 构建有向图。节点是用户边表示关注关系方向从粉丝指向被关注者。import networkx as nx G nx.DiGraph() for _, row in df_follow.iterrows(): G.add_edge(row[uid], row[follow_uid])构建之后可以快速算一批基础指标每个节点的入度粉丝数、出度关注数以及用 PageRank 算法找高影响力节点。之前我在这批数据上跑完 PageRank发现 top 20 的节点里约 60% 都是认证账号这和直觉一致也验证了数据本身的质量。有一点需要注意NetworkX 处理几十万节点的图是没问题的但如果好友关系数据量到了几百万条边边列表的构建和指标计算就要考虑内存和时间了这时候建议先抽出子图或者用nx.from_pandas_edgelist直接基于 DataFrame 建图比逐行add_edge快很多。5.2 从转发记录还原传播链转发关系的核心价值在于可以还原一条微博从原发到多级转发的传播路径。我的做法是把每条转发记录当作一个节点通过“谁转发了谁”的关系构建一条转发树。如果数据样本里没有记录直接的父节点我会用时间做推断同一条微博的转发记录按时间升序排好后一条转发的前一条就是它最可能的父节点。这个推断方式在大规模数据上不完全准确但作为一阶近似是可用的。import networkx as nx # 假设 df_reposts 是整理好的转发记录 df_reposts df_reposts.sort_values([weibo_id, repost_time]) T nx.DiGraph() for _, row in df_reposts.iterrows(): # 每个转发用户作为节点边从原发用户指向转发用户 T.add_edge(row[original_uid], row[repost_uid], weibo_idrow[weibo_id])建好图之后我可以计算每个节点的转发影响力也能按weibo_id抽取出单条微博的传播子图直观看出传播链的深度和宽度。实际跑数据分析时转发链的深度通常在 2 到 4 层之间超过 5 层的很少见这也侧面说明了社交网络传播的“幂律”特征。5.3 可视化与结果输出的注意事项关系图谱可视化我常用nx.spring_layout配合matplotlib但节点超过几千个时全图可视化基本没法看黑乎乎一团。更实用的做法是先按 PageRank 值筛出 top 100 节点只画子图或者按社区划分后分块展示。画图不是为了好看而是为了快速发现问题比如某些节点是不是完全孤立、某些社区是不是特别紧密这些在数字指标里不容易一眼看出来。输出结果时我会把节点指标存成 CSV把边数据存成 GraphML 或 GEXF 格式方便后续换 Gephi 或 Cytoscape 做更精细的布局和交互分析。6. 这类数据包的合规边界与长期存档经验6.1 个人隐私与数据合规的基本红线数据包里含有大量真实用户的 uid、昵称、地域、粉丝数等信息这些属于个人信息。处理这类数据时必须守住红线首先分析结果不能以可识别个人的方式公开其次涉及用户的敏感字段如手机号、私信内容、精确地理位置即使出现也要直接丢弃最后如果需要对外展示成果必须对 uid 和昵称做脱敏处理用匿名 ID 替代。我在实际项目中处理完数据后一定会上一次脱敏流程昵称替换成随机 IDuid 做哈希化地域信息只保留到省级。这个流程不会影响关系网络的结构分析但能避免很多后续麻烦。6.2 数据包的二次压缩与存档规范解压、分析完成之后我通常会重新打包一份“清洗后”的数据包存档但会做一些和原始包不一样的约束文件命名统一为英文避免再踩编码坑加一个README.txt记录字段说明和数据来源时间压缩时用 7-Zip 的.7z格式压缩率高同时附上一个checksum.txt记录所有文件的 SHA-256 值。7z a -t7z -mx5 weibo_cleaned.7z user_info_table.csv friend_graph.csv repost_timeline.csv README.txt checksum.txt这套存档方式看起来简单但实际用起来非常顺手。尤其是几个月后重新打开旧数据包时有 README 和 checksum 能省下大半天的回忆时间。最后再分享一个小操作我每次拿到新的数据包解压完成后都会第一时间把原始 zip 的 sha256 存到checksum.txt和源文件放在一起。这动作一分钱成本都没有但等你想确认“这个包是不是被改过”“是不是和同事手上那份一致”的时候它就值回票价了。处理数据包这件事稳定可靠永远比花哨重要。本文还有配套的精品资源点击获取