2017-07-06 6 views
0

J'essaie de prendre tous les tweets ouverts dans un hashtag, mais mon code ne va pas plus loin que 299 tweets. J'essaie également de prendre des tweets d'une ligne de temps spécifique comme les tweets seulement en mai 2015 et juillet 2016. Y a-t-il un moyen de le faire dans le processus principal ou devrais-je écrire un peu de code pour cela?comment prendre tous les tweets dans un hashtag avec tweepy?

Voici mon code:

# if this is the first time, creates a new array which 
# will store max id of the tweets for each keyword 
if not os.path.isfile("max_ids.npy"): 
    max_ids = np.empty(len(keywords)) 
    # every value is initialized as -1 in order to start from the beginning the first time program run 
    max_ids.fill(-1) 
else: 
    max_ids = np.load("max_ids.npy") # loads the previous max ids 

# if there is any new keywords added, extends the max_ids array in order to correspond every keyword 
if len(keywords) > len(max_ids): 
    new_indexes = np.empty(len(keywords) - len(max_ids)) 
    new_indexes.fill(-1) 
    max_ids = np.append(arr=max_ids, values=new_indexes) 

count = 0 
for i in range(len(keywords)): 
    since_date="2015-01-01" 
    sinceId = None 
    tweetCount = 0 
    maxTweets = 5000000000000000000000 # maximum tweets to find per keyword 
    tweetsPerQry = 100 
    searchQuery = "#{0}".format(keywords[i]) 
    while tweetCount < maxTweets: 
     if max_ids[i] < 0: 
       if (not sinceId): 
        new_tweets = api.search(q=searchQuery, count=tweetsPerQry) 
       else: 
        new_tweets = api.search(q=searchQuery, count=tweetsPerQry, 
              since_id=sinceId) 
     else: 
       if (not sinceId): 
        new_tweets = api.search(q=searchQuery, count=tweetsPerQry, 
              max_id=str(max_ids - 1)) 
       else: 
        new_tweets = api.search(q=searchQuery, count=tweetsPerQry, 
              max_id=str(max_ids - 1), 
              since_id=sinceId) 
     if not new_tweets: 
      print("Keyword: {0}  No more tweets found".format(searchQuery)) 
      break 
     for tweet in new_tweets: 
      count += 1 
      print(count) 

      file_write.write(
         . 
         . 
         . 
         ) 

      item = { 
       . 
       . 
       . 
       . 
       . 
      } 

      # instead of using mongo's id for _id, using tweet's id 
      raw_data = tweet._json 
      raw_data["_id"] = tweet.id 
      raw_data.pop("id", None) 

      try: 
       db["Tweets"].insert_one(item) 
      except pymongo.errors.DuplicateKeyError as e: 
       print("Already exists in 'Tweets' collection.") 
      try: 
       db["RawTweets"].insert_one(raw_data) 
      except pymongo.errors.DuplicateKeyError as e: 
       print("Already exists in 'RawTweets' collection.") 

     tweetCount += len(new_tweets) 
     print("Downloaded {0} tweets".format(tweetCount)) 
     max_ids[i] = new_tweets[-1].id 

np.save(arr=max_ids, file="max_ids.npy") # saving in order to continue mining from where left next time program run 
+0

S'il vous plaît simplifier le code au minimum possible pour illustrer votre problème. Beaucoup trop de passe-partout n'est pas lié à la question. –

+0

Modifié. Merci pour l'avertissement. –

Répondre

0

Vérifier twitter documentation api, probablement il permet à seulement 300 tweets à analyser. Je recommanderais d'oublier api, faites-le avec des demandes de streaming. L'API est une implémentation de requêtes avec des limitations.

+0

Avez-vous des suggestions pour le streaming? Aussi, puis-je prendre de vieilles données en streaming? –

0

Jetez un oeil à ceci: https://tweepy.readthedocs.io/en/v3.5.0/cursor_tutorial.html

Et essayez ceci:

import tweepy 

auth = tweepy.OAuthHandler(CONSUMER_TOKEN, CONSUMER_SECRET) 
api = tweepy.API(auth) 

for tweet in tweepy.Cursor(api.search, q='#python', rpp=100).items(): 
    # Do something 
    pass 

Dans votre cas, vous avez un nombre maximum de tweets pour obtenir, de façon par le tutoriel lié que vous pourriez faire:

import tweepy 

MAX_TWEETS = 5000000000000000000000 

auth = tweepy.OAuthHandler(CONSUMER_TOKEN, CONSUMER_SECRET) 
api = tweepy.API(auth) 

for tweet in tweepy.Cursor(api.search, q='#python', rpp=100).items(MAX_TWEETS): 
    # Do something 
    pass 

Si vous voulez des tweets après un ID donné, vous pouvez également transmettre cet argument.

+0

pour moi dans la gamme (len (mots-clés)): pour tweet dans tweepy.Cursor (api.search, q = '# python', rpp = 100) .items(): l'a fait comme ça, mais ne va pas encore plus loin puis 299 tweet ... –

+0

Pouvez-vous essayer mon exemple tel quel, distinct de votre code. Est-ce que vous allez seulement à 299 tweets? J'ai testé mon extrait et il va jusqu'à 1000 tweets avant de l'arrêter manuellement. –

+0

Va jusqu'à 100 tweets seulement dans mon code et s'arrête automatiquement. –

0

Désolé, je ne peux pas répondre dans les commentaires, trop longtemps. :)

Bien sûr :) Vérifiez cet exemple: avancée recherché mot-clé #data 2015 peut - 2016 juillet Vous avez cette url: https://twitter.com/search?l=&q=%23data%20since%3A2015-05-01%20until%3A2016-07-31&src=typd

session = requests.session() 
keyword = 'data' 
date1 = '2015-05-01' 
date2 = 2016-07-31 
session.get('https://twitter.com/search?l=&q=%23+keyword+%20since%3A+date1+%20until%3A+date2&src=typd', streaming = True) 

Maintenant, nous avons tous les tweets demandés, probablement vous pourriez ont des problèmes avec 'pagination' url pagination ->

https://twitter.com/i/search/timeline?vertical=news&q=%23data%20since%3A2015-05-01%20until%3A2016-07-31&src=typd&include_available_features=1&include_entities=1&max_position=TWEET-759522481271078912-759538448860581892-BD1UO2FFu9QAAAAAAAAETAAAAAcAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&reset_error_state=false

Probablement vous co Uld mettre un tweet aléatoire, ou vous pouvez analyser d'abord, ou demande des données de twitter. Ça peut être fait.

Utilisez l'onglet réseau de Chrome pour trouver toutes les informations demandées :)