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

Twitter API限额下批量拉取推文指标及定时存储实现咨询

适配需求的完整实现代码

执行以下命令安装所需依赖:
pip install pandas requests schedule

修改后完整代码

import json
import pandas as pd
import requests
import schedule
import time
from datetime import datetime

# 按固定大小拆分列表的工具函数
def split_list(lst, chunk_size):
    return [lst[i:i+chunk_size] for i in range(0, len(lst), chunk_size)]

# 接收一批ID生成对应请求URL
def create_url(ids_batch):
    tweet_fields = "tweet.fields=public_metrics"
    ids_str = "ids=" + ",".join(ids_batch)
    url = f"https://api.twitter.com/2/tweets?{ids_str}&{tweet_fields}"
    return url

def bearer_oauth(r):
    # 此处可替换为你自己的Bearer Token
    r.headers["Authorization"] = f"Bearer {'AAAAAAAAAAAAAAAAAAAAAN%2B7QwEAAAAAEG%2BzRZkmZ4HGizsKCG3MkwlaRzY%3DOwuZeaeHbeMM1JDIafd5riA1QdkDabPiELFsguR4Zba9ywzzOQ'}"
    r.headers["User-Agent"] = "v2TweetLookupPython"
    return r

def connect_to_endpoint(url):
    response = requests.request("GET", url, auth=bearer_oauth)
    print(f"请求状态码:{response.status_code}")
    if response.status_code != 200:
        raise Exception(
            f"请求报错:{response.status_code} {response.text}"
        )
    return response.json()

# 读取数据集里的所有推文ID
def load_all_tweet_ids():
    tweets_data_path = 'dataset.txt'
    tweets_data = []
    with open(tweets_data_path, "r", encoding="utf-8") as f:
        for line in f:
            try:
                tweet = json.loads(line)
                tweets_data.append(tweet)
            except:
                continue
    df = pd.DataFrame.from_dict(pd.json_normalize(tweets_data), orient='columns')
    return df['id'].astype(str).tolist()

def main():
    print(f"开始执行任务,当前时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    # 加载所有ID
    all_ids = load_all_tweet_ids()
    # 按接口上限拆分为每100个ID一批
    id_batches = split_list(all_ids, 100)
    all_results = []
    
    # 分批请求
    for idx, batch in enumerate(id_batches):
        print(f"正在请求第{idx+1}/{len(id_batches)}批数据")
        url = create_url(batch)
        json_response = connect_to_endpoint(url)
        all_results.extend(json_response.get('data', []))
        # 避免请求频率过高,可根据自己的API配额调整等待时间
        time.sleep(1)
    
    # 结果存储到txt,文件名带当前日期避免覆盖历史数据
    save_path = f"tweet_metrics_{datetime.now().strftime('%Y%m%d')}.txt"
    with open(save_path, "w", encoding="utf-8") as f:
        for item in all_results:
            f.write(json.dumps(item, ensure_ascii=False) + "\n")
    print(f"任务执行完成,结果已存储到{save_path}")

if __name__ == "__main__":
    # 配置每日零点执行任务
    schedule.every().day.at("00:00").do(main)
    print("定时任务已启动,将在每日零点自动执行")
    # 首次启动可以先执行一次任务测试,不需要可以注释掉该行
    main()
    # 常驻进程等待定时触发
    while True:
        schedule.run_pending()
        time.sleep(60)

核心功能说明

  • 分批请求:自动将所有推文ID按100个为一组拆分,依次调用接口,完全适配Twitter v2接口的查询上限
  • 定时执行:引入schedule库配置每日零点自动触发任务,进程保持后台运行即可持续生效
  • 结果存储:每次执行的结果按当天日期命名存储,不会覆盖历史数据,每一行对应一条推文的指标数据
  • 异常兼容:读取原始数据集时自动跳过格式错误的行,请求间隔加了1秒等待避免触发接口频率限制,可根据自己的API配额灵活调整间隔时间

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:54:02