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

Показать всё, что скрыто или Блокчейн помнит всё. Пособие по сбору статистики Golos при помощи Python для чайников.

Давненько я не писал ничего про Python. Как-то не было особо поводов.
Но, в прошлую пятницу меня неожиданно посетила мысль, а почему бы не провести анализ данных по своему блогу? А именно, собрать информацию по подписчикам, СГ подписчиков, проанализировать апвойты и флаги. Просто, just for fun. Ну и заодно, появится причина запилить что-нибудь на Голос.
Дополнительным катализатором процесса послужил материал от @sci-populi, где они ссылаются на мои статьи про Piston. В целом, приятно, что мои опусы читает кто-то кроме меня)
Думаю, статистика по моему блогу мало кому интересна, а вот информация о методах сбора этой статистики возможно может быть для кого-то полезной.

Итак, существует два способа вытянуть данные из блокчейн:

1. Piston-Lib и обращение непосредственно к какой-либо ноде
Здесь мы вытаскиваем информацию непосредственно из цепочки блоков.
Используя соответствующие методы piston-lib мы можем парсить блоки, получать информацию о каком-либо аккаунте, запрашивать историю аккаунта, получать посты, либо комментарии удовлетворяющие определённому условию. В общем, многое. Подробнее о использовании piston-lib можно узнать на официальном сайте
Например, код ниже получает историю апвойтов по определённому аккаунту:

from piston import Steem
from piston.account import Account
a = Account("gmaster")
golos = Steem('wss://ws.golos.io', wif = "5K....")
history_events = a.history(filter_by=['vote'], start=0)

На первый взгляд всё просто и лаконично. Что, впрочем, не удивительно, это-ж Python).
Но, если вы делаете сложные, либо массовые запросы, данный способ не является оптимальным, а скорее всего даже вреден, так как в этом случае Вы можете создать повышенную нагрузку на ту ноду, к которой подключаетесь, что может негативно сказаться на её работе. Поэтому, лучше использовать способ №2.

2. Получаем информацию из GolosSQL
На самом деле для сбора статистики, не обязательно обращаться напрямую к блокчейн. Для того, чтобы не насиловать ноды, можно воспользоваться сервисом уважаемого @arcange, подключившись к его серверу БД MSSQL
В данную БД пишется вся информация из блокчейн(ну может и не вся, но для сбора статистики есть полный набор данных). Соответственно, можно делать выборку из БД, отправляя ей обычные SQL запросы и играться с полученными данными как Вашей душе будет угодно.
Используя Python это можно делать буквально в пару строчек:
Для начала импортируем ORM SQLAlchemy и модуль pymssql для работы с БД, задаём параметры подключения и запускаем процедуру create_engine

import pymssql
from sqlalchemy import create_engine
url = 'mssql+pymssql://golos:golos@sql.golos.cloud/DBGolos'
golosDB = create_engine(url)

Далее, создаём подключение, формируем и отправляем нужный SQL запрос

connection = golosDB.connect()
query = """
select
    voter as Voter,
    count(*) as count
from TxVotes
where author = 'gmaster'
group by Voter
order by count desc
"""
result = connection.execute(query)

В данном случае я получаю список всех, кто голосовал за мои посты и комментарии, количество апвойтов и сортирую их по убыванию.
Полученные данные мы можем обрабатывать как угодно, например стоить графики, диаграммки, схемы при помощи pandas, либо производить различные вычисления. В моём случае этого не требуется, так как вся необходимая информация доступна без этого, формирование нужных столбцов и подсчёт апвойтов происходит сразу в SQL запросе.
Следующим этапом можно вывести результат запроса непосредственно в файл. Нужно расставить дополнительные метки, чтобы в итоге получилась markdown табличка, которую достаточно просто скопировать и вставить на страничку

result = connection.execute(votes)
with open("test_stat.md","w") as out:
    print(' | Upvoter | Количество апвойтов | ', file=out)
    print(' |-----|-----| ', file=out)
    for res in result:
          print(' | ' + res[0]+ ' | ' + str(res[1]) + ' | ', file=out)

В итоге выходит что-то по типу этого:

UpvoterКоличество апвойтов
gmaster64
dobryj.kit22
zhenek21
gryph0n17
borishaifa217
tengri17
golosboard16
inkognito16
grkh16
kedgaks16
natulya15

Просмотреть структуру GolosDB, можно при помощи подключения через любое внешнее приложение

enter image description here
Например, здесь мы видим табличку Comments содержащую все комментарии и статьи Голос. Отличить пост от комментария просто, у поста поле parent_author пустое.
SQL достаточно мощный язык и правильно формируя запросы можно быстро получать нужную информацию без необходимости дополнительного анализа. Например, отправив запрос:

query = """
select
    author as Author,
    count(*) as count
from TxComments
where body LIKE '%python%'
group by Author
order by count desc
"""

Получим топ пользователей, которые упоминают в постах и комментариях Python

AuthorКоличество упоминаний Python
@habreplicator91
@pythono44
@golosboard25
@iamraa21
@blockchained19
@dobryj.kit16
@kiwi16
@sxiii15
@gmaster14
@t3ran1313
@sept11
@darkvasyak10
@naminutku8
@tengri8
@tristamoff8
@mapala7
@prismo7
@wealthycat7
@archibald1166
@gelmut6

Либо, можем получить топ 10 постов по количеству апвойтов за 2017 год:

select top 10 author, permlink, net_votes
from Comments
where
    cast(created as date) > '2017-01-01'
    and parent_author = ''
    and author <> 'golos.loto'
    and author <> 'bm-bmtasks'
order by net_votes desc

Дабы список получился релевантным мы исключаем из результатов запроса golos.loto и аккаунт, который организовывал какие-то сходки Бизнес Молодость

AuthorPermlinkКоличество апвойтов
blockchainedanons-zapusk-shlyuza-i-start-torgov-golos-i-gbg-na-decentralizovannoi-torgovoi-platforme-bitshares-rudex-s-0-komissiei445
golosmediagmnauka0409429
golosmediagolosmediacorp417
golosmediagmbiz0209416
golosobnovlenie-veb-klienta-golos-io402
golosmedianewrules399
liraproshu-minutu-vnimaniya-u-nashego-jurgan-beda388
golosmediapsk61386
arcangesleduyushii-khardfork-opyat-otlozhen-moe-vyrazhenie-nedovolstva385

Вот как-то так.
Применение данных средств ограничено только Вашей фантазией.
Главное, не использовать их в деструктивных целях.
За сим откланяюсь.
Буду рад Вашим апвойтам, подпискам или репостам.
@gmaster

3
296.158 GOLOS
На Golos с May 2017
Комментарии (16)
Сортировать по:
Сначала старые