Граббер публичных данных с Facebook. Часть 1

Страницы компаний и организаций на Facebook хранят тонны действительно интересной информации. Эта информация может быть чрезвычайно полезна для отслеживания эффективности страниц собственной компании c точки зрения маркетинга и администрирования страниц и/или мониторинга страниц ваших конкурентов.

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

Требования

  • Python 2.7
  • Основы Python и запуска скриптов
  • MySQL 5.6 (будет использован во второй части)

Шаг 1. Выбор страницы компании или организации для обработки

Прежде, чем мы приступим, нам необходимо подключить несколько библиотек, которые помогут нам в работе. В самом начале вашего Python скрипта подключите две библиотеки urllib2 и json. Первая библиотека - это простая в использовании библиотека для обработки URL адресов. Это отличный инструмент для любого граббера на Python. Вторая библиотека, json - Python пакет для работы с JSON объектами. Как работать с этими библиотеками мы рассмотрим позже.

Далее нам нужно выбрать страницы, которые мы будет разбирать. Вы сами можете найти такие страницы на Facebook, например http://facebook.com/walmart, и скопировать последнее слово из адреса. Мы будем хранить “названия” компаний в списке list_companies. Далее мы создаем переменную graph_url и присваиваем ей значение http://graph.facebook.com/. Мы будем использовать эти переменные в дальнейшем для перебора и извлечения данных с интересующих нас страниц.

import urllib2
import json

def main():
    list_companies = ["walmart", "cisco", "pepsi", "facebook"]
    graph_url = "http://graph.facebook.com/"

Шаг 2. Данные, которые мы будет разбирать

Далее мы рассмотрим данные, которые будем разбирать. Для этого мы возьмем одно из имен, перечисленных в переменной list_comapnies и добавим его к переменной graph_url. Например, http://graph.facebook.com/walmart . При обращении по такому URL получаем следующие данные:

{
    "id": "159616034235",
    "about": "\u201cIf we work together, we\u2019ll lower the cost of living for everyone\u2026we\u2019ll give the world an opportunity to see what it\u2019s like to save and have a better life.\u201d  - Sam Walton",
    "can_post": false,
    "category": "Retail and consumer merchandise",
    "checkins": 14528,
    "company_overview": "When Sam Walton opened the doors to the first Walmart in 1962, his goal was to save people money so they can live better. Sam was a firm believer in listening to what his customers had to say. That tradition continues today. But now, it doesn\u2019t have to end when you leave the store. Through Facebook, we\u2019re able to talk to you. Find out what\u2019s on your mind and let you know what we\u2019re up to. It\u2019s just another way we\u2019re working to give the millions of families who shop at Walmart more of what they love\u2014ways to save money and live better.\n\n\nAdvice for joining the discussion on our Facebook page. http://www.walmartstores.com/9453.aspx",
    "cover": {
        "cover_id": "10152781640084236",
        "offset_x": 0,
        "offset_y": 0,
        "source": "https://scontent-b.xx.fbcdn.net/hphotos-xap1/v/t1.0-9/s720x720/10370806_10152781640084236_3193356364848286032_n.png?oh=a3e850d28994fa4c0a2de6a01b0de0fd&oe=54939DA3"
    },
    "description": "Welcome to the official Facebook Page about Walmart. Join Facebook to start connecting with Walmart.",
    "founded": "July 2, 1962",
    "general_info": "Guidelines for joining the discussion: http://corporate.walmart.com/social-media-guidelines When Sam Walton opened the doors to the first Walmart in 1962, his goal was to save people money so they can live better. Sam was a firm believer in listening to what his customers had to say. That tradition continues today. But now, it doesn\u2019t have to end when you leave the store. Through Facebook, we\u2019re able to talk to you, find out what\u2019s on your mind and let you know what we\u2019re up to. It\u2019s just another way we\u2019re working to give the millions of families who shop at Walmart more of what they love\u2014ways to save money and live better.",
    "has_added_app": false,
    "is_community_page": false,
    "is_published": true,
    "likes": 34730298,
    "link": "https://www.facebook.com/walmart",
    "location": {
        "city": "Bentonville",
        "country": "United States",
        "state": "AR"
    },
    "name": "Walmart",
    "parking": {
        "lot": 0,
        "street": 0,
        "valet": 0
    },
    "phone": "1-800-WAL-MART",
    "talking_about_count": 81838,
    "username": "walmart",
    "website": "www.walmart.com",
    "were_here_count": 8470634
}

Это визуальное представление объекта JSON. Над… это выглядит как куча беспорядочной информации. Но не волнуйтесь, на самом деле тут все данные логично структурированы и в ближайшее время мы сможем разобраться во всем этом и выделить то, что нам нужно.

Шаг 3. Получение и вывод информации

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

    for company in list_companies:
        current_page = graph_url + company

        web_response = urllib2.urlopen(current_page)
        readable_page = web_response.read()
        json_fbpage = json.loads(readable_page)

        print company + " page"
        print json_fbpage["id"]
        print json_fbpage["likes"]
        print json_fbpage["talking_about_count"]
        print json_fbpage["username"]
        print "            "

if __name__ == "__main__":
    main()

Давайте разберем данный кусок кода по строкам. Это основная часть нашего граббера. В начале мы определили простейший цикл, который перебирает все компании из нашего списка list_companies, созданного на шаге 1.

Подобно тому, как мы делали на шаге 2, мы соединяем graph_url и имя компании для получения Graph API URL страницы компании. Например для первой итерации цикла current_page будет равно http://graph.facebook.com/walmart .

Давайте рассмотрим следующий блок кода. Помните в начале шага 1 мы подключали две библиотеки? Тут мы их используем. Для начала посмотрим на использование библиотеки urllib2. Мы берем наш URL, выполняем запрос по нему и сохраняем ответ в переменной web_response. Рассматривайте ответ, как объект типа файл, аналогичный текстовому файлу или CSV, который содержит драгоценные данные веба.

Теперь, когда у нас есть объект ответа, нам надо преобразовать его в вид, удобный для человека. Следующее присвоение в переменную readable_page использует метод объекта ответа read(). Он преобразует объект ответа в читаемый документ (HTML), который можно распечатать на консоль. Вы можете проверить читабельность содержимого переменной readable_page, распечатав ее на консоль.

И наконец, давайте посмотрим на последнюю строку нашего блока кода, где мы присваиваем значение в переменную json_fbpage. Здесь мы берем переменную readable_page и конвертируем ее в JSON объект. Это позволит нам в дальнейшем ссылаться на нужную часть информации по ключу, на подобие, как в словаре Python.

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

Продуйте и изменяйте код, включая в вывод любой из интересующих вас ключей. Если вам нужно узнать какие ключи доступны, то вернитесь к шагу 2 и посмотрите какие ключи возвращаются при запросе URL компании.

Итог и дальнейшие шаги

В данной статье мы рассмотрели, как создать простейший граббер, который получает данные с публичной страницы Facebook. В нашей следующей части мы рассмотрим как интегрировать базу данных MySQL с нашим граббером и сохранять данные в базе данных.

Source: Simple. Beautiful. Data.

 
comments powered by Disqus