Сбор твитов с использованием экранных имен и Tweepy

У меня есть список экранных имен Twitter (сто), и я хочу собрать 3200 твитов на каждое экранное имя. Но я могу собрать всего 3200 твитов, используя приведенный ниже код, потому что он достиг предела сбора твитов, если я попытался ввести 100 экранных имен ... .. Может ли кто-нибудь предложить собрать 3200 твитов на каждое экранное имя ? Буду очень признателен, если вы поделитесь советом! Заранее спасибо!

import tweepy
import csv

def get_all_tweets(screen_name):


    consumer_key = ****
    consumer_secret = ****
    access_key = ****
    access_secret = ****

    #authorize twitter, initialize tweepy
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    api = tweepy.API(auth, wait_on_rate_limit=True)

    #initialize a list to hold all the tweepy Tweets & list with no retweets
    alltweets = []
    noRT = []

    #make initial request for most recent tweets with extended mode enabled to get full tweets
    new_tweets = api.user_timeline(screen_name = screen_name, tweet_mode = 'extended', count=200, include_retweets=False)

    #save most recent tweets
    alltweets.extend(new_tweets)

    #save the id of the oldest tweet less one
    oldest = alltweets[-1].id - 1

    #keep grabbing tweets until the api limit is reached
    while len(alltweets) <= 3200:
        print("getting tweets before {}".format(oldest))

        #all subsiquent requests use the max_id param to prevent duplicates
        new_tweets = api.user_timeline(screen_name = screen_name,tweet_mode = 'extended', count=200,max_id=oldest, include_retweets=False)

        #save most recent tweets
        alltweets.extend(new_tweets)

        #update the id of the oldest tweet less one
        oldest = alltweets[-1].id - 1

        print("...{} tweets downloaded so far".format(len(alltweets)))

        #removes retweets
    for tweet in alltweets:
        if 'RT' in tweet.full_text:
            continue
        else:
            noRT.append([tweet.id_str, tweet.created_at, tweet.full_text, ])

    #write to csv
    with open('{}_tweets.csv'.format(screen_name), 'w') as f:
        writer = csv.writer(f)
        writer.writerow(["id","created_at","text"])
        writer.writerows(noRT)
        print('{}_tweets.csv was successfully created.'.format(screen_name))
    pass



if __name__ == '__main__':
        #pass in the username of the account you want to download. I have hundred username in the list
        usernames = ["JLo", "ABC", 'Trump']
        for x in usernames:
                  get_all_tweets(x)

person Rachelle    schedule 17.09.2020    source источник


Ответы (1)


Прежде всего, чтобы перебирать временные шкалы, вы должны использовать разбиение на страницы. Я рекомендую вам использовать Cursor в твипи, потому что это намного проще, чем иметь дело с max_id и так далее.

for page in tweepy.Cursor(api.user_timeline,
    screen_name = screen_name,
    tweet_mode="extended",
    include_retweets=False,
    count=100).pages(num_pages = 32):
    for status in page:
        # do your process on status

Во-вторых, действительно существует ограничение скорости, которое вы можете найти здесь, поэтому предупреждение о том, что вы достигли лимита, не является чем-то необычным: https://developer.twitter.com/en/docs/twitter-api/v1/tweets/timelines/faq

person Niel_Eenterm    schedule 17.09.2020