You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中通过search_all_tweets为Pandas DataFrame添加用户名与名称列

解决Twitter API获取用户username和name的KeyError问题

我刚看了你的代码,发现问题出在Tweepy返回数据的结构上——你指定了user_fields没错,但用户信息根本不在responses.data里,而是单独存在responses.includes['users']这个集合里!因为Twitter API的设计是把推文主体和关联的用户数据分开返回的,推文里只存author_id,需要你自己用这个ID去匹配对应的用户信息。

修正步骤:

  • 首先把responses.includes['users']里的用户数据转成一个字典,用author_id作为键,这样就能快速通过推文的author_id找到对应的用户
  • 遍历推文的时候,通过每条推文的author_id从字典里取出用户对象,再获取username和name

修正后的完整代码:

import requests
import os
import json
import tweepy
import pandas as pd
from datetime import timedelta
import datetime

bearer_token = "my_bearer_token_here"

keyword = "#WomeninSTEM"
start_time = "2022-01-01T12:01:00Z"
end_time = "2023-01-01T12:01:00Z"

client = tweepy.Client(bearer_token=bearer_token)

responses = client.search_all_tweets(
    query="#WomeninSTEM",
    max_results=500,
    start_time=start_time,
    end_time=end_time,
    user_fields=["username", "name"],
    tweet_fields=["in_reply_to_user_id", "author_id", "lang",
                  "public_metrics", "created_at", "conversation_id"],
    expansions="author_id"  # 别忘了加这个! expansions参数是用来告诉API返回关联的用户数据的
)

# 把用户数据转成字典,用author_id做键,方便快速查找
user_dict = {user.id: user for user in responses.includes['users']}

column = []
for tweet in responses.data:
    row = []
    # 通过推文的author_id找到对应的用户
    user = user_dict.get(tweet.author_id)
    if user:
        row.append(user.username)
        row.append(user.name)
    else:
        # 万一找不到用户(比如账号被删),可以填充空值
        row.append(None)
        row.append(None)
    
    row.append(tweet.text)
    row.append(tweet.public_metrics["like_count"])
    row.append(tweet.public_metrics["retweet_count"])
    row.append(tweet.public_metrics["reply_count"])
    row.append(tweet.public_metrics["quote_count"])
    row.append(tweet.created_at)
    # 优化回复提取逻辑:只有是回复时才取开头,否则留空
    ReplyTo = tweet.text.split(" ")[0] if tweet.in_reply_to_user_id else None
    row.append(ReplyTo)
    row.append(tweet.in_reply_to_user_id)
    row.append(tweet.conversation_id)
    
    column.append(row)

# 给DataFrame加上列名,方便后续处理
data = pd.DataFrame(column, columns=[
    "Username", "Name", "Text", "LikeCount", "RetweetCount",
    "ReplyCount", "QuoteCount", "CreatedAt", "ReplyTo", "ReplyToUID", "ConversationID"
])

关键注意点:

  1. 一定要在search_all_tweets里加上expansions="author_id"参数,这个参数是告诉API需要返回推文作者的关联数据,否则responses.includes里不会有用户信息!
  2. 用户信息存在responses.includes['users']里,每条用户对象的id就是推文里的author_id,用字典映射可以避免每次遍历查找的低效问题
  3. 处理的时候要考虑找不到用户的情况(比如作者账号已删除),用get方法或者条件判断避免报错

内容的提问来源于stack exchange,提问作者aoden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 17:36:10