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

В “Граббер публичных данных Facebook. Часть 1” мы создали очень простой граббер, который получал данные с 4х страниц компаний и печатал их на консоль. Во второй части мы создадим базу данных и добавим сохранение данных, полученных скриптом, в базу данных.

Шаг 1. Создание базы данных

Для начала нам нужен скрипт создания базы данных. Для этого нам надо подключиться к MySQL и запустить приведенный ниже код. Обратите внимание, что приведенный ниже код рассчитан на MySQL версии 5.6 и выше. Если у вас MySQL версии ниже, то вы получите ошибку. В таком случае вам потребуется обновить свою версию MySQL (Ubuntu/Linux, Windows)

--create our database to store Facebook Data
CREATE DATABASE facebook_data;

--create our table to store the data
USE facebook_data;
CREATE TABLE page_info(
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    fb_id BIGINT UNSIGNED,
    likes BIGINT UNSIGNED,
    talking_about BIGINT UNSIGNED,
    username VARCHAR(40),
    time_collected datetime NOT NULL DEFAULT NOW()
);

Давайте рассмотрим этот небольшой кусок кода. Первая часть - создание базы данных. Тут ничего особенного нету.

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

Колонки с fb_id по username соответствуют полям JSON объекта, который мы разбирали в первой части статьи. Учтите, что если вы в первой части меняли данные, которые граббер получает со страниц, то вам нужно будет поменять поля в создаваемой таблице для хранения вашего набора данных.

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

Шаг 2. Добавление подключения к базе данных

Теперь, когда у нас есть база данных facebook_data, нам нужно добавить в скрипт подключение к базе данных MySQL. Для этого подключим библиотеку mysql.connector. Если у вас возникают проблемы с подключением библиотеки или у вас не установлен Python MySQL connector, то обратитесь сюда. Далее скопируйте приведенный ниже код и вставьте его перед основной функцией. У вас уже должны быть подключены библиотеки urllib2 и json.

import urllib2
import json
import mysql.connector

def connect_db():
    #fill this out with your db connection info
    connection = mysql.connector.connect(user='JohnDoe', password='abc123',
        host = '127.0.0.1', database='facebook_data')
    return connection

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

Теперь можно использовать функцию connect_db() в нашей основной функции. Вставьте приведенный ниже код, который создает соединение нашего скрипта с базой данных:

def main():
    #e.g. http://facebook.com/walmart, walmart is the username
    list_companies = ["walmart", "cisco", "Target", "facebook"]
    graph_url = "http://graph.facebook.com/"

    #create db connection
    connection = connect_db()
    cursor = connection.cursor()

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

Шаг 3. Добавление данных в таблицу

Для начала нам нужен запрос для вставки. Перед нашим циклом создадим переменную insert_info:

# SQL statement for adding Facebook database
insert_info = ("INSERT INTO page_info "
    "(fb_id, likes, talking_about, username)"
    "VALUES (%s, %s, %s, %s)")

Это выражение используем 4 переменных, которые мы будем передавать в него позже, и вставляет их в поля fb_id, likes, talking_about и username. Вы спросите про поля id и time_collected? Не волнуйтесь. Они подставятся автоматически в тот момент, когда мы будет сохранять данные страницы в базе.

Теперь давайте используем это выражение для вставки полученных нашим скриптом данных. Для этого в цикле после распечатки полей JSON объекта вставьте следующий код:

        #gather our JSON Data
        page_data = (json_fbpage["id"], json_fbpage["likes"],
            json_fbpage["talking_about_count"],
            json_fbpage["username"])

        #insert the data we pulled into db
        cursor.execute(insert_info, page_data)

        #commit the data to the db
        connection.commit()

    connection.close()

if __name__ == "__main__":
    main()

Выше вы можете видеть, что мы создаем кортеж с именем page_data. В нем 4 значения, каждое из которых соответствует переменной из нашего SQL запроса. Подобно тому, как вы видим изменения значений при печати в консоле, значения нашего кортежа также будут меняться при каждой итерации цикла.

Далее мы используем объект курсора для выполнения нашего SQL запроса и передачи в него значений кортежа page_data. Как только значения page_data переданы, мы должны воспользоваться методом commit() для сохранения их в базе данных.

В конце мы выходим из цикла и закрываем соединение нашего граббера с базой данных.

Шаг 4. Весь код граббера

В итоге код нашего граббера должен выглядеть следующим образом:

import urllib2
import json
import mysql.connector

def connect_db():
    #fill this out with your db connection info
    connection = mysql.connector.connect(user='JohnDoe', password='abc123',
        host = '127.0.0.1', database='facebook_data')
    return connection


def main():
    #to find go to page's FB page, at the end of URL find username
    #e.g. http://facebook.com/walmart, walmart is the username
    list_companies = ["walmart", "cisco", "pepsi", "facebook"]
    graph_url = "http://graph.facebook.com/"

    #create db connection
    connection = connect_db()
    cursor = connection.cursor()

    #SQL statement for adding info to database
    insert_info = ("INSERT INTO page_info "
        "(fb_id, likes, talking_about, username)"
        "VALUES (%s, %s, %s, %s)")

    for company in list_companies:
        #make graph api url with company username
        current_page = graph_url + company

        #open public page in facebook graph api
        web_response = urllib2.urlopen(current_page)
        readable_page = web_response.read()
        json_fbpage = json.loads(readable_page)

        #print page data to console
        print company + " page"
        print json_fbpage["id"]
        print json_fbpage["likes"]
        print json_fbpage["talking_about_count"]
        print json_fbpage["link"]
        print json_fbpage["username"]
        print json_fbpage["website"]
        print "            "

        #gather our JSON Data
        page_data = (json_fbpage["id"], json_fbpage["likes"],
            json_fbpage["talking_about_count"],
            json_fbpage["username"])

        #insert the data we pulled into db
        cursor.execute(insert_info, page_data)

        #commit the data to the db
        connection.commit()

    connection.close()

if __name__ == "__main__":
    main()

Теперь давайте сохраним и запустим код. Если все сделано правильно, то вы не должны увидеть никаких ошибок. Если после выполнения скрипта мы откроем сессию с MySQL, и выполним запрос “SELECT * FROM page_info”, то должны увидеть строки данных, которые собрали со страниц Facebook. Если вы запустите скрипт еще раз, то строк станет больше.

Итог

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

Source: Simple Python Facebook Scraper

 
comments powered by Disqus