2015-02-07 11 views
11

Mam listę tweetów, dla których chciałbym pobrać ich treść tekstową. Czy istnieje jakieś proste rozwiązanie, najlepiej za pomocą skryptu Python? Spojrzałem na inne biblioteki, takie jak Tweepy i rzeczy nie wydają się działać tak prosto, a pobieranie ich ręcznie nie wchodzi w grę, ponieważ moja lista jest bardzo długa.Twitter API - pobierz tweety z konkretnym id

+0

Co masz na myśli przez proste? Przepraszam, ale nie ma takiego narzędzia, które będzie wymagać od ciebie wprowadzania tweetów głosowych i pobierania. Musisz napisać, tweepy BTW jest jedną z najłatwiejszych i najlepiej udokumentowanych bibliotek API twitterów. – ZdaR

Odpowiedz

16

Możesz uzyskać dostęp do określonych tweetów według ich identyfikatora za pomocą statuses/show/:id API route. Większość bibliotek Twittera Python podąża za tymi samymi wzorcami lub oferuje przyjazne nazwy dla metod.

Na przykład Twython oferuje kilka show_* metod, w tym Twython.show_status() który pozwala załadować specyficzne tweety:

CONSUMER_KEY = "<consumer key>" 
CONSUMER_SECRET = "<consumer secret>" 
OAUTH_TOKEN = "<application key>" 
OAUTH_TOKEN_SECRET = "<application secret" 
twitter = Twython(
    CONSUMER_KEY, CONSUMER_SECRET, 
    OAUTH_TOKEN, OAUTH_TOKEN_SECRET) 

tweet = twitter.show_status(id=id_of_tweet) 
print(tweet['text']) 

i wrócił słowniku następuje Tweet object definition podany przez API.

tweepy library wykorzystuje tweepy.get_status():

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) 
auth.set_access_token(OAUTH_TOKEN, OAUTH_TOKEN_SECRET) 
api = tweepy.API(auth) 

tweet = api.get_status(id_of_tweet) 
print(tweet.text) 

gdzie zwraca nieco bogatsze obiekt, ale atrybuty na nim ponownie odzwierciedlać opublikowaną API.

+0

Dzięki, bardzo pomocne! Właśnie tego szukałem! – Crista23

3

Udostępnianie mojej pracy, który został znacznie przyspieszony przez poprzednich odpowiedzi (dziękuję). Ten skrypt Python 2.7 pobiera tekst dla tweetów identyfikatorów przechowywanych w pliku. Dostosuj get_tweet_id() dla twojego formatu danych wejściowych; oryginalny skonfigurowany do danych na https://github.com/mdredze/twitter_sandy

''' 
Gets text content for tweet IDs 
''' 

# standard 
from __future__ import print_function 
import getopt 
import logging 
import os 
import sys 
# import traceback 
# third-party: `pip install tweepy` 
import tweepy 

# global logger level is configured in main() 
Logger = None 

# Generate your own at https://apps.twitter.com/app 
CONSUMER_KEY = 'Consumer Key (API key)' 
CONSUMER_SECRET = 'Consumer Secret (API Secret)' 
OAUTH_TOKEN = 'Access Token' 
OAUTH_TOKEN_SECRET = 'Access Token Secret' 

def get_tweet_id(line): 
    ''' 
    Extracts and returns tweet ID from a line in the input. 
    ''' 
    (tagid,_timestamp,_sandyflag) = line.split('\t') 
    (_tag, _search, tweet_id) = tagid.split(':') 
    return tweet_id 

def get_tweets_single(twapi, idfilepath): 
    ''' 
    Fetches content for tweet IDs in a file one at a time, 
    which means a ton of HTTPS requests, so NOT recommended. 

    `twapi`: Initialized, authorized API object from Tweepy 
    `idfilepath`: Path to file containing IDs 
    ''' 
    # process IDs from the file 
    with open(idfilepath, 'rb') as idfile: 
     for line in idfile: 
      tweet_id = get_tweet_id(line) 
      Logger.debug('Fetching tweet for ID %s', tweet_id) 
      try: 
       tweet = twapi.get_status(tweet_id) 
       print('%s,%s' % (tweet_id, tweet.text.encode('UTF-8'))) 
      except tweepy.TweepError as te: 
       Logger.warn('Failed to get tweet ID %s: %s', tweet_id, te.message) 
       # traceback.print_exc(file=sys.stderr) 
     # for 
    # with 

def get_tweet_list(twapi, idlist): 
    ''' 
    Invokes bulk lookup method. 
    Raises an exception if rate limit is exceeded. 
    ''' 
    # fetch as little metadata as possible 
    tweets = twapi.statuses_lookup(id_=idlist, include_entities=False, trim_user=True) 
    for tweet in tweets: 
     print('%s,%s' % (tweet.id, tweet.text.encode('UTF-8'))) 

def get_tweets_bulk(twapi, idfilepath): 
    ''' 
    Fetches content for tweet IDs in a file using bulk request method, 
    which vastly reduces number of HTTPS requests compared to above; 
    however, it does not warn about IDs that yield no tweet. 

    `twapi`: Initialized, authorized API object from Tweepy 
    `idfilepath`: Path to file containing IDs 
    '''  
    # process IDs from the file 
    tweet_ids = list() 
    with open(idfilepath, 'rb') as idfile: 
     for line in idfile: 
      tweet_id = get_tweet_id(line) 
      Logger.debug('Fetching tweet for ID %s', tweet_id) 
      # API limits batch size to 100 
      if len(tweet_ids) < 100: 
       tweet_ids.append(tweet_id) 
      else: 
       get_tweet_list(twapi, tweet_ids) 
       tweet_ids = list() 
    # process rump of file 
    if len(tweet_ids) > 0: 
     get_tweet_list(twapi, tweet_ids) 

def usage(): 
    print('Usage: get_tweets_by_id.py [options] file') 
    print(' -s (single) makes one HTTPS request per tweet ID') 
    print(' -v (verbose) enables detailed logging') 
    sys.exit() 

def main(args): 
    logging.basicConfig(level=logging.WARN) 
    global Logger 
    Logger = logging.getLogger('get_tweets_by_id') 
    bulk = True 
    try: 
     opts, args = getopt.getopt(args, 'sv') 
    except getopt.GetoptError: 
     usage() 
    for opt, _optarg in opts: 
     if opt in ('-s'): 
      bulk = False 
     elif opt in ('-v'): 
      Logger.setLevel(logging.DEBUG) 
      Logger.debug("verbose mode on") 
     else: 
      usage() 
    if len(args) != 1: 
     usage() 
    idfile = args[0] 
    if not os.path.isfile(idfile): 
     print('Not found or not a file: %s' % idfile, file=sys.stderr) 
     usage() 

    # connect to twitter 
    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) 
    auth.set_access_token(OAUTH_TOKEN, OAUTH_TOKEN_SECRET) 
    api = tweepy.API(auth) 

    # hydrate tweet IDs 
    if bulk: 
     get_tweets_bulk(api, idfile) 
    else: 
     get_tweets_single(api, idfile) 

if __name__ == '__main__': 
    main(sys.argv[1:]) 
+0

Próbowałem Twojego kodu, funkcja "status_lookup" nie zwraca żadnej wartości, nie otrzymuję nawet żadnego wyjątku. Czy możesz mi zasugerować, co może być nie tak. – charvi

+0

Wysłałem kod, który próbowałem.
charvi

+1

Nadal działa dla mnie, przetestowany dziś wieczorem. Czy wygenerowałeś klucz tajny klienta, tajny klucz klienta, tajny token i token przysięgi na apps.twitter.com i umieściłeś je w skrypcie? Czy zainstalowałeś tweepy? Czy użyłeś poprawnego identyfikatora tweeta (np. 260244087901413376)? Gdzie opublikowałeś kod? – chrisinmtown

1

nie mam wystarczająco dużo reputacji, aby dodać komentarz rzeczywistego tak niestety jest to droga:

znalazłem bug i dziwną cechę odpowiedzi chrisinmtown :

Co 100th tweet zostanie pominięty z powodu błędu. Oto proste rozwiązanie:

 if len(tweet_ids) < 100: 
      tweet_ids.append(tweet_id) 
     else: 
      tweet_ids.append(tweet_id) 
      get_tweet_list(twapi, tweet_ids) 
      tweet_ids = list() 

Korzystanie jest lepsze, ponieważ działa nawet po przekroczeniu limitu stawki.

api = tweepy.API(auth_handler=auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)