Анализ отзывов с banki.ru [Часть 4] Создание сайта и RESTAPI
Данный материал представлен в информационно-ознакомительных целях.
Список частей:
1
часть: Сбор данных ссылка2
часть: Визуализация ссылка3
часть: Мониторинг загрузок ссылка4
часть: Создание сайта и RESTAPI ссылка
Короткое вступление
Четвертая часть в серии статей о сборе данных с ресурса banki.ru - отзывов клиентов
Прошлую статью мы закончили на создании аудита загрузок, с того момента прошло некоторое время - данные сохраняются а толку от них 0, чтобы исправить этот момент мы создадим сервис, который будет отдавать эти данные, а именно демонстрационный сайт и RESTAPI
.
В данный момент работают несколько потоков
:
- Тинькофф Банк
- ВТБ
- Хоум Кредит
- Альфа-Банк
- Банк Открытие
- Газпромбанк
- Райффайзенбанк
select
bank_name
, round(avg(score),2 ) as scorex
, trunc(median(score)) as median
, count(*) as cnt
from home.dt_banki_responses
where
create_dt >= date('2021-01-01')
and bank_name in (
'Тинькофф Банк',
'ВТБ',
'Хоум Кредит Банк',
'Альфа-Банк',
'Банк Открытие',
'Газпромбанк',
'Райффайзенбанк'
)
group by bank_name
order by cnt desc
- Тинькофф Банк - кол-во:
13954
средняя:4.60
медиана:5
- ВТБ - кол-во:
10100
средняя:2.39
медиана:2
- Хоум Кредит Банк - кол-во:
5433
средняя:3.73
медиана:5
- Альфа-Банк - кол-во:
5251
средняя:1.40
медиана:1
- Банк Открытие - кол-во:
3003
средняя:2.11
медиана:1
- Газпромбанк - кол-во:
2881
средняя:1.98
медиана:1
- Райффайзенбанк - кол-во:
1130
средняя:1.71
медиана:1
Заглядывая в будущее можно смело сделать вывод, что реализация демонстрационной страницы с использованием только django
- это догога, ведущая к неизмежному “переписыванию” фронтовой части на что-то из современных JS
библиотек, поэтому django
будет использован только для реализации API endpoints
.
urlpatterns = [
path('sample/', get_data_sample, name='sample'),
path('export/', get_example_csv, name='export'),
path('stats/', get_bank_stats, name='stats'),
]
Создадим несколько django view
:
Семпл данных для стартовой страницы
def get_data_sample(request):
cursor = get_cursor()
query = '''
select
id
, link
, title
, city
, bank_name
, score
, status
, username
, create_dt
, comments
from home.dt_banki_responses
order by id desc
limit 10
'''
cursor.execute(query)
result = cursor.fetchall()
data = {
'status': 'success',
'data': result,
'time': datetime.now()
}
return JsonResponse(data=data, safe=False, json_dumps_params={'ensure_ascii': False})
Выгрузка в формате CSV
def get_example_csv(request):
response = HttpResponse(content_type='text/csv; charset=windows-1251')
cursor = get_cursor()
query = '''
select *
from home.dt_banki_responses
where create_dt <= date(now())-2
order by id desc
limit 250
'''
cursor.execute(query)
result = cursor.fetchall()
writer = csv.writer(response, delimiter=';')
writer.writerow([col.name for col in cursor.description])
for row in result:
try:
writer.writerow(list(row.values()))
except UnicodeEncodeError:
continue
response['Content-Disposition'] = f'attachment; filename=export_{sysdate()}.csv'
return response
Статистика
def get_bank_stats(request):
cursor = get_cursor()
query = 'select * from home.v_stats'
cursor.execute(query)
result = cursor.fetchall()
data = {
'status': 'success',
'data': result,
'time': datetime.now()
}
return JsonResponse(data=data, safe=False, json_dumps_params={'ensure_ascii': False})
Создание postgres view home.v_stats
create or replace view home.v_stats as (
select
bank_name
, round(avg(score),2 ) as scorex
, trunc(median(score)) as median
, count(*) as cnt
from home.dt_banki_responses
where
create_dt >= date('2021-01-01')
and bank_name in (
'Тинькофф Банк', 'ВТБ', 'Хоум Кредит Банк', 'Альфа-Банк', 'Банк Открытие', 'Газпромбанк', 'Райффайзенбанк'
)
group by bank_name
order by cnt desc
);
После развертывания на тестовом сервере - получаем 3 апи-роута:
Сам демонстрационный сайт временно размещен на поддомене http://banki.artydev.ru/ По вопросам сотрудничества можно обращаться в @artydevx