Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
vp-webdev
6 лет назад

Сохраняем новые посты голоса в PostgreSQL


В прошлой статье мы научились доставать необходимые нам данные из блокчейна.

Теперь сохраним все нужные данные в базу данных, в моем случае PostgreSQL. Причина выбора этой БД описана здесь. Установка БД описана здесь.

После установки создадим базу данных:

CREATE DATABASE posts;

и таблицу:

CREATE TABLE articles( id serial primary key, text text)

Для теста нам этого хватит, хранить будем только текст поста/комментария, без автора и пути.

Далее ставим через pip3 следующие библиотеки:

pip3 install beautifulsoup4
pip3 install psycopg2 
pip3 install psycopg2-binary
pip3 install lxml

Идем в скрипт get.py и произведем там правки:

В функции handler_mes будем открывать соединение с бд и записывать туда данные.

Для работы с БД будем использовать конструкцию try ... except.

Запишем в переменную строку с данными для соединения:

connect_str = "dbname='posts' user='postgres' host='localhost' password='pass'"

Далее создадим соединение и курсор для выполнения операций с базой данных:

conn = psycopg2.connect(connect_str)
cursor = conn.cursor()

Затем, в цикле обработаем текст, чтобы записать его без html-тегов, а то при анализе данные получатся не совсем достоверные.

text = BeautifulSoup(data.get('op')[1].get('body'), 'lxml')

Здесь мы создадим объект BeautifulSoup. Работа с BeautifulSoup описана в этой статье.

Теперь запишем в базу наши данные:

cursor.execute("INSERT INTO articles (text) VALUES (%s);", (str(text.string),))
                    conn.commit()

Обратите внимание на запятую в этой конструкции: (str(text.string),), без нее выводило ошибку.

text.string - получаем чистый текст без html.

Закроем соединение с базой

cursor.close()
conn.close()

Целиком функция будет выглядеть следующим образом:

def handler_mes(datas):
    if len(datas) > 0:
        try:
            connect_str = "dbname='posts' user='postgres' host='localhost' password='pass'"
            conn = psycopg2.connect(connect_str)
            cursor = conn.cursor()
            for data in datas:
                if data.get('op')[0] == 'comment':
                    text = BeautifulSoup(data.get('op')[1].get('body'), 'lxml')
                    print(data.get('op')[1].get('body'))
                    cursor.execute("INSERT INTO articles (text) VALUES (%s);", (str(text.string),))
                    conn.commit()
            cursor.close()
            conn.close()
        except Exception as e:
            print("Ошибка")
            print(e)

Листинг обновленного get.py

Обратите внимание, что мы получаем не только статьи, но комментарии, так как они тоже часть активности на голосе. Спасибо за внимание!

Материал подготовлен автором @zheev

2
165.497 GOLOS
На Golos с August 2017
Комментарии (1)
Сортировать по:
Сначала старые