Streamlit+Twitter API v2取数转Pandas为空及查询优化问题
问题解决及优化方案
一、DataFrame为空的原因及修正
你第二段代码的问题核心有两点:
- 变量名冲突:你初始化了
tweets = [],直接覆盖了之前API返回的推文数据,循环空列表自然不会添加任何内容。 - 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
相关产品推荐
相关产品推荐

