Powrót do bloga

Ekstrakcja danych z Twittera za pomocą Pythona

Ekstrakcja danych z Twittera za pomocą Pythona

Twitter to nie tylko rozszerzone źródło wiadomości, to zdecydowanie jedna z najlepszych próbek myśli świata. Z ponad 330 milionami aktywnych użytkowników jest to jedna z najpopularniejszych platform, na których ludzie chętnie dzielą się swoimi przemyśleniami. Dane z Twittera mogą być wykorzystywane do różnych celów, takich jak badania, analizy konsumenckie, analizy demograficzne, i wiele innych.

Dlatego głównym celem tego samouczka jest nauczenie Cię, jak pozyskać próbkę danych z Twittera istotnych dla Twojego projektu lub biznesu.

Przed kontynuowaniem upewnij się, że masz pod ręką wszystkie te zmienne:

  1. Consumer Key
  2. Consumer Secret
  3. Access Token
  4. Access Token Secret

Jeśli chcesz dowiedzieć się, jak uzyskać wyżej wymienione dane, przeczytaj ten wpis na blogu napisany przez mojego kolegę Dattatray Upase.

Teraz czas na kodowanie!

Definiowanie zmiennych wejściowych

Najpierw musisz zdefiniować niektóre zmienne globalne, które będą potrzebne w programie:

Importuję ‘sys’ w celu pobrania argumentów wiersza poleceń, ponieważ mogę chcieć zmienić słowa kluczowe, datę początkową lub końcową. Jako język wybrałem angielski, ale możesz sprawdzić, jakie inne języki są obsługiwane. Wyniki zostaną zapisane w ‘data’ na końcu.

W rezultacie typowe użycie skryptu wyglądałoby następująco:

python script.py start_date end_date keyword

Dostęp do API Twittera
Twitter umożliwia korzystanie ze swojego API poprzez architekturę autoryzacji oauth2. Na swojej stronie internetowej udostępniają dokumentację, za pomocą której można filtrować tweety. Powyższy fragment kodu zaimplementuje to dla Ciebie.

Zmienna req_count określa liczbę przypadków użycia API podczas wykonywania mojego programu. W podanym kodzie napotykam następujący błąd:

TypeError: Unicode-objects must be encoded before hashing

Aby tego uniknąć, zmieniam post_body=”” na post_body=b”” i to rozwiązuje problem.

Użycie i dokumentacja API Twittera

Czas ustawić adres URL API, aby pobrać dane z Twittera. Używam parametru min_faves. Oto wyjaśnienie adresu URL i kilka wskazówek optymalizacyjnych:

‘min_faves’ służy do ustawiania minimalnej liczby polubień, jaką tweet powinien mieć w danych. To bardzo przydatna funkcja, ale nie jest wspomniana w dokumentacji Twitter API.

‘q’ reprezentuje zapytanie lub słowa kluczowe, które chcesz wprowadzić. Tutaj ważne jest, aby upewnić się, że podajesz jak najmniej słów kluczowych. Na przykład wyobraźmy sobie, że chcę tweety o Facebooku i Google. Jeśli podam oba jako słowa kluczowe, powiedzmy FACEBOOK i GOOGLE, zwróci mi to maksymalnie 100 tweetów, ponieważ takie jest ograniczenie. Ale jeśli uruchomię zapytanie dwukrotnie – raz z Facebookiem i raz z Google, mogę uzyskać łącznie 200 tweetów. Krótko mówiąc, lepiej używać jednego słowa kluczowego na zapytanie.

‘lang’ reprezentuje język filtrowanych tweetów. Ponieważ chcę otrzymywać tweety w języku angielskim, ustawiam go na ‘en’.

‘since’ to data początkowa okresu, z którego chcesz szukać tweetów. Ta data początkowa powinna mieścić się w ciągu ostatnich 7 dni. To kolejna funkcja, która nie jest udokumentowana w dokumentacji Twitter API.

‘until’ reprezentuje datę końcową żądanego okresu. Logicznie rzecz biorąc, powinna ona również mieścić się w ciągu ostatnich 7 dni. Nie jest ona również udokumentowana w dokumentacji Twitter API.

‘result_type’ reprezentuje rodzaj tweetów, które chcesz otrzymać. Ma 3 wartości:

‘recent’ zwraca najnowsze tweety, tj. tweety z końca wybranego okresu.

‘popular’ zwraca najpopularniejsze tweety, a co za tym idzie, pomija wiele tweetów. Zawsze otrzymasz tweety z największą liczbą polubień i retweetów. Funkcja min_faves byłaby tutaj bezużyteczna.

‘mixed’ daje mieszankę najnowszych i popularnych tweetów.

‘count’ reprezentuje maksymalną liczbę tweetów w wyniku. Domyślnie ustawiona jest na 15, a maksymalna to 100.

Dzięki mieszanemu result_type i użyciu min_faves, możemy uzyskać maksymalną liczbę tweetów, uruchamiając zapytanie wielokrotnie.

Więcej udokumentowanych funkcji można znaleźć w Dokumentacji API Twittera.

Zapisywanie/Autozapis pobranych danych tweetów

W kolejnym kroku musisz zdefiniować metodę autozapisu/zapisu, która posiada parametr ‘saveOverride’. Ten krok jest po prostu potrzebny, aby usunąć ograniczenie czasowe autozapisu i zapisać plik. Aby to zrobić, tworzę t_last, aby zapisać czas rozpoczęcia programu. Następnie uzyskuję do niego dostęp w programie i sprawdzam, czy minęło 5 minut od t_last (czasu ostatniego zapisu). Jeśli minęło więcej niż 5 minut, oznaczam ‘saveStatus’ jako True.

Następnie sprawdzam ‘saveOverride’, co oznacza po prostu, że muszę wydać programowi instrukcję, aby bez względu na wszystko zapisał plik w tym momencie. W tym celu ustawiam saveStatus na True.

Następnie, jeśli ‘saveStatus’ ma wartość True, skrypt zmieni t_last na aktualny czas. Następnie kod tworzy obiekt słownika i wypisuje “Autozapis o [time]”, abyś wiedział, że dane są automatycznie zapisywane.

Następnie sprawdzam, czy plik wyjściowy już istnieje. Jeśli tak, łączę dane z danymi z już zapisanego pliku. Po połączeniu zapisuję je do tego samego pliku. Jeśli nie istnieje, tworzę nowy plik, a następnie zapisuję do niego dane.

W rezultacie zakodowałem prawie całą funkcjonalność, którą chciałem.

Dalsza optymalizacja

W końcu nadszedł czas na skorzystanie z tych funkcji. Piszę pętlę while(1), co oznacza while(True). To w zasadzie sprawia, że instrukcja działa w nieskończoność, dopóki nie zostanie wywołana instrukcja ‘break’ lub nie zostanie zgłoszony wyjątek.

Najpierw zbieram dane o tweetach w słowniku  ‘d’ za pomocą json.loads co konwertuje dane na format słownika. Następnie uruchamiam try-catch/except na bloku kodu wyodrębniającym statusy z danych. Używam try-catch, ponieważ czasami Twitter API nie zwraca danych, lecz plik JSON zawierający informację o błędzie. Nie chcę, aby mój program zatrzymywał się w takich przypadkach. Chcę również, aby pobierał informację, przy którym numerze żądania to się dzieje, i zapisywał moje dane z Twittera za pomocą polecenia autosave. Twitter pozwala nam na wykonanie 180 żądań na 15 minut. To daje około 12 żądań na minutę lub jedno żądanie co pięć sekund. Na wszelki wypadek dodaję polecenie sleep, aby uśpić program na 5 sekund po wykonaniu jednej iteracji.

Następnie kod wyświetli liczbę tweetów, które skrypt zebrał do tej pory.

W końcu nadszedł czas na główną sztuczkę optymalizacyjną. Testowałem ten skrypt przez prawie tydzień i otrzymałem następującą liczbę tweetów dla każdej wartości min_faves. Mogę uzyskać maksymalnie 100 tweetów na żądanie i chcę uzyskać ich jak najwięcej. Obecnie nie ma zbyt wielu tweetów o wyższych wartościach min_faves, ale chcemy uwzględnić sytuacje, w których być może firma lub słowo kluczowe zyskuje na popularności. Maksymalna wartość min_faves może wynosić 999999.

Wartość min_faves Liczba tweetów
100,000 1
90,000 1
80,000 1
70,000 2
60,000 3
50,000 6
40,000 6
30,000 12
25,000 12

Dlatego używam logiki, która pobierałaby tweety od min_faves o wartości 60000, a następnie zmniejsza ją o 10000 za każdym razem, aż osiągnie 10000. Ale jeśli powiedzmy, słowo kluczowe jest popularne i otrzymam 100 tweetów, gdy pracuję z wartością min_faves wynoszącą 30000, to zwiększy to min_faves do 35000, a następnie ponownie pobrać wyniki. Teraz nowa logika to 5000 zamiast 10000. Jeśli jednak zmiana spadnie poniżej 1000, każę programowi to zignorować i przejść do odejmowania 1000.

Określam stały interwał wynoszący 1000, o który min_faves powinien się zmniejszyć, jeśli min_faves jest mniejsze lub równe 10000.

Na końcu programu poinformuje on o zakończeniu pracy, wyświetlając ‘End’.

Cały kod można znaleźć na GitHub.

To wszystko. W kolejnym samouczku dotyczącym danych z Twittera nauczę Cię, jak pobierać tweety w czasie rzeczywistym za pomocą narzędzia do big data ‘Flume’. Bądź na bieżąco!

author

Akshay Nagpal

Autor · CloudSigma

Preslav Dobrev jest projektantem kreatywnym w CloudSigma, skupiającym się na spójnej tożsamości biznesowej przy wykorzystaniu tradycyjnych i innowacyjnych kanałów marketingowych. Biegle łączy wizję artystyczną ze strategicznym marketingiem, tworząc wywierające wpływ narracje marki.

Komentarze

Brak komentarzy. Bądź pierwszy.