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

如何用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)

问题分析

  1. 首次代码错误原因:Twitter API v2的search_recent_tweets接口单次请求的max_results上限为100,直接设置3316超出限制导致报错。
  2. 修改后代码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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:47:53