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

Streamlit+Twitter API v2取数转Pandas为空及查询优化问题

问题解决及优化方案

一、DataFrame为空的原因及修正

你第二段代码的问题核心有两点:

  1. 变量名冲突:你初始化了tweets = [],直接覆盖了之前API返回的推文数据,循环空列表自然不会添加任何内容。
  2. Tweepy v2返回结构不熟悉:search_recent_tweets返回的是Response对象,不是直接的推文列表,实际推文数据存在data属性中;另外你用了expansions='author_id',用户信息会存在includes['users']里,且v2中没有user.screen_name字段,对应的是username。

修正后的完整代码如下:

# 构建查询语句(保留你的原查询,或用后面的多账号优化写法)
query = '(from:user1 -is:retweet -is:reply "#") OR from:user2 -is:retweet -is:reply "#"'
    
# 调用API,注意变量名改成tweets_response避免覆盖
tweets_response = client.search_recent_tweets(
    query=query, 
    max_results=10,
    tweet_fields=['created_at', 'text'],
    user_fields=["name", "username"],
    expansions='author_id'
)

# 先建立author_id到用户名的映射,方便后续匹配
user_map = {user.id: user.username for user in tweets_response.includes.get('users', [])}

# 提取推文数据
tweets_data = []
columns=['user','text','date']
# 遍历API返回的实际推文数据,加or []防止data为空时报错
for tweet in tweets_response.data or []:
    tweets_data.append({
        'date': tweet.created_at,
        'user': user_map.get(tweet.author_id),  # 通过author_id获取对应的用户名
        'text': tweet.text
    })

dftweets = pd.DataFrame(tweets_data, columns=columns)
print(f"Number of tweets returned: {len(tweets_data)}")

二、多账号查询语句优化

完全可以通过定义账号列表自动生成查询语句,避免手动拼接长串OR:

# 定义目标账号列表,想加多少直接在列表里新增
target_users = ['user1', 'user2', 'user3', 'user4']

# 生成每个账号对应的筛选片段
user_query_fragments = [f'(from:{user} -is:retweet -is:reply "#")' for user in target_users]

# 用OR连接所有片段,得到最终查询语句
query = ' OR '.join(user_query_fragments)

# 后续正常调用API即可
tweets_response = client.search_recent_tweets(query=query, ...)

这样不管账号数量多少,都能自动生成符合要求的查询语句,简洁且不易出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:16:28