Tweepy仅返回1条推文问题排查:循环还是API调用故障?
问题分析与解决方案
嘿,我来帮你排查这个问题!你遇到的只返回1条推文的情况,主要是代码里的文件操作、缩进和数据处理逻辑出了问题,不是Twitter API调用或者for循环本身的锅,咱们一步步拆解:
核心问题点
1. 文件打开模式错误,每次循环覆盖原有内容
你在循环内部使用with open('C:/Users/User/Desktop/twittersentiment.csv', 'wb') as f:,这意味着每处理一条推文,就会重新创建并打开这个文件(wb是二进制写入模式,会直接覆盖文件原有内容)。所以哪怕循环跑了200次,最后文件里只会剩下最后一条处理完的推文。
2. 缩进逻辑错误,导致代码执行范围混乱
你的if 'RT' not in status.text:判断后面,只有with open那行属于if块,后续的变量处理、写入操作都不在判断范围内——这会导致不管是不是转推,都会执行写入,而且缩进错误还会让代码逻辑混乱。
3. zip用法错误,写入数据格式不对
你把location、favourites等单个值包装成了列表(比如a = [location]),然后用zip(a,b,c,d),最后把这个zip对象传给writerow。这会导致写入的是嵌套的元组,而不是我们需要的一行四个字段,同时完全没必要用zip来处理单个值。
修正后的代码
import csv import re import tweepy # 这里假设你已经完成了twitterapi的授权初始化步骤 # 将文件打开操作放在循环外部,使用追加模式避免覆盖 with open('C:/Users/User/Desktop/twittersentiment.csv', 'ab') as f: writer = csv.writer(f) # 可选:如果是第一次创建文件,可以先写入表头 # writer.writerow(['User Location', 'Favourites Count', 'Cleaned Tweet', 'Created Date']) # 遍历Cursor返回的最多200条推文 for status in tweepy.Cursor( twitterapi.search, q="labour party", since="2018-05-01", until="2018-05-10" ).items(200): # 跳过转推内容 if 'RT' not in status.text: # 提取所需字段 favourites_count = status.user.favourites_count user_location = status.user.location.encode('utf8') # 清洗推文文本 cleaned_tweet = ' '.join( re.sub( "(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)", " ", status.text.encode('utf8') ).split() ) tweet_date = status.created_at.strftime('%m/%d/%Y') # 直接将字段组成列表写入一行 writer.writerow([user_location, favourites_count, cleaned_tweet, tweet_date])
额外优化提示
如果你使用的是Python 3,建议调整文件打开方式,避免手动编码的麻烦:
with open('C:/Users/User/Desktop/twittersentiment.csv', 'a', newline='', encoding='utf-8') as f: writer = csv.writer(f) # 后续代码可以去掉.encode('utf8'),直接处理字符串即可
另外需要注意:Twitter标准搜索API有一定的限制(比如只能返回最近7天的推文,且有调用频率限制),但你设置的时间范围和items(200)是符合要求的,修正代码后应该能拿到符合条件的非转推推文。
内容的提问来源于stack exchange,提问作者Fuzzorama17
相关产品推荐
相关产品推荐

