第三节:数据采集基础——Twitter API 入门实战
各位同学,今天我们来聊聊数据采集最核心的一环——Twitter API。说实话,做社交媒体情绪分析,数据就是你的“原油”。没有API,你连一滴油都捞不着。我当年第一次做舆情项目时,光申请API就折腾了两天,踩了不少坑。今天我把这些经验全盘托出,你照着做就行。
核心要点:Twitter API 是连接你与海量推文数据的桥梁。掌握它,你就能实时抓取用户情绪数据。
3.1 Twitter API 到底是什么?
简单说,API 就是一个“中间人”。你写代码告诉它“我要看最近关于‘iPhone 16’的推文”,它就去Twitter服务器上帮你查,然后把结果返回给你。我个人习惯把API理解成一个“点菜员”——你点菜(发请求),它上菜(返回数据)。
Twitter 提供两套主流API:
- v2 API(新版):2020年推出,功能更强大,支持更精细的过滤规则。我现在所有项目都用这个。
- v1.1 API(旧版):稳定但功能有限,部分老项目还在用。如果你是新项目,直接上v2。
为什么会这样?Twitter 在2023年彻底关闭了v1.1的免费层,所以你现在申请默认就是v2。嗯,这里要注意:v2的端点(endpoint)和v1.1完全不同,别拿旧教程硬套。
3.2 申请开发者账号——第一道坎
这一步很多人会卡住。我当初申请时,被要求写500字的使用说明,差点放弃。其实没那么可怕。
流程如下:
- 访问
developer.twitter.com,用你的Twitter账号登录。 - 点击“Apply for a Developer Account”。
- 选择“Academic Research”或“Standard”项目类型。做课程项目选Standard就行。
- 填写用途说明——这里我教你一个技巧:不要只写“我想抓数据”。要具体,比如“分析公众对新能源汽车的情绪变化,用于学术研究”。越具体,通过率越高。
- 等待审核。通常1-3天,我最快一次2小时就过了。
避坑指南:我曾经因为用途说明写得太模糊(就写了“数据分析”四个字),被驳回两次。第三次我详细描述了分析框架、数据用途、是否涉及敏感内容,才通过。记住:Twitter 现在对数据隐私查得很严。
3.3 创建App并获取密钥
账号通过后,就可以创建App了。这一步说白了就是“给你的程序办个身份证”。
操作步骤:
- 在开发者后台点击“Projects & Apps” → “Create App”。
- 给你的App起个名字,比如“SentimentMonitor_v1”。
- 创建成功后,你会看到四个关键密钥:
| 密钥名称 | 用途 | 安全等级 |
|---|---|---|
| API Key | 标识你的App身份 | 中等 |
| API Key Secret | 验证App身份 | 高(不要泄露) |
| Bearer Token | 用于v2 API的简单认证 | 高 |
| Access Token & Secret | 代表用户身份操作 | 极高(仅用于需要用户授权的场景) |
我个人习惯把 Bearer Token 存在环境变量里,代码里直接读取。你想想看,要是把密钥硬编码在代码里,万一上传到GitHub就完蛋了。我见过有人把整个密钥库传到公开仓库,那叫一个惨。
小技巧:创建一个 .env 文件,用 python-dotenv 库加载。这样密钥和代码分离,安全又方便。
3.4 理解API速率限制——别把自己封了
这是新手最容易忽略的点。API速率限制,说白了就是Twitter不让你一次性抓太多数据。它怕你把服务器搞崩了。
v2 API 的主要限制:
- 免费层:每月50万条推文(按项目算)。我刚开始做小规模分析,一个月用5万条都不到,完全够用。
- 请求频率:每15分钟最多300次请求(搜索端点)。超过就返回429错误。
- 并发限制:同一时间最多1个连接。
为什么会这样?Twitter 要保证所有开发者公平使用资源。你想想看,要是有人开100个线程狂刷数据,其他人还玩不玩了?
我教你一个实战技巧:每次请求后检查响应头。Twitter会在响应里告诉你剩余配额:
# 响应头示例
x-rate-limit-limit: 300 # 总配额
x-rate-limit-remaining: 287 # 剩余次数
x-rate-limit-reset: 1694412345 # 重置时间(Unix时间戳)
我曾经在做一个实时监控项目时,没处理速率限制,结果程序跑了20分钟就挂了。后来我加了个简单的“睡眠等待”逻辑:
import time
import requests
def fetch_with_rate_limit(url, headers):
response = requests.get(url, headers=headers)
if response.status_code == 429:
reset_time = int(response.headers.get('x-rate-limit-reset', 0))
wait_time = reset_time - time.time() + 5 # 多等5秒保险
print(f'触发限流,等待 {wait_time:.0f} 秒...')
time.sleep(max(wait_time, 0))
return fetch_with_rate_limit(url, headers) # 重试
return response
核心原则:永远假设你的请求会被限流。提前写好重试逻辑,比出错了再补救强一百倍。
3.5 知识体系总览
下面这张图是我自己总结的Twitter API数据采集流程。你跟着这个路径走,基本不会迷路:
3.6 实战:用Python发第一条请求
光说不练假把式。我们来写个最简单的Demo,抓取最近关于“AI”的5条推文:
import requests
import os
from dotenv import load_dotenv
load_dotenv() # 加载.env文件
bearer_token = os.getenv('TWITTER_BEARER_TOKEN')
def search_tweets(query, max_results=5):
url = 'https://api.twitter.com/2/tweets/search/recent'
headers = {'Authorization': f'Bearer {bearer_token}'}
params = {
'query': query,
'max_results': max_results,
'tweet.fields': 'created_at,public_metrics'
}
response = requests.get(url, headers=headers, params=params)
if response.status_code == 200:
return response.json()
else:
print(f'请求失败: {response.status_code}')
print(response.text)
return None
# 运行
result = search_tweets('AI lang:en', 5)
if result:
for tweet in result['data']:
print(f"推文: {tweet['text'][:50]}...")
print(f"时间: {tweet['created_at']}")
print(f"点赞: {tweet['public_metrics']['like_count']}")
print('---')
提示:第一次运行前,记得在.env文件里填上你的Bearer Token。如果报401错误,八成是密钥配错了。我当年就犯过这个低级错误——把API Key当成Bearer Token用了。
好了,到这里你已经掌握了Twitter API的入门操作。记住:申请账号要耐心,保管密钥要小心,处理限流要细心。这三“心”做到了,数据采集这块你就稳了。
公众号:蓝海资料掘金营,微信deep3321