如何在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" ])
关键注意点:
- 一定要在
search_all_tweets里加上expansions="author_id"参数,这个参数是告诉API需要返回推文作者的关联数据,否则responses.includes里不会有用户信息! - 用户信息存在
responses.includes['users']里,每条用户对象的id就是推文里的author_id,用字典映射可以避免每次遍历查找的低效问题 - 处理的时候要考虑找不到用户的情况(比如作者账号已删除),用
get方法或者条件判断避免报错
内容的提问来源于stack exchange,提问作者aoden
相关产品推荐
相关产品推荐

