2017-02-02 2 views
0

Cela me rend fou. Comme vous pouvez le voir ci-dessous, je suis en essayant pour utiliser une simple boucle while pour effectuer quelques recherches tweepy et les ajouter dans une trame de données. Pour une raison quelconque cependant, après avoir tiré le premier ensemble de 100 tweets, il répète simplement cet ensemble au lieu d'effectuer une nouvelle recherche. Tout avis serait grandement apprécié.Tweepy Recherche w/While Loop

import sys 
import csv 
import pandas as pd 
import tweepy 
from tweepy import OAuthHandler 

consumer_key = '' 
consumer_secret = '' 
access_token = '' 
access_secret = '' 

auth = OAuthHandler(consumer_key, consumer_secret) 
auth.set_access_token(access_token, access_secret) 

api = tweepy.API(auth) 

num_results = 200 
result_count = 0 
last_id = None 
df = pd.DataFrame(columns=['Name', 'Location', 'Followers', 'Text', 'Coorinates']) 

while result_count < num_results: 
    result = api.search(q='',count=100, geocode= "38.996918,-104.995826,190mi", since_id = last_id) 
    for tweet in result: 
     user = tweet.user 
     last_id = tweet.id_str 
     name = user.name 
     friends = user.friends_count 
     followers = user.followers_count 
     text = tweet.text.encode('utf-8') 
     location = user.location 
     coordinates = tweet.coordinates 
     df.loc[result_count] = pd.Series({'Name':name, 'Location':location, 'Followers':followers, 'Text':text, 'Coordinates':coordinates}) 
     print(text) 
     result_count += 1 

# Save to Excel 
print("Writing all tables to Excel...") 
df.to_csv('out.csv') 
print("Excel Export Complete.") 

Répondre

0

La méthode API.search renvoie les tweets correspondant à une requête spécifiée. Ce n'est pas un APi Streaming, donc il retourne toutes les données à la fois.
En outre, dans vos paramètres de requête, vous avez ajouté count, qui spécifie le nombre d'états à extraire.

Donc le problème est qu'avec votre requête vous retournez les 100 premières données de l'ensemble complet pour chaque itération.

Je vous suggère de changer le code dans quelque chose comme ça

result = api.search(q='', geocode= "38.996918,-104.995826,190mi", since_id = last_id) 
for tweet in result: 
    user = tweet.user 
    last_id = tweet.id_str 
    name = user.name 
    friends = user.friends_count 
    followers = user.followers_count 
    text = tweet.text.encode('utf-8') 
    location = user.location 
    coordinates = tweet.coordinates 
    df.loc[result_count] = pd.Series({'Name':name, 'Location':location, 'Followers':followers, 'Text':text, 'Coordinates':coordinates}) 
    print(text) 

Laissez-moi savoir.

+0

J'ai essayé d'exclure le paramètre 'count' de ma requête de recherche mais cela ne retournerait que 15 résultats. Ma compréhension de la tweepy docs est qu'en incluant le paramètre 'count' je peux prendre cela jusqu'à 100 et ensuite faire 15 demandes pour compiler plus de résultats. Je crois que ces deux limites sont appliquées par l'API Twitter, oui? Je pensais aussi que le paramètre 'since_id' était là pour m'empêcher de tirer encore et encore les mêmes 100 premiers résultats? Je songe à passer au flux pour obtenir les résultats, mais mon but est de rassembler une sélection "aléatoire" de tweets et d'injecter du temps. – bengen343

+0

Désolé pour la réponse tardive, btw, où avez-vous lu environ 15 demandes avec le paramètre count? Peut-être que vous pouvez essayer de supprimer le paramètre since_id puisque renvoie uniquement les statuts avec un ID supérieur à (c'est-à-dire, plus récent que) l'ID spécifié. – Giordano