Сохраняем новые посты голоса в 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)
Обратите внимание, что мы получаем не только статьи, но комментарии, так как они тоже часть активности на голосе. Спасибо за внимание!
Материал подготовлен автором @zheev