使用Tweepy statuses_lookup查询推文时如何处理NoneType错误?
我来帮你搞定这个问题!你遇到的TypeError根源很明确:你的lookup_tweets函数在捕获到异常时直接pass,没有返回已经收集到的推文列表,导致results变成了None,后续遍历它自然会报错。另外,其实statuses_lookup本身会自动跳过已删除/不存在的推文ID,不会返回None类型的元素,所以你不需要过滤单个status,关键是修复函数的异常处理逻辑。
修复后的完整代码
import tweepy import json import pandas as pd def lookup_tweets(tweet_IDs, api): full_tweets = [] tweet_count = len(tweet_IDs) # 按Twitter API限制的100条为一批次拆分ID列表 for i in range((tweet_count // 100) + 1): end_loc = min((i + 1) * 100, tweet_count) current_batch = tweet_IDs[i * 100:end_loc] try: # 调用接口,自动忽略已删除/不存在的推文ID batch_tweets = api.statuses_lookup(current_batch, tweet_mode='extended') full_tweets.extend(batch_tweets) except tweepy.TweepException as e: # 打印错误信息方便排查,不中断整个收集流程 print(f"处理第{i+1}批次时出错: {str(e)}") # 直接跳过当前批次,继续处理下一批 continue # 无论是否遇到异常,都返回已收集到的推文列表(空列表也不会触发None错误) return full_tweets results = lookup_tweets(good_tweet_ids_test, api) # 先判断是否有有效推文,再执行后续序列化操作 if results: temp = json.dumps([status._json for status in results]) newdf = pd.read_json(temp, orient='records') newdf.to_json('tweepy_tweets.json') print(f"成功保存{len(results)}条有效推文") else: print("没有获取到任何有效推文")
关键修改点说明
- 缩小异常处理范围:把
try-except从包裹整个循环改成包裹单个批次的查询。这样某个批次触发异常(比如API速率限制、网络问题)时,只会跳过该批次,不会导致整个函数返回None。 - 捕获具体异常:放弃裸
except,改用tweepy.TweepException捕获API相关的错误,既能避免误捕获其他类型的错误(比如语法错误),还能打印错误信息帮你排查问题。 - 确保函数始终返回列表:函数最后一定会返回
full_tweets列表——哪怕没有收集到任何推文,返回的也是空列表,绝不会是None,彻底解决遍历None的错误。 - 添加空值判断:在处理结果前先检查
results是否为空,避免做无用的序列化操作,还能给你明确的提示。
补充小知识
api.statuses_lookup本身就会自动过滤无效ID:如果你传入的ID列表里有已删除、私密或不存在的推文,它只会返回那些存在的推文对象,不会包含None元素。比如你传100个ID,其中30个无效,接口会直接返回70个有效推文组成的列表,你完全不用手动过滤单个status。
这样修改后,你的代码就能稳定运行,自动跳过无效批次和已删除推文,顺利收集并保存有效数据啦!
内容的提问来源于stack exchange,提问作者b4kke
相关产品推荐
相关产品推荐

