Анализ отзывов с banki.ru [Часть 4] Создание сайта и RESTAPI

2 minute read

img

Данный материал представлен в информационно-ознакомительных целях.

Список частей:

Короткое вступление

Четвертая часть в серии статей о сборе данных с ресурса 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
  1. Тинькофф Банк - кол-во: 13954 средняя: 4.60 медиана: 5
  2. ВТБ - кол-во: 10100 средняя: 2.39 медиана: 2
  3. Хоум Кредит Банк - кол-во: 5433 средняя: 3.73 медиана: 5
  4. Альфа-Банк - кол-во: 5251 средняя: 1.40 медиана: 1
  5. Банк Открытие - кол-во: 3003 средняя: 2.11 медиана: 1
  6. Газпромбанк - кол-во: 2881 средняя: 1.98 медиана: 1
  7. Райффайзенбанк - кол-во: 1130 средняя: 1.71 медиана: 1

img

Заглядывая в будущее можно смело сделать вывод, что реализация демонстрационной страницы с использованием только 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 апи-роута:

  • Таблица: sample - кликабельно
  • Статистика: stats - кликабельно
  • Выгрузка в CSV: export - кликабельно

Сам демонстрационный сайт временно размещен на поддомене http://banki.artydev.ru/ По вопросам сотрудничества можно обращаться в @artydevx