Перейти к основному содержимому

Парсинг сайта «Приоритета 2030»

Для разных целей может понадобиться сводная таблица с текущими значениями, отражающими показатели университетов — участников программы «Приоритет 2030». Ниже представленное позволяет собрать всё в один файл.

Импорты и начальные настройки
import time
import requests
import pandas as pd

data_folder = '../data/PSAL-19'
url_base = 'https://api.socio.center/public/priority' # Базовая ссылка на API

Список университетов

Для начал сформируем список университетов:

Формируем список университетов
url_list = f"{url_base}/list"
university_list_resp = requests.get(url_list)
university_list = pd.DataFrame()

if university_list_resp.status_code == 200:
university_list_json_data = university_list_resp.json()

if university_list_json_data['status'] == 'success':
university_list = pd.DataFrame(university_list_json_data['data']['participants'])
university_list['group'] = university_list['group'].apply(lambda x: university_list_json_data['data']['group'][x])

# Сохраняем полученный список университетов
university_list.to_csv(f"{data_folder}/university_list.csv", index=False)
university_list.to_excel(f"{data_folder}/university_list.xlsx", index=False)
else:
raise Exception(f"{url_list} return status code {university_list_resp.status_code}")

# Выводим первые 10 записей
university_list.head(10)
idnameshortNamecitylocationregionregionCodefounderstatelevelgroup
0rmpvygmvxoФедеральное государственное автономное образов...МФТИМоскваМоскваЦентральныйcentralМинистерство науки и высшего образования Росси...participant1Участники программы (основной трек)
1qkaxxbqxbmФедеральное государственное бюджетное образова...ОГУОренбургОренбургская областьПриволжскийvolgaМинистерство науки и высшего образования Росси...participantbaseУчастники программы (основной трек)
2vbclqozcgsФедеральное государственное бюджетное образова...ВятГУКировКировская областьПриволжскийvolgaМинистерство науки и высшего образования Росси...participantbaseУчастники программы (основной трек)
3krdeociohkФедеральное государственное бюджетное образова...ЮРГПУ(НПИ)НовочеркасскРостовская областьЮжныйsouthМинистерство науки и высшего образования Росси...participantbaseУчастники программы (основной трек)
4fgnzen3sxzФедеральное государственное бюджетное образова...ТГУ имени Г.Р. ДержавинаТамбовТамбовская областьЦентральныйcentralМинистерство науки и высшего образования Росси...participantbaseУчастники программы (основной трек)
57mzkpv35zlФедеральное государственное бюджетное образова...НИУ МГСУМоскваМоскваЦентральныйcentralМинистерство науки и высшего образования Росси...participant2Участники программы (основной трек)
6ezg3l1cmfoФедеральное государственное бюджетное образова...ТулГУТулаТульская областьЦентральныйcentralМинистерство науки и высшего образования Росси...participantbaseУчастники программы (основной трек)
7tj72fyldeeФедеральное государственное бюджетное образова...СПбГУПТДСанкт-ПетербургСанкт-ПетербургСеверо-ЗападныйnorthМинистерство науки и высшего образования Росси...participantbaseУчастники программы (основной трек)
8heo0www7buФедеральное государственное бюджетное образова...ФГБОУ ВО Вавиловский университетСаратовСаратовская областьПриволжскийvolgaМинистерство сельского хозяйства Российской Фе...participantbaseУчастники программы (основной трек)
9vt81dqczsuФедеральное государственное бюджетное образова...ФГБОУ ВО "ПИМУ" Минздрава РоссииНижний НовгородНижегородская областьПриволжскийvolgaМинистерство здравоохранения Российской Федерацииparticipant2Участники программы (основной трек)

Показатели программы

Чтобы не перегружать API сайта «Приоритет 2030», по каждому университету данный собираются с задержкой в 0,5 секунды (относитесь с заботой к источникам своих данных 🤗), соответственно собирается всё около 3-5 минут.

Собираем показатели программы по университетам
university_columns = ['ID университета', 'Университет', 'Город', 'Регион', 'Ведомство']
university_kpis = pd.DataFrame(columns=university_columns)
university_kpis_components = pd.DataFrame(columns=university_columns)

def get_df_by_indicator(d: dict) -> pd.DataFrame:
result = pd.DataFrame(index=[str(x) for x in d['labels']], columns=['Индикатор'])

for el in d['data']:
chunk = pd.DataFrame({'year': [str(x) for x in el['data'].keys()], f"{el['description']}": el['data'].values()}).set_index('year')
result = result.merge(chunk, how='left', left_index=True, right_index=True)

result['Индикатор'] = d['indicator']

return result.reset_index().rename(columns={'index': 'Год'})


def get_df_by_group(d: dict) -> pd.DataFrame:
result = pd.DataFrame(columns=['Группа'])

for indicator in d['elements']:
result = pd.concat([result, get_df_by_indicator(indicator)], ignore_index=True)

result['Группа'] = d['name']

return result


for idx, r in university_list.iterrows():
university_id, university_short_name = r['id'], r['shortName']
url_kpi = f"{url_base}/{university_id}/indicators"
resp = requests.get(url_kpi)

if resp.status_code == 200:
json_data = resp.json()

if json_data['status'] == 'success':
for group in json_data['data']:
df_by_group = get_df_by_group(group)
df_by_group[['ID университета', 'Университет', 'Город', 'Регион', 'Ведомство']] = r[['id', 'shortName', 'city', 'location', 'founder']]
university_kpis = pd.concat([university_kpis, df_by_group])

else:
raise Exception(f"{url_kpi} return status code {resp.status_code}")

time.sleep(0.5)

# Сохраняем полученный список университетов
university_kpis.to_csv(f"{data_folder}/university_kpis.csv", index=False)
university_kpis.to_excel(f"{data_folder}/university_kpis.xlsx", index=False)

Исходники и данные

Вроде бы всё 👍 Исходный Jupiter Notebook для данной страницы находится по данной ссылке в Github.

Получившиеся набор данных, на момент написания, вы можете скачать по ссылкам:

  • Список университетов ⬇️ csv и/или ⬇️ excel.
  • Индикаторы университетов ⬇️ csv и/или ⬇️ excel.