Статьи

Краткое руководство по потоковому API Twitter

Вступление

Анализ твитов — это самая модная вещь, и если вы новичок в игре, вы хотите знать, как получить их программно. Есть много способов сделать это, но хорошим началом будет использование API потоковой передачи Twitter, сервиса RESTful, который позволяет вам получать твиты в режиме реального времени на основе указанных вами критериев. Для большинства людей это будет означать наличие доступа к спритцеру, который обеспечивает лишь очень небольшой процент всех твитов, проходящих через Твиттер в любой данный момент. Чтобы получить доступ к большему, вам нужно иметь особые отношения с Twitter или платить Twitter или аффилированным лицом, таким как Gnip. В этом посте рассказывается об использовании потокового API Twitter. Вы можете получить все это на основе документации, предоставленной Twitter , но это будет немного проще для

новички в таких услугах. (Этот пост в основном предназначен для первого этапа проекта курса для студентов в моем классе по прикладной обработке естественного языка в этом семестре). Вы должны иметь учетную запись Twitter, чтобы сделать это пошаговое руководство, так что получите его сейчас, если у вас его еще нет.

Доступ к случайной выборке твитов

Сначала попробуйте выбрать случайный образец твитов с помощью браузера, перейдя по следующей ссылке.

Вы должны увидеть растущий, громоздкий список необработанных твитов. Это должно выглядеть примерно так:

tweets_sample

Вот пример «сырого» твита (который поставляется в формате JSON или JavaScript Object Notation):

{"text":"#LetsGoMavs til the end RT @dallasmavs: Are You ALL IN?","truncated":false,"retweeted":false,"geo":null,"retweet_count":0,"source":"web","in_reply_to_status_id_str":null,"created_at":"Wed Apr 25 15:47:39 +0000 2012","in_reply_to_user_id_str":null,"id_str":"195177260792299521","coordinates":null,"in_reply_to_user_id":null,"favorited":false,"entities":{"hashtags":[{"text":"LetsGoMavs","indices":[0,11]}],"urls":[],"user_mentions":[{"indices":[27,38],"screen_name":"dallasmavs","id_str":"22185437","name":"Dallas Mavericks","id":22185437}]},"contributors":null,"user":{"show_all_inline_media":true,"statuses_count":3101,"following":null,"profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/285480449\/AAC_med500.jpg","profile_sidebar_border_color":"eeeeee","screen_name":"flyingcape","follow_request_sent":null,"verified":false,"listed_count":2,"profile_use_background_image":true,"time_zone":"Mountain Time (US & Canada)","description":"HUGE ROCKETS & MAVS fan. Lets take down the Lakers & beat up on the East. Inaugural member of the FC Dallas - Fort Worth fan club.","profile_text_color":"333333","default_profile":false,"profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/285480449\/AAC_med500.jpg","created_at":"Thu Oct 21 15:40:21 +0000 2010","is_translator":false,"profile_link_color":"1212cc","followers_count":35,"url":null,"profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1658982184\/204970_10100514487859080_7909803_68807593_5366704_o_normal.jpg","profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1658982184\/204970_10100514487859080_7909803_68807593_5366704_o_normal.jpg","id_str":"205774740","protected":false,"contributors_enabled":false,"geo_enabled":true,"notifications":null,"profile_background_color":"0a2afa","name":"Mandy","default_profile_image":false,"lang":"en","profile_background_tile":true,"friends_count":48,"location":"ATX \/ FDub. From Galveston !","id":205774740,"utc_offset":-25200,"favourites_count":231,"profile_sidebar_fill_color":"efefef"},"id":195177260792299521,"place":{"bounding_box":{"type":"Polygon","coordinates":[[[-97.938383,30.098659],[-97.56842,30.098659],[-97.56842,30.49685],[-97.938383,30.49685]]]},"country":"United States","url":"http:\/\/api.twitter.com\/1\/geo\/id\/c3f37afa9efcf94b.json","attributes":{},"full_name":"Austin, TX","country_code":"US","name":"Austin","place_type":"city","id":"c3f37afa9efcf94b"},"in_reply_to_screen_name":null,"in_reply_to_status_id":null} 

Там есть много информации, кроме самого текста твита, который просто «#LetsGoMavs до конца RT @dallasmavs: Ты ВСЕ ВНУТРИ?» По сути, это карта от атрибутов к значениям (и сами значения могут быть такими картами, например, для атрибута «пользователь» выше). Вы можете увидеть, был ли твит ретвитнут (который будет нулевым, когда твит впервые публикуется), в какое время он был создан, уникальный идентификатор твита, гео-координаты (если доступны) и многое другое. Если у атрибута нет значения для твита, он равен «null».

Я вернусь к JSON-обработке твитов в следующем уроке, но вы можете начать с изучения моего урока по использованию Scala для обработки JSON в целом.

Доступ к твитам из командной строки

Предполагая, что вам удалось просмотреть твиты в браузере, мы можем перейти к командной строке. Для этого будет удобно сначала установить переменные окружения для вашего имени пользователя и пароля в Twitter.

1
2
$ export TWUSER=foo
$ export TWPWD=bar

Очевидно, что вам нужно предоставить данные вашей учетной записи Twitter вместо foo и bar…

Далее мы будем использовать программу curl для взаимодействия с API. Попробуйте, загрузив этот пост в блоге.

1
2
$ curl http://bcomposes.wordpress.com/2013/01/25/a-walk-through-for-the-twitter-streaming-api/ > bcomposes-twitter-api.html
$ less bcomposes-twitter-api.html

Учитывая, что вы извлекли твиты из API с помощью веб-браузера и что curl может получать доступ к веб-страницам таким образом, просто использовать curl, чтобы получать твиты и направлять их прямо в файл.

1
$ curl https://stream.twitter.com/1/statuses/sample.json -u$TWUSER:$TWPWD > tweets.json

Вот и все: теперь у вас есть постоянно растущий файл со случайно выбранными твитами. Посмотрите и постарайтесь не потерять веру в человечество.

Потянув твиты с определенными свойствами

Возможно, вы захотите получить твиты от определенных пользователей, а не случайную выборку. Это требует идентификаторов пользователей, а не имен пользователей, которые мы обычно видим. Идентификатор пользователя можно получить из API Twitter, просмотрев конечную точку / users / show. Например, следующее дает мою информацию:

Который дает:

1
2
3
4
5
6
7
8
9
<user>
<id>119837224</id>
<name>Jason Baldridge</name>
<screen_name>jasonbaldridge</screen_name>
<location>Austin, Texas</location>
<description>
Assoc. Prof., Computational Linguistics, UT Austin. Senior Data Scientist, Converseon. OpenNLP developer. Scala, Java, R, and Python programmer.
</description>
...MORE...

Итак, чтобы подписаться на @jasonbaldridge через Twitter API, вам нужен идентификатор пользователя 119837224. Вы можете получить мои твиты через API, используя параметр запроса «follow».

1
$ curl -d follow=119837224 https://stream.twitter.com/1/statuses/filter.json -u$TWUSER:$TWPWD

Есть большая вероятность, что я сейчас не пишу в Твиттере, так что вы, вероятно, ничего не увидите. Давайте проследим за большим количеством пользователей, что мы можем сделать, добавив больше идентификаторов, разделенных запятыми.

1
$ curl -d follow=1344951,5988062,807095,3108351 https://stream.twitter.com/1/statuses/filter.json -u$TWUSER:$TWPWD

Это будет следовать журналам Wired (@wired), The Economist (@theeconomist), New York Times (@nytimes) и Wall Street Journal (@wsj). Вы также можете записать эти идентификаторы в файл и прочитать их из файла. Например:

1
2
$ echo 'follow=1344951,5988062,807095,3108351' > following
$ curl -d @following https://stream.twitter.com/1/statuses/filter.json -u$TWUSER:$TWPWD

Конечно, вы можете редактировать файл «follow», а не использовать echo для его создания. Кроме того, имя файла может называться как угодно («следующий», так как имя здесь не важно). Вы можете искать конкретный термин в твитах, например, «Scala», используя параметр запроса «track».

1
$ curl -d track=scala https://stream.twitter.com/1/statuses/filter.json -u$TWUSER:$TWPWD

И неудивительно, что вы можете искать несколько элементов, используя запятые для их разделения.

1
$ curl -d track=scala,python,java https://stream.twitter.com/1/statuses/filter.json -u$TWUSER:$TWPWD

Однако для этого требуется, чтобы твит соответствовал хотя бы одному из этих терминов. Если вы хотите убедиться, что несколько терминов совпадают, вам нужно записать их в файл, а затем обратиться к этому файлу. Например, чтобы получить твиты с «настроением» и «анализом» ИЛИ «машиной» и «обучением» ИЛИ «текстом» и «аналитикой», вы можете сделать следующее:

1
2
$ echo 'track=sentiment analysis,machine learning,text analytics' > tracking
$ curl -d @tracking https://stream.twitter.com/1/statuses/filter.json -u$TWUSER:$TWPWD

Вы можете тянуть твиты из определенной прямоугольной области (ограничительной рамки) на поверхности Земли. Например, следующее извлекает твиты с геотегами из Остина, штат Техас.

1
$ curl -d locations=-97.8,30.25,-97.65,30.35 https://stream.twitter.com/1/statuses/filter.json -u$TWUSER:$TWPWD

Ограничительная рамка задается как широта (внизу слева), долгота (внизу слева), широта (вверху справа), долгота (вверху справа). Вы можете добавить дополнительные ограничивающие рамки, чтобы захватить больше мест. Например, следующее фиксирует твиты из Остина, Сан-Франциско и Нью-Йорка.

1
$ curl -d locations=-97.8,30.25,-97.65,30.35,-122.75,36.8,-121.75,37.8,-74,40,-73,41 https://stream.twitter.com/1/statuses/filter.json -u$TWUSER:$TWPWD

Вывод

Это все довольно просто, и очень удобно для многих видов потребностей сбора твитов. Одна из проблем заключается в том, что Твиттер иногда разрывает соединение, и вы в конечном итоге пропустите твиты, пока не начнете новый процесс. Если вам нужен постоянный мониторинг, обратитесь к UT Austin’s Twools (инструментам Twitter), чтобы получить постоянный поток твитов, который поступает всякий раз, когда Twitter разрывает ваше соединение.

Ссылка: пошаговое руководство по потоковому API для Twitter от нашего партнера по JCG Джейсона Болдриджа в блоге Bcomposes .