【问题标题】:How to get tweets on certain dates using Tweepy?如何使用 Tweepy 在特定日期获取推文?
【发布时间】:2020-03-12 16:53:18
【问题描述】:

如何使用 Tweepy 在特定日期获取推文

我写的代码是这样的(jupyter):

import tweepy as tw 
import xlsxwriter
import datetime 
import pandas as pd
consumer_key="#"
consumer_secret="#"
access_key="#"
access_secret="#"
try:
 auth = tw.OAuthHandler(consumer_key, consumer_secret)
 auth.set_access_token(access_key, access_secret)
 auth.get_authorization_url()
 api = tw.API(auth,wait_on_rate_limit=True,wait_on_rate_limit_notify=True,compression=True,retry_count=3,retry_delay=10,timeout=15)
except tw.TweepError:
 print ('Error')

name="mahfiegilmez"

startDate = datetime.datetime(2018, 6, 24, 0, 0, 0)
endDate =   datetime.datetime(2018, 12, 31, 23, 59, 59)

say=0
tweets = []
from time import sleep
tmpTweets = api.user_timeline(name,count=200,tweet_mode="extended",lang="tr")

for tweet in tmpTweets:
        if tweet.created_at < endDate and tweet.created_at > startDate:
            tweets.append(tweet)

lastTweet = tmpTweets[-1].id
while (tmpTweets[-1].created_at > startDate):
    print("Sonraki Tweet @", tmpTweets[-1].created_at,say)

    tmpTweets = api.user_timeline(name,max_id = tmpTweets[-1].id,tweet_mode="extended")
    if lastTweet == tmpTweets[-1].id:
        print("lastTweet")
        sleep(15)
    else:
        for tweet in tmpTweets:
            if tweet.created_at < endDate and tweet.created_at > startDate:
                tweets.append(tweet)
    lastTweet = tmpTweets[-1].id
    say+=1

下一节:

tweets2=[]
tweets.reverse()
for x in tweets:
    if(x.in_reply_to_status_id==None) or (x.in_reply_to_screen_name==name):
        if (not x.retweeted) and ("RT @" not in x.full_text):
            tweets2.append(x)

喜欢:

  • 下一条推文@2019-02-15 13:33:26 1095106703098605568 157
  • 下一条推文@2019-02-11 23:45:58 1094442196500209666 158
  • 下一条推文@ 2019-02-10 03:45:28 1094441678889463809 159
  • 下一条推文@2019-02-10 03:43:24 1094441678889463809 160
  • 下一条推文@2019-02-10 03:43:24 1094441678889463809 161
  • 下一条推文@2019-02-10 03:43:24 1094441678889463809 162
  • 下一条推文@2019-02-10 03:43:24 1094441678889463809 163 .....

我将如何解决这个问题?

最后给出这个错误。

> IndexError                                Traceback (most recent call
> last) <ipython-input-9-46264abdd8ef> in <module>
>       9         tweets.append(tweet)
>      10 
> ---> 11 while (tmpTweets[-1].created_at > startDate):
>      12     print("Last Tweet @", tmpTweets[-1].created_at, " - fetching some more")
>      13     tmpTweets = api.user_timeline(username, max_id = tmpTweets[-1].id)
> 
> IndexError: list index out of range

【问题讨论】:

标签: python twitter tweepy tweets twitterapi-python


【解决方案1】:

一个更好的方法是使用since_idmax_id 参数作为API.user_timeline 方法/GET statuses/user_timeline 端点,而不是在时间之外发出大量不必要的请求来遍历大量推文范围。您还应该考虑改用Cursor

您遇到的错误很可能是因为该帐户自startDate 指定的时间以来拥有超过 3200 条推文。

此方法最多只能返回用户最近的 3,200 条推文。

https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-user_timeline

因此,一旦它通过了最近的 3200 条推文,下一次调用方法/端点将分配一个空列表给 tmpTweets。当您尝试在print 语句中索引tmpTweets 时,它会出错。您的回溯似乎与您的 sn-p 具有不同的代码。如果该打印语句不存在,那么当您尝试在while 条件中索引tmpTweets 时会出错,就像在您的回溯中一样。

【讨论】:

  • 您好,首先感谢您的回复。我重新安排了主题,如果您看一下,我将不胜感激。 3200 条推文限制,因为我知道我正在处理。这段代码可以适应不同的方式吗? 你能用例子解释一下吗?(同时,我找不到光标的详细例子)
  • 这仍然会在您的 if 语句中以相同的方式出错,因为 tmpTweets 将是一个空列表,而不是与之前的请求相同,因为您的 max_id 正在运行超过极限。睡眠也不会做任何事情来缓解这个问题。您可以简单地检查列表是否为空,如果是则跳出循环,例如if not tmpTweets: break。您在分配name 时也会出现缩进错误。我链接的Cursor 的文档有示例:tweepy.readthedocs.io/en/latest/cursor_tutorial.html
猜你喜欢
  • 2015-08-02
  • 2020-12-26
  • 2016-10-20
  • 1970-01-01
  • 2018-09-18
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
相关资源
最近更新 更多