怎么看一个账号关注了哪些人 —— 以及这份名单说明了什么
怎么看一个账号关注了哪些人 —— 以及这份名单说明了什么
几乎所有注意力都在粉丝列表上。而关注列表 —— 一个账号主动选择去关注的那些人 —— 通常才是两者中更有信息量的那份,也是人们很少去看的那份。
区别在于意图。粉丝是被动积累的,谁都能关注你;而关注是一个刻意的动作,重复了几百次,其结果是一张"这个人实际在关注什么"的地图。
为什么关注列表才是更有用的那份
粉丝告诉你触达,关注告诉你兴趣。
如果你想理解一个人或一个机构 —— 他在意什么、他把谁视为同行、他信任哪些信源 —— 关注列表直接回答这个问题。没有人会不小心关注 300 个账号。
★一个实用的用法:要在一个陌生领域里找到好账号,就去看这个领域里受尊敬的人关注了谁。 那是一份人工筛选过的推荐集,由一个比你更懂这个领域的人建立。★
它同时也是更稳定的信号。粉丝数会被没人要的机器人潮撑大;而关注列表完全由账号主人控制,所以每一条都有意义。
手动看一份列表没问题;而要对比好几份时,接口才有存在的意义。
怎么读一份关注列表
关注数与粉丝数的相对关系是第一件要看的事。一个关注 5,000、粉丝 200 的账号,和一个关注 150、粉丝 5 万的账号,在做完全不同的事。两者都不算错,但那是两种行为:广撒网 vs 精挑选。
构成比数量更重要。 把他关注的账号按类别分 —— 同行、媒体、客户、私人 —— 这个比例会告诉你这个账号是干什么用的。一个公司号如果关注的大多是记者,它在做公关;如果大多是客户,它在做支持。
关注时间是不可见的,这是一个真实的局限。 ★X 不公布某人何时关注了某人。★ 列表返回的顺序大致是"较新在前",但既没有文档说明也不保证。如果你想知道某次关注发生在什么时候,唯一的办法是当时就在看 —— 定期拍快照然后做差集。
互关是整份数据里最强的信号。 一个既关注你、又被你关注的账号代表一段真实连接。算它就是一次集合求交,这也是"多花几次调用把两份列表都拉下来"值得的原因。
用代码拿到列表
import requests
BASE = "https://api.socialapi.tech"
KEY = "your_api_key"
HDRS = {"X-API-Key": KEY}
def get_all(endpoint, username, max_pages=20):
"""翻页拉取粉丝或关注列表,直到穷尽。"""
out, cursor = [], None
for _ in range(max_pages):
params = {"username": username, "limit": 100}
if cursor:
params["cursor"] = cursor
r = requests.get(f"{BASE}{endpoint}", params=params,
headers=HDRS, timeout=60)
r.raise_for_status()
body = r.json()
batch = body["data"]
if not batch:
break
out.extend(batch)
cursor = body.get("meta", {}).get("next_cursor")
if not cursor:
break # 穷尽 —— 这是唯一正确的停止条件
return out
following = get_all("/v1/user/followings", "nasa")
print(f"关注了 {len(following)} 个账号")
# 按粉丝数从大到小
for acct in sorted(following, key=lambda a: -a["followers_count"])[:10]:
print(f" @{acct['username']:<20} {acct['followers_count']:>10,} {acct['bio'][:50]}")
⚠️ ★要在游标为空时停,绝不能在"短页"时停。★ 一页返回不足 100 条不代表你到底了 —— 它会在列表中间发生。遇到短页就 break 的代码会静默截断,而这个 bug 表现为"这个账号关注的人比实际少",没人会注意到,直到某次差集算出一批幻影取关。粉丝列表也是同一个坑。
算互关
正是这个集合求交,让"两份列表都拉"变得值得:
def mutuals(username):
followers = {a["username"] for a in get_all("/v1/user/followers", username)}
following = {a["username"] for a in get_all("/v1/user/followings", username)}
return {
"互关": followers & following,
"我关注了但对方没回关": following - followers,
"对方关注了我但我没回关": followers - following,
}
result = mutuals("someaccount")
for label, accounts in result.items():
print(f"{label:<24} {len(accounts):>6}")
★要用集合(set),不要用列表(list)。★(两份列表都来自同一个分页接口,所以这里真正的成本只有翻页。)用列表推导加 in 判断来做这件事,会把一个瞬间完成的操作变成在大账号上爬行 —— 那是哈希查找和线性扫描的差别,再乘以几万次。
对比多个账号的关注面
真正有意思的那个版本 —— 找出这个领域里所有人都关注的账号:
from collections import Counter
def common_follows(usernames, min_shared=2):
"""被给定账号中至少 min_shared 个共同关注的账号。"""
counts = Counter()
for u in usernames:
counts.update(a["username"] for a in get_all("/v1/user/followings", u))
return [(name, n) for name, n in counts.most_common() if n >= min_shared]
for name, n in common_follows(["nasa", "esa", "spacex"], min_shared=2)[:20]:
print(f" 3 个里有 {n} 个关注了 @{name}")
这就是你在一个不熟悉的领域里找到关键账号的方法。 如果三个受尊敬的机构都关注同一个小账号,那个账号值得看一眼 —— 而任何粉丝数排序都不会把它浮现出来。
值得知道的局限
受保护账号。 如果一个账号受保护,你不是被批准的关注者就读不到它的关注列表。
大账号很贵。 一个关注了 5 万人的账号是 500 页。先想清楚你是否需要整份列表,还是只要按相关性排序的前几页 —— 而且要知道驱动 API 账单的是翻页量,不是你感兴趣的账号个数。
没有关注时间戳。 上面讲过,而这是人们最常"希望它不存在"的局限。没有任何接口返回某次关注发生的时间。 快照加差集是唯一路径。
列表不是完全稳定的。 在大账号上,连续两次拉取可能略有差异,所以"在一次差集里出现过"不足以作为变化的证据。要求连续两次观察一致再下"某人取关了"的结论。
大家会问的问题
怎么看某人关注了谁? 进他的资料页点 Following(正在关注)。除非账号受保护,否则是公开的。
别人能看到我查看了他的关注列表吗? 不能。查看资料页或它的列表不会产生任何通知。
怎么批量看某人关注了谁? 用代码 —— 带游标翻页拉他的关注列表。界面适合浏览,做分析则不现实。
粉丝和关注有什么区别? 粉丝是关注他的账号;关注是他关注的账号。关注是刻意的那个,所以更有信息量。
怎么找互关? 把两份列表都拉下来求交集。界面上资料页显示的"你关注的人中有谁关注了他"是相关的,但不是同一回事。
能看到某人最近关注了谁吗? 不能直接看 —— X 不公布关注时间戳。你需要自己定期拍快照并做差集。
关注数和列表长度为什么对不上? 显示的计数会滞后,而且被封或已停用的账号可能仍被计入但不显示。小的差异是正常的。
一个人最多能关注多少账号? 有一个几千量级的上限,另外当你关注数远超粉丝数时还有比例限制。
能看到私密账号关注了谁吗? 只有当你是被批准的关注者时才能。
怎么找到和某个我喜欢的账号相似的账号? 去看那个账号关注了谁。 那是一份由懂行的人建立的筛选列表 —— 通常比算法推荐更好。
能导出关注列表吗? 用代码可以 —— 翻页拉完再写出去。界面里没有导出按钮。
怎么知道有人取关了我? 比较不同时间的快照。没有通知。 见做一个粉丝追踪器。
资料页上的"关注了你"是什么意思? 那个账号关注了你。你查看他资料页时会显示在用户名旁边。
关注列表能排序吗? 界面里不能。用代码可以按资料对象上的任何字段排 —— 粉丝数、发帖数、注册时间。
为什么有人关注几千个账号? 有时是真的兴趣广泛,有时是回关养号。和他粉丝数的比例通常能区分这两者 —— 见识别自动化账号。
关注列表的顺序有意义吗? 大致是倒序,但没有文档且不保证。不要写依赖它的逻辑。
怎么找出同时关注某个账号和我的人? 把两份关注列表都拉下来求交集。和算互关是同一个集合运算。
能看到某人取关了哪些账号吗? 只有当你事先记录过他的列表才行。事后无法还原。
关注列表多久变一次? 因账号而异,差别极大。成熟账号变化很慢;新号或营销号则churn很快。
能用用户 ID 拿关注列表吗? 能,而且它才是更可靠的键 —— 用户名会变,ID 不变。见为什么要存 ID。
拉完整份列表要多少次调用? 大约是关注数除以 100。一个关注 5,000 人的账号约 50 次。
怎么查看某人在推特上关注了谁? 他的资料页 → 正在关注。所谓"关注检查器"就是系统性地读这份列表 —— 不需要另外的工具。
怎么拿到推特关注数? 资料页上有,而且每次查询资料都会返回。要追踪关注数随时间的变化,得自己记录 —— X 不保存历史。
有推特关注追踪器吗? 和粉丝追踪器是同一个形状 —— 拍快照、和上次做差集。机制完全一样,只是端点不同。
怎么让某人不再关注我? 把他作为粉丝移除 —— 见不拉黑地移除一个粉丝。
怎么查我关注了谁? 翻你的关注列表。 ★它返回完整资料★,所以按活跃度或粉丝数过滤是本地的活。
有关注检查工具吗? 把两份列表都取回来做比较。 ★"检查器"工具做的正是这个集合运算。★
怎么查某人有没有回关我? 用你的粉丝集合与关注集合求交。 ★一次差集就能一次性回答所有人★,而不是一个一个查。
谁取关了我? 拿今天的粉丝列表和存下来的那份做差集。 ★没有更早的快照就没有可比对象★ —— 追踪怎么做。
推特为什么自动关注了一些账号? 通常是你授权过的某个应用。 ★只读工具无法关注任何人★ —— 审查应用权限。
关注数有上限吗? 有一个上限,而且在你越过一个初始阈值后,它会随你的粉丝数一起放大。
推特上谁关注的人最多? 关注数被追踪的程度远低于粉丝数 —— 被追踪的那些纪录。
怎么取消关注一些账号? 在 App 里取关。 ★我们是只读的,不能替你取关。★
能导出我的关注列表吗? 能 —— 翻页后写进 CSV —— 导出模式。
能看别人的关注列表吗? 公开账号可以。 ★受保护账号不行。★
怎么找互关? 粉丝集合与关注集合的交集。 ★那就是它的定义,而且只是一行集合代码。★
如果你要基于它做东西
两个集合运算 —— 互关和共同关注 —— 才是价值所在,而两者都要求列表完整才正确。★一份被截断的列表不会给你一个"稍微错一点"的答案,它会给你信心十足的假阳性。★
这正是我们的 API 处理的:对粉丝和关注做基于游标的翻页,每一条都返回完整资料对象而不是光秃秃的用户名,这样你不必为每个账号再查一次就能过滤和排序。只读、固定按次价格、没有属于你的限流要管。
延伸阅读:追踪粉丝并检测取关 · 识别自动化账号 · 只记得个大概怎么把账号找出来。