如何在Tweepy的statuses_lookup中忽略NoneType错误
解决Tweepy statuses_lookup返回None导致的TypeError问题
你的问题根源在于原函数的异常处理逻辑:当某个批次的请求触发异常时,except块直接pass,函数没有返回任何值,默认返回None。后续遍历results时自然就会抛出TypeError: 'NoneType' object is not iterable。
我们需要调整函数的异常处理逻辑,确保无论是否出现异常,函数都返回一个列表,同时避免单个批次的异常中断整个采集流程。下面是修改后的完整代码:
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) batch_ids = tweet_IDs[i * 100:end_loc] try: # 请求当前批次的推文,API会自动过滤已删除/不存在的推文 batch_tweets = api.statuses_lookup(batch_ids, tweet_mode='extended') full_tweets.extend(batch_tweets) except tweepy.errors.TweepyException as e: # 打印错误信息帮助排查,也可以替换为日志记录 print(f"处理第{i+1}批次时出错: {str(e)}") # 跳过当前异常批次,继续处理下一批 continue # 确保函数始终返回列表(空列表或有效推文列表) return full_tweets # 后续调用逻辑保持不变 results = lookup_tweets(good_tweet_ids_test, api) temp = json.dumps([status._json for status in results]) newdf = pd.read_json(temp, orient='records') newdf.to_json('tweepy_tweets.json')
关键修改说明:
缩小异常捕获范围:
原代码把整个循环都放在try块中,只要一个批次出错就会中断所有后续采集。现在我们只对单个批次的API请求做异常捕获,某个批次出错时仅跳过该批次,不影响其他批次的处理。使用具体异常而非裸except:
替换except:为except tweepy.errors.TweepyException,只捕获Tweepy API相关的异常(比如速率限制、无效ID等),避免误捕获其他未知错误(比如语法错误),让调试更精准。强制返回列表类型:
函数最后一定会返回full_tweets列表,即使所有批次都出错,也会返回空列表。这样后续的列表推导式[status._json for status in results]永远不会遇到None,自然不会报错。
另外补充一点:statuses_lookup本身就会自动过滤已删除或不存在的推文,正常情况下不会因为存在无效ID抛出异常——你遇到的异常可能来自其他原因(比如API速率限制、认证问题等),修改后的代码会帮你定位具体出错的批次和原因。
内容的提问来源于stack exchange,提问作者b4kke
相关产品推荐
相关产品推荐

