【问题标题】:Tweepy not returning full tweet: tweet_mode = 'extended' not workingTweepy 没有返回完整的推文:tweet_mode = 'extended' 不起作用
【发布时间】:2020-08-14 02:12:05
【问题描述】:

您好,我正在尝试使用 tweepy 抓取某个用户的推文。 这是我的代码:

tweets = []
username = 'example'
count = 140 #nb of tweets
try: 
    # Pulling individual tweets from query
    for tweet in api.user_timeline(id=username, count=count, include_rts = False):
    # Adding to list that contains all tweets
      tweets.append((tweet.text))
except BaseException as e:
      print('failed on_status,',str(e))
      time.sleep(3)

我遇到的问题是推文返回时未完成,最后带有“...”。

我想我已经查看了堆栈溢出和其他地方的所有其他类似问题,但没有任何效果。大多数人都不关心我,因为我不处理转发

我尝试将tweet_mode = 'extended' 和/或tweet.full_texttweet._json['extended_tweet']['full_text'] 放在不同的组合中。

我没有收到错误消息,但没有任何效果,只是一个空列表作为回报。 而且看起来文档已经过时了,因为它没有说明“tweet_mode”和“include_rts”参数:

有没有人设法获得每条推文的全文?我真的被这个看似简单的问题所困扰并且正在失去我的头发所以我会很感激任何建议:D 提前谢谢!!!

【问题讨论】:

    标签: python string list twitter tweepy


    【解决方案1】:

    TL;DR:您很可能遇到了速率限制问题。并使用full_text 属性。

    长版:

    1. 首先,

      我遇到的问题是推文返回时未完成,末尾带有“...”。

      根据Extended Tweets 上的 Tweepy 文档,这是预期的:

      兼容模式

      ... 还可以看出 Status 对象的text 属性被截断,因为它将以省略号字符、空格和缩短的自固定链接 URL 为后缀到推文。

    2. 看起来文档已经过时了,因为它没有说明“tweet_mode”和“include_rts”参数:

      他们没有明确将其添加到每个方法的文档中,但是,他们指定 tweet_mode is added as a param:

      标准 API 方法

      任何返回状态对象的tweepy.API 方法都接受一个新的tweet_mode 参数。此参数的有效值为 compatextended ,它们分别提供兼容模式和扩展模式。默认模式(如果没有提供参数)是兼容模式。

    3. 所以如果没有在通话中添加tweet_mode,您会收到带有部分文字的推文吗?有了它,你得到的只是一个空列表?如果您删除它并立即重试,请确认您仍然得到一个空列表。即,一旦你得到一个空列表结果,检查你是否继续得到一个空列表,即使你将参数改回有效的参数。

      基于bug #1329 - API.user_timeline sometimes returns an empty list - 这似乎是一个速率限制问题:

      Harmon758评论on Feb 13

      此 API 限制将表现为您所描述的问题。

    4. 即使它工作正常,它也在full_text 属性中,而不是通常的text。所以这条线

      tweets.append((tweet.text))
      

      应该是

      tweets.append(tweet.full_text)
      

      (你可以跳过额外的 ()


    • 顺便说一句,如果您对转发不感兴趣,请参阅this example 了解处理它们的正确方法:

      给定现有的tweepy.API 对象和id 用于推文,以下可用于打印推文的全文,或者如果它是转推,则可以使用转推推文的全文:

      status = api.get_status(id, tweet_mode="extended")
      try:
          print(status.retweeted_status.full_text)
      except AttributeError:  # Not a Retweet
          print(status.full_text)
      

      如果status 是转推,status.full_text 可能会被截断。

    【讨论】:

    • 谢谢你,这是一个非常完整的答案,我会查看所有这些内容并回复你!
    • 我认为你可能是对的,因为它是一个 API 限制(不是我完全理解这个概念)。我又试了一次,它似乎同时适用于 .full_text 和 tweet_mode='extended'。但是随着更多的测试,它又返回一个空列表。我真的不明白如何解决这个问题......
    • 这不是你可以“解决”的问题。 Twitter 正在限制您进行数据挖掘/ddos'ing 的速率。在此处阅读更多相关信息:developer.twitter.com/en/docs/basics/rate-limiting。由于您处于 15 分钟的存储桶中,因此最快的解决方法是在所有操作之前启动一个计时器,当您第一次收到空列表响应时,请等待剩余的 15 分钟,然后再发送下一个请求。 TBH,这是一个非常愚蠢的解决方案。不幸的是,Tweepy 似乎不允许您访问包含该信息的响应标头。因此,您无法检查页面上提到的内容。可选...
    • ...可选地,您可以使用 Streaming API,其中包括 Rate-Limit 检查,但可能具有相同的限制。
    • 啊,好的,谢谢,我明白了。我可以试试直播!
    【解决方案2】:

    根据 twitter API v2:

    tweet_mode 根本不起作用。您需要添加expansions=referenced_tweets.id。然后在响应中搜索includes。您可以在包含中找到所有截断的推文作为完整推文。您仍然会看到被截断的推文作为回应,但不用担心。

    【讨论】:

      猜你喜欢
      • 2018-06-17
      • 1970-01-01
      • 2021-03-28
      • 2022-08-11
      • 2017-03-29
      • 2018-06-13
      • 2019-12-14
      • 2014-10-24
      • 2018-04-23
      相关资源
      最近更新 更多