Одна вещь, которая нравится разработчикам Python, – это огромное количество ресурсов, разработанных его большим сообществом. Интерфейсы программирования приложений (API), созданные на Python, – обычное дело для веб-сайтов. Трудно представить, что какой-либо популярный веб-сервис не создал бы библиотеку API для облегчения доступа к своим сервисам.
В этой статье блога мы сконцентрируемся на Twitter API, покажем, как настройка ваших учетных данных происходит с Twitter, и сравним несколько оболочек Python на основе взаимодействия с сообществом. Затем мы покажем несколько примеров использования Twitter API для поиска твитов и создания потока твитов в реальном времени по определенной теме. Наконец, мы исследуем сохраненные данные.
Обзор API Twitter
На платформе Twitter есть множество API-интерфейсов, с которыми могут взаимодействовать разработчики программного обеспечения, с максимальной возможностью создания полностью автоматизированных систем, которые будут взаимодействовать с Twitter. Хотя эта функция может принести пользу компаниям, черпая идеи из данных Twitter, она также подходит для небольших проектов, исследований и развлечений. Вот несколько наиболее заметных API, предоставляемых Twitter:
- Твиты: поиск, публикация, фильтрация, взаимодействие, потоковая передача и т.д.
- Реклама: управление кампанией и аудиторией, аналитика.
- Прямые сообщения (все еще в бета-версии): отправка и получение, прямые ответы, приветственные сообщения и т.д.
- Учетные записи и пользователи (бета): управление учетными записями, взаимодействие с пользователями.
- Медиа: загрузка и доступ к фотографиям, видео и анимированным GIF-файлам.
- Тенденции: актуальные темы в определенном месте.
- Гео: информация об известных местах или местах рядом с местоположением.
API-интерфейсы Twitter предоставляют гораздо больше возможностей, которые не включены в этот список. Twitter также постоянно расширяет спектр своих услуг, время от времени добавляя новые API и обновляя существующие.
Получение учетных данных
Перед использованием Twitter API вам сначала понадобится учетная запись Twitter и некоторые учетные данные. Процесс получения учетных данных со временем может измениться, но в настоящее время он выглядит следующим образом:
- Нажмите кнопку «Создать новое приложение», введите данные и согласитесь с Условиями использования.
- Перейдите в раздел «Ключи и токены доступа» и запишите свой потребительский ключ и секрет.
- В том же разделе нажмите кнопку «Создать мой токен доступа».
- Запишите свой токен доступа и секрет токена доступа.
И это все. Ключ потребителя используется для аутентификации приложения, использующего Twitter API, а токен доступа аутентифицирует пользователя. Все эти параметры следует рассматривать как пароли и не включать в код в виде обычного текста. Один из подходящих способов – сохранить их в файле JSON «twitter_credentials.json» и при необходимости загрузить эти значения из кода.
import json
# Enter your keys/secrets as strings in the following fields
credentials = {}
credentials['CONSUMER_KEY'] = ...
credentials['CONSUMER_SECRET'] = ...
credentials['ACCESS_TOKEN'] = ...
credentials['ACCESS_SECRET'] = ...
# Save the credentials object to file
with open("twitter_credentials.json", "w") as file:
json.dump(credentials, file)
Python-оболочки
Python – один из языков программирования с наибольшим количеством разработанных оболочек для Twitter API. Поэтому их сложно сравнивать, если вы не использовали каждый из них какое-то время. Возможно, хороший способ выбрать правильный инструмент – это изучить их документацию и посмотреть на возможности, которые они предлагают, и на то, как они подходят к специфике вашего приложения.
В этой части мы сравним различные обертки API, используя участие сообщества Python в их проектах GitHub. Вот несколько подходящих показателей для сравнения: количество участников, количество полученных звезд, количество наблюдателей, зрелость библиотеки за период времени с момента первого выпуска и т.д.
Таблица 1: Библиотеки Python для Twitter API, упорядоченные по количеству полученных звезд.
| Библиотека | # участников | # звезды | # наблюдателей | Время |
| tweepy | 135 | 4732 | 249 | ~ 8,5 лет |
| Инструменты Python для Twitter | 60 | 2057 | 158 | ~ 7 лет |
| python-twitter | 109 | 2009 | 148 | ~ 5 лет |
| twython | 73 | 1461 | 100 | NA |
| TwitterAPI | 15 | 424 | 49 | ~ 4,5 года |
| TwitterПоиск | 8 | 241 | 29 | ~ 4,5 года |
В приведенной выше таблице перечислены некоторые из самых популярных библиотек Python для API Twitter. Теперь давайте воспользуемся одним из них для поиска твитов, сбора данных и исследования.
Примеры
Мы выбрали библиотеку twython из-за ее разнообразных функций, связанных с различными API-интерфейсами Twitter, ее зрелости – хотя информации о том, когда была опубликована ее первая версия, нет, есть информация, что версия 2.6.0 появилась около 5 лет назад, и ее поддержка потоковой передачи. В нашем первом примере мы будем использовать Search API для поиска твитов, содержащих строку «learn python», а позже мы покажем более реалистичный пример с использованием Twitter Streaming API.
API поиска
В этом примере мы создадим запрос для Search API с ключевым словом для поиска «learn python», который вернет самые популярные общедоступные твиты за последние 7 дней.
Обратите внимание, что, поскольку наше ключевое слово состоит из двух слов, «learn» и «python», они оба должны появиться в тексте твита, и не обязательно в виде непрерывной фразы. Сначала установим библиотеку. Самый простой способ – использовать pip, но другие параметры также перечислены в документации по установке.
$ pip install twython
На следующем шаге мы импортируем класс Twython, создадим его объект и создадим наш поисковый запрос. Мы будем использовать только четыре аргумента в запросе: q, result_type, count и lang соответственно для ключевого слова поиска, типа, count и языка результатов. Twitter также определяет другие аргументы для точной настройки поискового запроса.
# Import the Twython class
from twython import Twython
import json
# Load credentials from json file
with open("twitter_credentials.json", "r") as file:
creds = json.load(file)
# Instantiate an object
python_tweets = Twython(creds['CONSUMER_KEY'], creds['CONSUMER_SECRET'])
# Create our query
query = {'q': 'learn python',
'result_type': 'popular',
'count': 10,
'lang': 'en',
}
Наконец, мы можем использовать наш объект Twython для вызова метода поиска, который возвращает словарь search_metadata и статусов – запрошенные результаты. Мы рассмотрим только часть статусов и сохраним часть всей информации в фреймворке pandas, чтобы представить ее в таблице.
import pandas as pd
# Search tweets
dict_ = {'user': [], 'date': [], 'text': [], 'favorite_count': []}
for status in python_tweets.search(**query)['statuses']:
dict_['user'].append(status['user']['screen_name'])
dict_['date'].append(status['created_at'])
dict_['text'].append(status['text'])
dict_['favorite_count'].append(status['favorite_count'])
# Structure data in a pandas DataFrame for easier manipulation
df = pd.DataFrame(dict_)
df.sort_values(by='favorite_count', inplace=True, ascending=False)
df.head(5)
| Дата | favorite_count | Текст | Пользователь | |
|---|---|---|---|---|
| 1 | Пт 12 янв 21:50:03 +0000 2018 | 137 | 2017 год был годом Python. Мы собирались уехать … | Codecademy |
| 3 | Пн 08 янв 23:01:40 +0000 2018 | 137 | Пошаговое руководство по изучению #Python для #DataS … | KirkDBorne |
| 4 | Пн 08 янв 11:13:02 +0000 2018 | 109 | Resetter — это новый инструмент, написанный на Python и п … | linuxfoundation |
| 8 | Сб 06 янв 16:30:06 +0000 2018 | 96 | Мы с гордостью сообщаем, что на этой неделе у нас … | DataCamp |
| 2 | Вс 07 янв 19:00:36 +0000 2018 | 94 | Изучите программирование на Python с помощью … | скромный |
Итак, мы получили несколько интересных твитов. Обратите внимание, что это самые популярные твиты, содержащие слова «учиться» и «питон» за последние 7 дней. Чтобы просмотреть данные в истории, вам необходимо приобрести план Search API Premium или Enterprise.
Потоковый API
В то время как в предыдущем примере был показан одноразовый поиск, более интересным случаем будет сбор потока твитов. Это делается с помощью API потоковой передачи Twitter, и Twython предлагает простой способ сделать это с помощью класса TwythonStreamer. Нам нужно будет определить класс MyStreamer, который наследует TwythonStreamer, а затем переопределить методы on_success и on_error следующим образом.
Метод on_success вызывается автоматически, когда twitter отправляет нам данные, а on_error – всякий раз, когда возникает проблема с API (чаще всего из-за ограничений API Twitter). Добавленный метод save_to_csv – полезный способ сохранять твиты в файл.
Как и в предыдущем примере, мы не будем сохранять все данные в твите, а будем сохранять только интересующие нас поля, такие как: используемые хэштеги, имя пользователя, местоположение пользователя и текст самого твита.
В твите много интересной информации, так что не стесняйтесь экспериментировать с ним. Обратите внимание, что мы сохраним местоположение твита в профиле пользователя, которое может не соответствовать текущему или реальному местоположению пользователя, отправившего твит. Это связано с тем, что лишь небольшая часть пользователей Twitter указывает свое текущее местоположение – обычно в ключе координат данных твита.
from twython import TwythonStreamer
import csv
# Filter out unwanted data
def process_tweet(tweet):
d = {}
d['hashtags'] = [hashtag['text'] for hashtag in tweet['entities']['hashtags']]
d['text'] = tweet['text']
d['user'] = tweet['user']['screen_name']
d['user_loc'] = tweet['user']['location']
return d
# Create a class that inherits TwythonStreamer
class MyStreamer(TwythonStreamer):
# Received data
def on_success(self, data):
# Only collect tweets in English
if data['lang'] == 'en':
tweet_data = process_tweet(data)
self.save_to_csv(tweet_data)
# Problem with the API
def on_error(self, status_code, data):
print(status_code, data)
self.disconnect()
# Save each tweet to csv file
def save_to_csv(self, tweet):
with open(r'saved_tweets.csv', 'a') as file:
writer = csv.writer(file)
writer.writerow(list(tweet.values()))
Следующее, что нужно сделать, это создать экземпляр объекта класса MyStreamer с нашими учетными данными, переданными в качестве аргументов, и мы будем использовать метод фильтра только для сбора интересующих нас твитов.
Мы создадим наш фильтр с аргументом track, который предоставляет ключевые слова фильтра, в нашем случае «питон». Помимо аргумента отслеживания, есть больше возможностей для точной настройки вашего фильтра, перечисленного в основных параметрах потоковой передачи, таких как: сбор твитов от выбранных пользователей, языков, местоположений и т.д. Платные версии Streaming API предоставят гораздо больше возможностей фильтрации.
# Instantiate from our streaming class
stream = MyStreamer(creds['CONSUMER_KEY'], creds['CONSUMER_SECRET'],
creds['ACCESS_TOKEN'], creds['ACCESS_SECRET'])
# Start the stream
stream.statuses.filter(track='python')
С помощью приведенного выше кода мы собрали данные примерно для 10 000 твитов, содержащих ключевое слово «python». В следующей части мы сделаем краткий анализ включенных хэштегов и местоположений пользователей.
Краткий анализ данных
Twitter API – это мощная вещь, очень подходящая для исследования общественного мнения, анализа рынка, быстрого доступа к новостям и других вариантов использования, которые может поддержать ваше творчество. Обычно после того, как вы тщательно собрали свои твиты, нужно проанализировать данные, где анализ тональности играет решающую роль в систематическом извлечении субъективной информации из текста.
В любом случае, анализ настроений – это огромное поле, которое следует рассмотреть в небольшой части сообщения в блоге, поэтому в этой части мы проведем только базовый анализ данных, касающихся местоположения и хэштегов, используемых людьми, которые пишут в Твиттере.
Обратите внимание, что цель этих примеров – просто показать, для чего могут быть использованы данные Twitter API. Наша небольшая выборка твитов не должна использоваться для вывода, потому что она не является хорошим представителем всей совокупности твитов или ее сроки сбора были независимыми и единообразными.
Сначала давайте импортируем наши данные из файла «saved_tweets.csv» и распечатаем несколько строк.
import pandas as pd
tweets = pd.read_csv("saved_tweets.csv")
tweets.head()
| хэштеги | текст | Пользователь | место расположения | |
|---|---|---|---|---|
| 0 | [‘IBM’] | RT @freschesolution: Присоединяйтесь к нам ЗАВТРА с @OC … | rbrownpa | NaN |
| 1 | [] | pylocus 1.0.1: Пакет локализации https: // t …. | pypi_updates2 | NaN |
| 2 | [] | humilis-push-processor 0.0.10: Humilis push ev … | pypi_updates2 | NaN |
| 3 | [‘Python’, ‘python’, ‘postgresql’] | #Python Digest вышел! https: //t.co/LEmyR3yDMh … | Horstwilmes | Цюрих |
| 4 | [NeuralNetworks, Python, KDN] | RT @kdnuggets: Руководство для начинающих по #NeuralNet … | гиодегаз | Л’Акуила, ИТАЛИЯ |
Какие самые распространенные хэштеги связаны с нашим ключевым словом «python»? Поскольку все данные в нашем DataFrame представлены в виде строк, включая скобки в столбце хэштегов, чтобы получить список хэштегов, нам нужно перейти от списка строк к списку списков, к списку хэштегов. Затем мы будем использовать класс Counter для подсчета записей хэштегов в нашем списке и распечатать отсортированный список из 20 наиболее распространенных хэштегов.
from collections import Counter
import ast
tweets = pd.read_csv("saved_tweets.csv")
# Extract hashtags and put them in a list
list_hashtag_strings = [entry for entry in tweets.hashtags]
list_hashtag_lists = ast.literal_eval(','.join(list_hashtag_strings))
hashtag_list = [ht.lower() for list_ in list_hashtag_lists for ht in list_]
# Count most common hashtags
counter_hashtags = Counter(hashtag_list)
counter_hashtags.most_common(20)
[('python', 1337),
('datascience', 218),
('bigdata', 140),
('machinelearning', 128),
('deeplearning', 107),
('django', 93),
('java', 76),
('ai', 76),
('coding', 68),
('100daysofcode', 65),
('javascript', 64),
('iot', 58),
('rstats', 52),
('business', 52),
('tech', 48),
('ruby', 45),
('programming', 43),
('cybersecurity', 43),
('angularjs', 41),
('pythonbot_', 41)]
Затем мы можем использовать местоположение пользователя, чтобы ответить – в каких регионах мира больше всего твитов о «питоне»? На этом шаге мы будем использовать метод geocode библиотеки geopy, который возвращает координаты заданного входного местоположения. Чтобы визуализировать тепловую карту мира твитов, мы воспользуемся библиотекой gmplot. Напоминание: наши небольшие данные не являются реальным представителем мира.
from geopy.geocoders import Nominatim
import gmplot
geolocator = Nominatim()
# Go through all tweets and add locations to 'coordinates' dictionary
coordinates = {'latitude': [], 'longitude': []}
for count, user_loc in enumerate(tweets.location):
try:
location = geolocator.geocode(user_loc)
# If coordinates are found for location
if location:
coordinates['latitude'].append(location.latitude)
coordinates['longitude'].append(location.longitude)
# If too many connection requests
except:
pass
# Instantiate and center a GoogleMapPlotter object to show our map
gmap = gmplot.GoogleMapPlotter(30, 0, 3)
# Insert points on the map passing a list of latitudes and longitudes
gmap.heatmap(coordinates['latitude'], coordinates['longitude'], radius=20)
# Save the map to html file
gmap.draw("python_heatmap.html")
Приведенный выше код создал тепловую карту на следующем рисунке, показывающую более высокую активность в твитах типа «питон» в США, Великобритании, Нигерии и Индии.
Обратной стороной описанного подхода является то, что мы не проводили никакой очистки данных. Оказалось, что множество твитов, сгенерированных машиной, поступают из одного места или из нескольких мест, порождающих один и тот же твит. Конечно, эти образцы следует отбросить, чтобы получить более реалистичную картину географического распределения людей, твитирующих «питон». Второе улучшение – это просто сбор большего количества данных за более длительные и непрерывные периоды.

Заключение
В целом Twitter – это очень мощный инструмент для понимания общественного мнения, проведения исследований и анализа рынка, и поэтому его API-интерфейсы – отличный способ для предприятий создавать автоматизированные инструменты для получения информации, связанной с их объемом работы. Не только компании, но и частные лица также могут использовать API для создания творческих приложений.
Мы также перечислили несколько самых популярных оболочек Python, но важно отметить, что разные оболочки реализуют разные возможности API-интерфейсов Twitter. Поэтому следует выбирать оболочку Python в соответствии с ее назначением. В двух примерах, которые мы показали с API поиска и потоковой передачи, кратко описан процесс сбора твитов и некоторые возможные идеи, которые они могут извлечь.