如何使用Tweepy通过用户名而非screen_name获取目标用户推文
问题解决方案
api.user_timeline 接口设计上就只支持单次传入单个用户的 screen_name(即@后面的账号唯一标识),不支持直接传入用户名列表批量查询,最直接的实现方式就是遍历你的用户名列表,逐个调用接口拉取推文即可。你原有代码的逻辑方向是对的,但存在缩进错误、变量作用域问题,也缺少异常处理和限流适配,很容易运行报错或者只拿到最后一个用户的推文。
注意事项
- 如果你列表里存的是用户的显示昵称(个人主页上展示的非唯一名称),不是@后的账号handle,需要先调用
api.search_users接口匹配到对应用户的真实screen_name再拉取推文,否则会出现查错用户、查无此人的问题 - 初始化API时加上
wait_on_rate_limit=True参数,触发Twitter接口限流时会自动等待配额恢复,不需要手动写休眠逻辑 - 对不存在、已封禁、设为私密的账号要加异常捕获,避免单个用户查询失败导致整个任务中断
修正后可运行代码
import configparser import tweepy import pandas as pd config = configparser.ConfigParser() config.read('config.ini') api_key = config['twitter']['api_key'] api_key_secret = config['twitter']['api_key_secret'] access_token = config['twitter']['access_token'] access_token_secret = config['twitter']['access_token_secret'] # 鉴权,加上限流自动等待参数 auth = tweepy.OAuthHandler(api_key, api_key_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth, wait_on_rate_limit=True) # 这里替换成你的用户名列表,注意存储值为@后的账号名 users = df['Name'].tolist() limit = 300 columns = ['User', 'Tweet'] data = [] for user in users: try: # 逐个拉取对应用户的推文 tweets = tweepy.Cursor( api.user_timeline, screen_name=user, count=200, tweet_mode='extended' ).items(limit) # 将当前用户的推文写入数据集 for tweet in tweets: data.append([tweet.user.screen_name, tweet.full_text]) print(f"用户{user}的推文拉取完成") except Exception as e: print(f"拉取用户{user}的推文失败,错误信息:{str(e)}") continue # 统一转换为DataFrame df1 = pd.DataFrame(data, columns=columns) print(df1)
如果你使用的是Twitter API v2版本,对应Tweepy v2客户端的
get_users_tweets接口逻辑完全一致,同样是遍历用户ID/账号名单次调用即可,没有原生支持批量拉取不同用户时间线的接口。
内容的提问来源于stack exchange,提问作者mayssa matteli
相关产品推荐
相关产品推荐

