You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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')

关键修改说明:

  1. 缩小异常捕获范围:
    原代码把整个循环都放在try块中,只要一个批次出错就会中断所有后续采集。现在我们只对单个批次的API请求做异常捕获,某个批次出错时仅跳过该批次,不影响其他批次的处理。

  2. 使用具体异常而非裸except:
    替换except:为except tweepy.errors.TweepyException,只捕获Tweepy API相关的异常(比如速率限制、无效ID等),避免误捕获其他未知错误(比如语法错误),让调试更精准。

  3. 强制返回列表类型:
    函数最后一定会返回full_tweets列表,即使所有批次都出错,也会返回空列表。这样后续的列表推导式[status._json for status in results]永远不会遇到None,自然不会报错。

另外补充一点:statuses_lookup本身就会自动过滤已删除或不存在的推文,正常情况下不会因为存在无效ID抛出异常——你遇到的异常可能来自其他原因(比如API速率限制、认证问题等),修改后的代码会帮你定位具体出错的批次和原因。

内容的提问来源于stack exchange,提问作者b4kke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:03:41