Twitter流数据拆分异常:如何仅将指定字段追加至CSV文件?
解决Twitter流脚本中普通推文无法正确提取text字段的问题
我太懂你遇到的这种糟心情况了——转推能顺顺当当提取text写入CSV,可普通推文偏偏带着一堆冗余字段混进来,肯定是因为你没区分开普通推文和转推的字段结构,或者出错时的兜底逻辑没写对!
问题根源分析
Twitter API返回的推文对象里,转推和普通推文的字段路径虽然类似,但如果你的代码只处理了转推的情况,或者在普通推文提取字段时触发了异常,就会不小心把整个推文对象(包含Id、created_at等所有属性)写入CSV。比如你可能在代码里只判断了转推的retweeted_status字段,普通推文的提取逻辑要么没写,要么出错后直接把整个对象丢进了CSV。
改进后的代码解决方案
下面是调整后的完整脚本,专门针对普通推文和转推做了字段提取处理,还加了异常兜底避免冗余内容写入:
import tweepy import csv import sys # 你的认证信息 ckey = 'x...' csecret = 'x...' atoken = 'x...' asecret = 'x...' def init_twitter_auth(): auth = tweepy.OAuthHandler(ckey, csecret) auth.set_access_token(atoken, asecret) return auth class FilteredTweetStream(tweepy.StreamListener): def on_status(self, status): try: # 精准提取推文内容:优先处理转推,再处理普通推文 if hasattr(status, 'retweeted_status'): # 转推取原始推文的文本 tweet_content = status.retweeted_status.text else: # 普通推文直接取顶层text字段 tweet_content = status.text # 处理特殊字符编码,避免写入CSV时出错 tweet_content = tweet_content.encode('utf-8').decode('utf-8') # 仅写入需要的text字段到CSV with open('filtered_tweets.csv', 'a', newline='', encoding='utf-8') as csv_file: writer = csv.writer(csv_file) # 如果需要其他字段,比如id或时间,直接在列表里添加即可:[status.id_str, status.created_at, tweet_content] writer.writerow([tweet_content]) except Exception as e: # 出错时只打印错误,跳过这条推文,绝不写入整个对象 print(f"处理推文失败: {str(e)}", file=sys.stderr) return True def on_error(self, status_code): print(f"API请求错误,状态码: {status_code}") if status_code == 420: # 触发API限流时,主动断开流连接 return False if __name__ == '__main__': auth = init_twitter_auth() stream_listener = FilteredTweetStream() tweet_stream = tweepy.Stream(auth=auth, listener=stream_listener) # 替换成你要过滤的关键词 tweet_stream.filter(track=['your_target_keyword'], languages=['en'])
关键优化点
- 区分推文类型:用
hasattr判断是否为转推,分别提取对应路径的text字段,确保普通推文也能精准取值。 - 异常兜底:捕获提取字段时的所有异常,出错时仅打印错误信息并跳过,避免把整个推文对象写入CSV。
- 编码处理:统一处理特殊字符的编码问题,防止写入CSV时出现乱码或格式错误。
- CSV写入优化:添加
newline=''参数,避免Windows系统下生成的CSV出现空行。
内容的提问来源于stack exchange,提问作者Tanmim Hanifa
相关产品推荐
相关产品推荐

