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

Парсинг сайта «ПИШ»

Ранее я описывал как спарсить показатели программы «Приоритет 2030». Парсинг показатели программа «Передовые инженерные школы» очень похож (есть один нюанс, который явно обозначен в тексте ниже).

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

task_id = 'PSAL-32'
data_folder = f'../data/{task_id}'
url_base = 'https://api.socio.center/engineers' # Базовая ссылка на API

Список передовых инженерных школ

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

Формируем список передовых инженерных школ
url_list = f'{url_base}/schools'
schools_list_resp = requests.post(url_list)

if schools_list_resp.status_code == 200:
shools_list_json_data = schools_list_resp.json()

if shools_list_json_data['status'] == 'success':
shools_list = pd.json_normalize(schools_list_resp.json()['data']['items'])

# Сохраняем полученный список инженерных школ
shools_list.to_csv(f"{data_folder}/shools_list.csv", index=False)
shools_list.to_excel(f"{data_folder}/shools_list.xlsx", index=False)
else:
raise Exception(f"In JSON status is {shools_list_json_data['status']}")
else:
raise Exception(f"{url_list} return status code {schools_list_resp.status_code}")

# Выводим первые 10 записей
shools_list.head(10)
idslugnameshortNamelogothemespartnersuniversity.nameuniversity.shortNameuniversity.innuniversity.cityuniversity.areauniversity.areaCode
0286tpuИнтеллектуальные энергетические системыИнЭСhttps://api.socio.center/upload/iblock/60b/c5r...[{'code': '16', 'name': 'Ядерная энергетика и ...[{'code': '7024029499', 'name': 'АО «СИБИРСКИЙ...Томский политехнический университетТПУ7018007264ТомскСибирскийsiberia
1288rnimuШкола медицинской инженерииhttps://api.socio.center/upload/iblock/b90/h6v...[{'code': '21', 'name': 'Медицинское приборост...[{'code': '7704859803', 'name': 'АО «ОБЪЕДИНЕН...РНИМУ имени Н.И. Пирогова Минздрава РоссииФГАОУ ВО РНИМУ им. Н.И. Пирогова Минздрава России7728095113МоскваЦентральныйcentral
2296miptПередовая инженерная школа радиолокации, радио...https://api.socio.center/upload/iblock/02b/mwv...[{'code': '28', 'name': 'Программная инженерия...[{'code': '7731084175', 'name': 'АО «Концерн в...Московский физико-технический институтМФТИ, ФИЗТЕХ5008006211МоскваЦентральныйcentral
3304dvfuИнститут биотехнологий, биоинженерии и пищевых...https://api.socio.center/upload/iblock/ea1/6se...[{'code': '15', 'name': 'Пищевая промышленност...[{'code': '2520009691', 'name': 'ООО «Арника-Х...Дальневосточный федеральный университетДВФУ2536014538ВладивостокДальневосточныйvostok
4310bmstuСистемная инженерия ракетно- космической техникиhttps://api.socio.center/upload/iblock/880/yt4...[{'code': '17', 'name': 'Авиационная и ракетно...[{'code': '7702388027', 'name': 'Госкорпорация...Московский государственный технический универс...МГТУ им. Н.Э. Баумана7701002520МоскваЦентральныйcentral
5311sfeduИнженерия киберплатформhttps://api.socio.center/upload/iblock/1e0/ai5...[{'code': '24', 'name': 'Искусственный интелле...[{'code': '7704274402', 'name': 'Государственн...Южный федеральный университетЮжный федеральный университет6163027810Ростов-На-ДонуЮжныйsouth
6318nntuПередовая инженерная школа атомного машиностро...https://api.socio.center/upload/iblock/2d5/856...[{'code': '18', 'name': 'Атомное машиностроени...[{'code': '5260174449', 'name': 'Региональное ...Нижегородский государственный технический унив...НГТУ5260001439Нижний НовгородПриволжскийvolga
7319ssauИнтегрированные технологии в создании аэрокосм...https://api.socio.center/upload/iblock/2c5/lxs...[{'code': '17', 'name': 'Авиационная и ракетно...[{'code': '6312139922', 'name': 'АО «Ракетно-к...Самарский университетСамарский университет6316000632СамараПриволжскийvolga
8328tsuАгробиотекhttps://api.socio.center/upload/iblock/7f8/8cc...[{'code': '9', 'name': 'Биология и биотехнолог...[{'code': '7017012254', 'name': 'АО «СИБАГРО»'...Томский государственный университетТГУ7018012970ТомскСибирскийsiberia
9330urfuУральская передовая инженерная школа "Цифровое...УПИШhttps://api.socio.center/upload/iblock/2b3/h70...[{'code': '28', 'name': 'Программная инженерия...[{'code': '6673100680', 'name': 'АО «Уральский...Уральский федеральный университетУрФУ6660003190ЕкатеринбургУральскийural

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

Бага сайта «ПИШ»

Обратите особое внимание на комментарий в коден ниже про фикс баги. Дело в том, что API, а далее и графики на сайте ПИШ-а выводят план и факт на одной кривой, не отделяя одно от другого 🤷‍♂️

Парсим показатели программы
kpi_df = pd.DataFrame()

for i, r in shools_list.iterrows():
slug = r['slug'].lower()
url = f'{url_base}/school/{slug}/indicators'
kpi_resp = requests.get(url)
kpi_json = kpi_resp.json()

for group in kpi_json['data']:
group_title = group['title']

for item in group['items']:
kpi_chunk = pd.DataFrame(columns=['plan', 'fact'])

# Данный цикл — фикс баги API сайта Социоцентра
for idx, year in enumerate(item['label']):
if year not in kpi_chunk.index:
kpi_chunk.loc[year, 'plan'] = item['value'][idx]
else:
kpi_chunk.loc[year, 'fact'] = item['value'][idx]

kpi_chunk = kpi_chunk.reset_index().rename(columns={'index': 'year'})
kpi_chunk[['slug', 'group', 'indicator', 'unit', 'description', 'calculation_method']] = [
slug,
group_title,
item['indicator'],
item['unit'],
item['description'],
item['calculationMethod']
]

kpi_df = pd.concat([kpi_df, kpi_chunk], ignore_index=True)

schools_kpis = shools_list.merge(kpi_df, how='right', on='slug')

# Сохраняем полученные KPI
schools_kpis.to_csv(f"{data_folder}/schools_kpis.csv", index=False)
schools_kpis.to_excel(f"{data_folder}/schools_kpis.xlsx", index=False)

Выводим пример основных данных связанных с KPI университетов за прошедшие года:

Пример показателей «ПИШ»
schools_kpis[schools_kpis['year'] <= datetime.datetime.now().year][[
'university.shortName',
'indicator',
'year',
'plan',
'fact',
'unit'
]].sort_values(['indicator', 'university.shortName', 'year']).head(10)
university.shortNameindicatoryearplanfactunit
5210АНО ВО «Университет Иннополис»М__т_6_1__с_03__г_3__ц_47_ПИШ20210NaNтыс. руб.
5211АНО ВО «Университет Иннополис»М__т_6_1__с_03__г_3__ц_47_ПИШ2022250000NaNтыс. руб.
5212АНО ВО «Университет Иннополис»М__т_6_1__с_03__г_3__ц_47_ПИШ2023250000348221.871тыс. руб.
5213АНО ВО «Университет Иннополис»М__т_6_1__с_03__г_3__ц_47_ПИШ2024250000NaNтыс. руб.
5970ГБОУ ВО АГТУ ВШНМ__т_6_1__с_03__г_3__ц_47_ПИШ20210NaNтыс. руб.
5971ГБОУ ВО АГТУ ВШНМ__т_6_1__с_03__г_3__ц_47_ПИШ20220NaNтыс. руб.
5972ГБОУ ВО АГТУ ВШНМ__т_6_1__с_03__г_3__ц_47_ПИШ20230NaNтыс. руб.
5973ГБОУ ВО АГТУ ВШНМ__т_6_1__с_03__г_3__ц_47_ПИШ2024149370NaNтыс. руб.
6350ГГНТУ им. акад. М.Д. МиллионщиковаМ__т_6_1__с_03__г_3__ц_47_ПИШ20210NaNтыс. руб.
6351ГГНТУ им. акад. М.Д. МиллионщиковаМ__т_6_1__с_03__г_3__ц_47_ПИШ20220NaNтыс. руб.

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

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

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

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