如何用Python通过Twitter API V2获取超100条推文?权限问题求助
解决Twitter Basic权限下抓取3000条含“nurofen”推文的问题
问题背景
我已将Twitter访问权限升级至Basic,每月可获取10000条推文,现需抓取3000条含关键词“nurofen”的推文。首次编写的代码设置max_results=3316时,报错提示最多仅能抓取100条;修改代码后又出现403错误,提示需升级访问权限。
首次编写的代码
import tweepy from textblob import TextBlob from wordcloud import WordCloud import pandas as pd import numpy as np import matplotlib.pyplot as plt import sys import re client = tweepy.Client( bearer_token=bearerToken, consumer_key=consumerKey, consumer_secret=consumerSecret, access_token=accessToken, access_token_secret=accessTokenSecret ) response = client.search_recent_tweets(query='nurofen', max_results=3316) print(response.meta) tweets = response.data nurofen_twts = pd.DataFrame([tweet.text for tweet in tweets], columns=['Tweets'])
修改后的代码
# Authenticate with Twitter API auth = tweepy.OAuthHandler(consumerKey, consumerSecret) auth.set_access_token(accessToken, accessTokenSecret) # Create API client client = tweepy.API(auth) # Define the function to clean the tweets def clean_text(text): text = re.sub(r'@[A-Za-z0-9]+', '', text) # Removes @mentions text = re.sub(r'#', '', text) text = re.sub(r'RT[\s]+', '', text) text = re.sub(r'https?:\/\/\S+', '', text) return text # Variables query = 'nurofen' total_tweets = 3316 max_results = 100 tweets = [] # Fetch tweets while len(tweets) < total_tweets: if total_tweets - len(tweets) < max_results: max_results = total_tweets - len(tweets) response = client.search_tweets(q=query, max_results=max_results) tweets.extend(response.data) if response.meta.next_token: next_token = response.meta.next_token response = client.search_tweets(q=query, max_results=max_results, next_token=next_token) else: break # Create dataframe from tweets nurofen_twts = pd.DataFrame([clean_text(tweet.text) for tweet in tweets], columns=['Tweets']) print(nurofen_twts)
问题分析
- 首次代码错误原因:Twitter API v2的
search_recent_tweets接口单次请求的max_results上限为100,直接设置3316超出限制导致报错。 - 修改后代码403错误原因:使用了
tweepy.API(对应Twitter API v1.1),而Basic权限仅支持API v2的接口,v1.1的搜索接口需要更高权限,因此触发权限拒绝错误。
正确实现代码
基于Twitter API v2(适配Basic权限),通过分页获取推文,每次请求取100条,直到达到3000条目标:
import tweepy import pandas as pd import re # 替换为你的认证信息 BEARER_TOKEN = "你的Bearer Token" # 清洗推文文本的函数 def clean_text(text): text = re.sub(r'@[A-Za-z0-9]+', '', text) # 移除@提及 text = re.sub(r'#', '', text) # 移除#符号 text = re.sub(r'RT[\s]+', '', text) # 移除RT转发标记 text = re.sub(r'https?:\/\/\S+', '', text) # 移除链接 return text.strip() # 配置参数 QUERY = "nurofen" TARGET_TWEETS = 3000 MAX_RESULTS_PER_REQUEST = 100 # API v2单次请求上限 tweets = [] next_token = None # 分页抓取推文 while len(tweets) < TARGET_TWEETS: # 计算本次需要抓取的数量(最后一次可能不足100) current_max = min(MAX_RESULTS_PER_REQUEST, TARGET_TWEETS - len(tweets)) # 发起请求,带next_token实现分页 response = tweepy.Client(bearer_token=BEARER_TOKEN).search_recent_tweets( query=QUERY, max_results=current_max, next_token=next_token ) # 如果无数据,提前终止 if not response.data: break # 添加本次抓取的推文 tweets.extend(response.data) # 更新next_token,用于下一页请求 next_token = response.meta.get('next_token') # 如果没有下一页,终止循环 if not next_token: break # 将推文转为DataFrame nurofen_twts = pd.DataFrame([clean_text(tweet.text) for tweet in tweets], columns=['Tweets']) # 输出结果 print(f"成功抓取{len(nurofen_twts)}条推文") print(nurofen_twts.head())
说明
- 使用
tweepy.Client(API v2)适配Basic权限,仅需提供bearer_token即可完成认证。 - 通过
next_token实现分页,每次请求获取最大允许的100条推文,直到达到目标数量或无更多数据。 - 保留了原代码的文本清洗逻辑,确保推文内容整洁。
内容的提问来源于stack exchange,提问作者Chioma Amuwa
相关产品推荐
相关产品推荐

