2015-12-12 21 views
9

Korzystam z następującego kodu, aby zebrać tweety dotyczące określonego tematu, ale we wszystkich tweetach, które wypakowałem, atrybut "miejsca" to Brak. czy robię coś źle? Również kod jest przeznaczona do wyodrębnienia istniejących tweety i nie muszę strumieniowe rozwiązanie API i nie szuka tego roztworu streamingu API: https://www.quora.com/How-can-I-get-a-stream-of-tweets-from-a-particular-country-using-Twitter-APINie można uzyskać kraju z tweeta - Twython API

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

Czy pojawia się błąd? Jeśli tak, jaki typ błędu? – kmario23

+0

Brak błędów. Tylko, że atrybut "miejsca" jest pusty! – user3667569

+0

Edytuj swój kod zgodnie z moją odpowiedzią, a następnie powinien działać poprawnie. – kmario23

Odpowiedz

1

Jeśli place pole jest obowiązkowa dla wszystkich tweet, że aplikacja będzie proces, możesz ograniczyć wyszukiwanie w dowolnym miejscu, aby upewnić się, że wszystkie wyniki na pewno go uzyskają.

Można to zrobić, ustawiając parametr geocode (szerokość, długość geograficzna, promień [km/mi]), aby ograniczyć wyszukiwanie w obrębie obszaru.

Przykładem takiego wniosku poprzez Twython jest:

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

Nie działa tak jak w uzyskiwaniu znacznie mniejszych wyników :( – user3667569

+0

Ta odpowiedź nie jest poprawna technicznie Ten filtr zapewnia tylko, że wyniki będą miały większe szanse na przypisanie miejsca. –

+0

Ta odpowiedź jest również niepoprawna, ponieważ 'search/tweet' faktycznie zwraca znaczniki 'place', jednak znacznik' place' jest prawie zawsze pusty Tylko około 1% wszystkich tweetów ma dane w tagu 'place' – Jonas

0

Nie wszystkie tweety mieć wszystkie pola jak tweet_text, miejsce, kraj, język itp

Tak więc, aby uniknąć KeyError używać następujące podejście. Zmodyfikuj swój kod, aby nie znaleziono szukanej wartości key, zwracana jest wartość domyślna.

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

Tutaj Powyższa linia oznacza „szukać klucza country po pobraniu klucza place jeśli istnieje, w przeciwnym razie powrotu None

+0

Dziękuję za odpowiedź, ale jak już napisałem, że nie ma żadnego błędu, to po prostu atrybut miejsca jest BRAK, więc dziękuję, ale to nie będzie pomocne w w tej sprawie: – user3667569

+1

Nie robisz nic złego, musisz zdobyć więcej tweetów Sprawdziłem ~ 50k tweetów, ale udało mi się znaleźć tylko sto pól "miejsca", reszta była "zerowa". pobrał JSON przed przetworzeniem. – kmario23

0

kmario ma rację. Większość tweetów nie ma tych informacji, ale mały procent to robi. Wykonanie wyszukiwania lokalizacji zwiększy tę szansę, np. 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

Krótka odpowiedź brzmi: Nie, nie robisz nic złego. Powodem, dla którego wszystkie znaczniki place są puste, jest statystycznie mało prawdopodobne, aby zawierały dane. Tylko około 1% wszystkich tweetów ma dane w ich tagach place. Dzieje się tak, ponieważ użytkownicy rzadko tweetują swoją lokalizację. Lokalizacja jest domyślnie wyłączona.

Pobierz 100 lub więcej tweetów i prawdopodobnie znajdziesz dane tagów place.