网络分析 · 独立博客 · 数据可视化

用爬虫画出
开往的朋友圈

开往的随机跳转机制告诉你「这里有很多博客」,但不告诉你它们之间是否已经有了真实的关系。现在有了答案——它们有,而且比我预想的更紧密。

数据快照 2026-06-06      节点 993      有向边 4,115      社区 25
993      活跃节点
4,115      有向友链边
8.29      平均度数
25      社区数
0.42%      网络密度
99.9%      HTTPS覆盖

先说清楚一件事:两张完全不同的网络

开往的随机跳转是这样工作的:每个成员站放一个开往按钮,点击后跳转到 travellings.cn/go.html,go.html 调用 /random 接口,从全部成员里随机抽一个返回。这个过程是纯随机的,和你从哪个站点点进来完全无关,也不存在「邻居」概念——每次跳转都是面向全体成员的均匀抽签。

项目定义
我的爬虫做的是另一件事:直接 GET 每个成员站的页面,提取里面所有 <a href> 链接,过滤出目标域名在开往成员列表里的——这是博主手动挂上去的友链。开往按钮本身指向 travellings.cn,在过滤规则里被明确排除,不会产生任何边。

所以这个图谱反映的不是开往的流量分发关系,而是「以开往成员为样本,博主之间自发形成的友链网络」。两张网络正交,互不干扰。所有数据是 2026-06-06 这一天的一次性快照,博主的友链页随时可能变化,图谱反映的是那个瞬间的状态。

力导向图 · 993节点 · 4115有向边        D3.js force-directed graph

开往社区友链网络力导向图,993个节点,4115条有向边,可见明显的核心簇与边缘孤岛结构

节点大小 = PageRank · 边方向 = 友链指向 · 颜色 = 社区归属        kisara-lab.github.io/travellings-graph

发现了什么

发现 01
这是一张真实存在的社交网络
993 个活跃节点,4115 条有向边,平均度数 8.29,网络密度 0.42%。听起来稀疏,但对于一个从未有人刻意构建的自发网络而言相当可观——每个博主的友链页里平均有 8 个指向其他开往成员,这是真实社交选择积累的结果。
发现 02
张洪 Heo 是断层式的核心
入度 136,PageRank 187.06。第二名安知鱼入度 69,PageRank 98.64。差距几乎是两倍,且 PageRank 差距更大——这意味着他不只是被很多人链接,而是被很多「本身也很重要的人」链接。在一个完全自发形成的社区里,这种程度的中心化相当罕见。

入度排行 TOP 5

# 博主 入度 PageRank
1 张洪 Heo

136

187.06
2 安知鱼

69

98.64
3 清羽飞扬

55

—
4 杜老师说

—

—
5 风记星辰

—

—
发现 03
最社交的人不是最受欢迎的人
出度第一清羽飞扬,友链页挂了 77 个开往成员,但入度只有 55。对比张洪 Heo 入度 136、出度仅约 33——一种主动出击、广泛结交,一种内容吸引、自然聚集。前者依赖行动,后者依赖影响力,两种参与方式在图里清晰可见。
发现 04
25 个社区,13 个连通分量
Louvain 社区检测把 993 个节点分成了 25 个社区,最大的三个分别有 132、124、115 人。这些社区并不是按「技术 vs 生活」这种内容维度分裂的,更像是按人际网络分裂——谁和谁认识决定了归属。13 个连通分量意味着有少量博主和主网络完全断开,是真正的孤岛。

基础设施:Cloudflare 是隐形基础

建站平台分布

Hexo
306 站
WordPress
164 站
Typecho
119 站
Astro
106 站
Halo
90 站
Hugo
61 站
值得一提
Cloudflare 托管 24.4% 的站点,但 Vercel(12.7%)和 GitHub Pages(10.9%)背后走的也是 Cloudflare 边缘网络,实际覆盖率可能超过 50%。大家在用它,但不把它当作值得推荐的东西来提——它已经成为透明的基础设施,就像水和电一样。HTTPS 覆盖率 99.9%,完全自发达到,没有任何平台强制要求。

社交账号:GitHub 是身份证

爬取了每个成员站的社交账号链接,结果里藏着这个群体的消费习惯侧写:

GitHub 847 站,几乎等于全员覆盖。B 站以 280 站排第二,是微博的 3.7 倍——这批人的内容消费习惯和「普通互联网用户」差异显著。小红书只有 17 站,差距悬殊。

活跃度:38% 的「僵尸站」

RSS 活跃度分级(有 feed 的 944 站)

近三月活跃
296 站
活跃
235 站
一般活跃
154 站
僵尸
149 站
长期停更
110 站
现实
另有 570 个站点无 RSS feed,无法判断活跃度,但大量可能已停更。加上 zombie + dormant 的 259 站,整体「不活跃」比例可能接近 38%。这不是开往的问题,是所有独立博客聚合社区都面临的现实:博主们来了又走,域名还在,内容已经停了。

局限性

数据是 2026-06-06 的一次性快照,博客圈变化很快,几个月后就会有偏差。只爬了首页和友链页,没有全站递归,部分友链可能散落在文章、关于页等位置,边的数量会被低估。约 260 个站点在爬取时无法访问(超时、DNS 错误等),这些站点的关系数据缺失。平台识别依赖 HTML 特征,169 个站点标记为 Unknown,高度定制的主题会让特征提取失效。

技术实现

爬虫用 Python asyncio + aiohttp,并发 50,对 1500+ 个站点做双层爬取:先爬首页,再通过关键词匹配(友链、links、blogroll 等)定位友链页,最多跟进三个候选页面。只爬首页会漏掉大量真实关系,因为大多数博主的友链集中在专门的友链页而不是首页。

链接提取用 BeautifulSoup,过滤逻辑简单:目标域名在开往成员集合里就保留,否则丢弃。数据存 SQLite,支持断点续跑。图计算用 NetworkX(PageRank、Louvain 社区检测),可视化用 D3.js v7 的 force-directed graph,纯静态部署在 GitHub Pages。


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。