如何使用tweepy在Twitter实现正则匹配搜索抓取含$前缀的推文
基于Tweepy实现全量带$前缀财经标签(Cashtag)的推文采集
现有代码的核心问题
原代码固定检索单条财经标签,且存在三处明显逻辑缺陷:
- 无效嵌套循环:遍历tweet的JSON字段键名,会将同一条推文重复写入采集列表
- 检索范围局限:无法覆盖任意$开头的财经标签内容
- 文本截断风险:默认返回的短文本会丢失长推文中的标签信息
具体实现方案
Twitter搜索接口本身不支持直接传入正则匹配全量Cashtag,采用接口粗搜缩小范围 + 本地正则精筛过滤的两层逻辑即可适配需求,无需修改原有认证、速率限制的配置:
- 调整搜索查询词
不再固定搜索单个$telsa标签,将查询条件设为$ lang:en,直接让接口返回所有英文文本中带$符号的推文,把检索范围从全量英文推文压缩到带$符号的子集,大幅降低无效请求量。 - 配置正则匹配规则
结合真实财经Cashtag的格式($后接连续英文字母,排除文本中表示价格的$+数字类内容),编写通用正则表达式匹配全量符合要求的标签,避免噪音数据混入。 - 修正原有循环逻辑
去掉原代码中遍历tweet字段的无效循环,单条推文直接完成校验、字段提取、入列表的流程,同时开启长文本模式保证获取完整推文内容。
修正后的可运行代码
import re import tweepy import json # 原有auth初始化逻辑保持不变 api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True) data = [] # 通用Cashtag匹配规则:$后接连续英文字母,排除$5、$10这类价格表述 cashtag_re = re.compile(r'\$[A-Za-z]+') # 搜索条件:匹配所有带$的英文推文 search_query = "$ lang:en" # 采集流程 for tweet in api.search(q=search_query, count=100, tweet_mode="extended"): tweet_info = tweet._json # 提取完整长文本,避免截断导致的标签漏检 full_text = tweet_info.get("full_text", tweet_info["text"]) # 本地正则校验,仅保留存在合法Cashtag的推文 if cashtag_re.search(full_text): data.append({ "username": tweet_info["user"]["name"], "text": full_text, "created_at": tweet_info["created_at"], "place": tweet_info["place"] }) print(json.dumps(data, indent=4, sort_keys=True))
可优化的细节
- 正则规则可按需调整:如果需要兼容带数字的衍生品类标签(如
$TSLA240101),可将正则改为r'\$[A-Za-z0-9]+' - 分页采集:如果需要拉取更多历史推文,可替换为
tweepy.Cursor实现自动翻页,无需手动处理接口返回的分页游标 - 标签提取:如果需要在采集结果中附带每条推文中匹配到的具体$标签列表,可调用
cashtag_re.findall(full_text)提取匹配结果,存入采集字典即可
内容的提问来源于stack exchange,提问作者Kiran S youtube channel
相关产品推荐
相关产品推荐

