2015-12-12 15 views
9

Sto utilizzando il codice seguente per raccogliere i tweet relativi a un determinato argomento, ma in tutti i tweet che ho estratto l'attributo 'places' è None. Sto facendo qualcosa di sbagliato? Inoltre, il codice è destinato per estrarre i tweet esistenti e non ho bisogno di streaming soluzione api e non alla ricerca di questa soluzione di streaming di API: https://www.quora.com/How-can-I-get-a-stream-of-tweets-from-a-particular-country-using-Twitter-APIImpossibile ottenere il Paese di un tweet - API Twython

api = Twython(consumer_key, consumer_secret, access_key, access_secret) 

tweets       = [] 
MAX_ATTEMPTS     = 200 
COUNT_OF_TWEETS_TO_BE_FETCHED = 10000 
in_max_id = sys.argv[1] 
next_max_id = '' 
for i in range(0,MAX_ATTEMPTS): 

    if(COUNT_OF_TWEETS_TO_BE_FETCHED < len(tweets)): 
     break # we got 500 tweets... !! 

    #----------------------------------------------------------------# 
    # STEP 1: Query Twitter 
    # STEP 2: Save the returned tweets 
    # STEP 3: Get the next max_id 
    #----------------------------------------------------------------# 

    # STEP 1: Query Twitter 
    if(0 == i): 
     # Query twitter for data. 
     results = api.search(q="#something",count='100',lang='en',max_id=in_max_id,include_entities='true',geo= True) 
    else: 
     # After the first call we should have max_id from result of previous call. Pass it in query. 
     results = api.search(q="#something",include_entities='true',max_id=next_max_id,lang='en',geo= True) 

    # STEP 2: Save the returned tweets 
    for result in results['statuses']: 

     temp = "" 
     tweet_text = result['text'] 
     temp += tweet_text.encode('utf-8') + " " 
     hashtags = result['entities']['hashtags'] 
     for i in hashtags: 
      temp += i['text'].encode('utf-8') + " " 
     print result 
     #temp += i["place"]["country"] + "\n" 
     #output_file.write(temp) 




    # STEP 3: Get the next max_id 
    try: 
     # Parse the data returned to get max_id to be passed in consequent call. 
     next_results_url_params = results['search_metadata']['next_results'] 
     next_max_id  = next_results_url_params.split('max_id=')[1].split('&')[0] 
    except: 
     # No more next pages 
     break 
+0

Hai ricevuto un errore? Se sì, che tipo di errore? – kmario23

+0

Nessun errore. Solo che l'attributo "luoghi" è vuoto! – user3667569

+0

Modifica il codice in base alla mia risposta, quindi dovrebbe funzionare correttamente. – kmario23

risposta

1

Se place campo è un must per tutti i tweet che si app processo, quindi è possibile limitare la ricerca su un posto per assicurarsi che tutto il risultato lo avrà sicuramente.

È possibile farlo impostando il parametro geocode (latitudine, longitudine, raggio [km/mi]), per limitare la ricerca all'interno di un'area.

Un esempio tale richiesta via Twython è:

geocode = '25.032341,55.385557,100mi' 
api.search(q="#something",count='100',lang='en',include_entities='true',geocode=geocode) 
+0

Non funziona come in I'm sta ottenendo risultati in meno :( – user3667569

+0

Questa risposta non è tecnicamente corretta Questo filtro assicura solo che i risultati abbiano più probabilità di assegnare un posto. –

+0

Anche questa risposta non è corretta perché 'search/tweet' restituisce i tag 'place'. Tuttavia, il tag' place' è quasi sempre vuoto. Solo circa l'1% di tutti i tweet ha dati nel tag 'place'. – Jonas

0

Non tutti i tweet hanno tutti i campi come tweet_text, luogo, paese, lingua ecc,

Così, per evitare KeyError utilizzare il seguente approccio. Modifica il tuo codice in modo che quando lo key che stai cercando non venga trovato, viene restituito un valore predefinito.

result.get('place', {}).get('country', {}) if result.get('place') != None else None 

Qui, la riga sopra significa "cercare la chiave country dopo il recupero della chiave place se esiste, altrimenti restituisce None"

+0

Grazie per la risposta, ma come ho scritto che non vi è alcun errore, ma solo che l'attributo place è NONE. Quindi grazie, ma non sarà utile in questo caso – user3667569

+1

Non stai facendo nulla di sbagliato, devi ottenere più tweet. Ho controllato ~ 50k tweets, ma sono riuscito a trovare solo un centinaio di campi "place", il resto era "null". recuperato JSON prima dell'elaborazione. – kmario23

0

kmario è giusto. La maggior parte dei tweet non ha questa informazione, ma una piccola percentuale lo fa. Fare una ricerca di posizione aumenterà questa possibilità, ad es. https://api.twitter.com/1.1/search/tweets.json?q=place%3Acba60fe77bc80469&count=1

"place": { 
    "id": "cba60fe77bc80469", 
    "url": "https://api.twitter.com/1.1/geo/id/cba60fe77bc80469.json", 
    "place_type": "city", 
    "name": "Tallinn", 
    "full_name": "Tallinn, Harjumaa", 
    "country_code": "EE", 
    "country": "Eesti", 
    "contained_within": [], 
    "bounding_box": { 
     "type": "Polygon", 
     "coordinates": [ 
     [ 
      [ 
      24.5501404, 
      59.3518286 
      ], 
      [ 
      24.9262886, 
      59.3518286 
      ], 
      [ 
      24.9262886, 
      59.4981855 
      ], 
      [ 
      24.5501404, 
      59.4981855 
      ] 
     ] 
     ] 
    }, 
    "attributes": {} 
    }, 
1

La risposta breve è, No, non si sta facendo nulla di sbagliato. Il motivo per cui tutti i tag place sono vuoti è perché statisticamente è molto improbabile che contengano dati. Solo l'1% circa di tutti i tweet ha dati nel tag place. Questo perché gli utenti raramente twittano la loro posizione. La posizione è disattivata per impostazione predefinita.

Scarica 100 o più tweet e probabilmente troverai i dati dei tag place.