API

API (Application programming interface) - это интерфейс (набор сервисов и правил), позволяющий программам и компьютерам общаться друг с другом. В эпоху расцвета data science и всевозможных источников информации в Интернете роль API стремительно возрастает, и особенно это касается наукометрии.

API есть у всех библиометрических баз, кроме Google Scholar. Доступность и платность этих интерфейсов разная, подробности описаны в соответствующих разделах. API позволяют не только получать гораздо больше данных, чем доступно в стандартных пользовательских веб-интерфейсах, но и интегрировать различные информационные потоки в любые другие системы, в том числе в реальном времени.

Мы рассмотрим работу API на примере OpenAlex - открытой и свободной наукометрической базы, которая пока не имеет полноценного веб-интерфейса. Зато ее API совершенно бесплатный для всех, не имеет ограничений, хорошо документирован, а набор метаданных очень богатый. Будем использовать Python - самый популярный и простой язык программирования для работы с данными (здесь его можно легко и бесплатно освоить за несколько дней, а для самого программирования рекомендуем VS Code). Аналогичным образом можно применять любой другой язык, например, R, для которого уже есть набор соответствующих функций.

Ключевой момент: веб-API работают также, как браузеры, отправляя запрос по определенному URL-адресу и получая разные данные. Это значит, что запросы к API вы можете тестировать в браузере без всякого программирования, вставляя в их адресную строку и изучая получаемый результат. Чаще всего он выдается в формате JSON - структурированном и размеченном тексте, понятном человеку, но громоздком. В Firefox по умолчанию встроен удобный просмотр JSON, в Chrome для этого потребуется плагин.

Чтобы выгрузить и складировать данные в excel или csv, нужно немного постараться. В этом нам помогут два модуля Python - Requests (для обращения к базе и получения данных) и Pandas (для их выгрузки в табличном виде и последующего анализа).

В случае OpenAlex мы говорим о различных сущностях: Works, Authors, Venues, Institutions, Concepts.

У каждой из них есть свои внутренние уникальные идентификаторы, отличающиеся первой буквой (например, W2741809807 у публикации, A2027010983 у автора). Также OpenAlex содержит стандартные уникальные идентификаторы для публикаций (doi), авторов (ORCID), источников (ISSN-L) и организаций (ROR), а для многих сущностей - и другие, например, Scopus Author ID.

Соответственно, есть ряд точек входа API, позволяющих получить отдельные сущности и их множества (простые и сгруппированные списки): https://api.openalex.org/works для публикаций, https://api.openalex.org/authors для авторов и т.д.

Чтобы получить всё, что OpenAlex знает про отдельную сущность, следует воспользоваться либо встроенным id:

https://api.openalex.org/works/W3151719968

либо внешним в формате "название:значение":

https://api.openalex.org/works/doi:10.1007/s11192-021-03899-x

Перейдя по этим ссылкам (они же - запросы к API), вы увидите данные в JSON - название публикации, ее авторов, источник, всевозможные атрибуты, и, конечно, число цитирований - как общее, так и в разбивке по годам.

Вот как выглядит функция, которая на входе принимает doi, а выдает число цитирований:

import requests
def get_citcount_by_doi(x):
    url='https://api.openalex.org/works/doi:'+x  #формируем запрос к API
    try:
        r = requests.get(url) #обращаемся к API
        rj = r.json() #берем из результата данные в JSON
        return rj['cited_by_count'] #возвращаем из JSON нужное нам поле
    except:
        return 'none found or error' #если что-то не так, возвращаем ошибку

Разберем типовую задачу: собрать и выгрузить в Excel общее число цитирований набора публикаций по их doi. Пусть у нас есть таблица c:\articles.xlsx с заполненной колонкой с doi и пока пустой колонкой для числа цитирований:

doi cited_by
10.1186/s12859-016-1301-5
10.1186/s12859-016-1272-6
10.1186/s12859-016-1257-5
10.1186/s12859-016-0933-9
10.1186/s12859-016-0878-z

Используя вышеописанную функцию, загружаем и сохраняем цитирования:

import pandas as pd
df=pd.read_excel(r'c:\articles.xlsx') #загружаем таблицу с doi
df['cited_by']=df['doi'].apply(get_citcount_by_doi) #применяем функцию
df.to_excel(r'c:\articles.xlsx') #сохраняем результаты в тот же файл

В завершение разберем работу с множествами сущностей. Для этого мы обращаемся к тем же точкам входа и применяем фильтры, которые можно комбинировать (доступные перечислены здесь). Например, такой запрос выдаст нам всех российских авторов, имеющих более 1000 цитирований:

https://api.openalex.org/authors?filter=last_known_institution.country_code:RU,cited_by_count:%3E1000

(обращаем внимание, что пока в OpenAlex далеко не все авторы привязаны к своим публикациям, что отражается на показателях)

А такой - все источники, опубликовавшие более 1000 работ:

https://api.openalex.org/venues?filter=works_count:%3E1000

Обычно API выдают результаты порциями ("страницами"). OpenAlex позволяет за одно обращение получать до 200 записей, а по умолчанию выдает 25. Мы выгрузим первые 25 публикаций Высшей школы экономики за 2020 г., а о том, как выгружать перебором сколько угодно "страниц" и данных, читайте здесь.

Нужный нам запрос использует универсальный идентификатор организаций ROR:

https://api.openalex.org/works?filter=publication_year:2020,institutions.ror:https://ror.org/055f7t516

import requests
import pandas as pd
df=pd.DataFrame(columns=['doi','title','year','source','cited_by']) #создаем таблицу для результатов
url='https://api.openalex.org/works?filter=publication_year:2020,institutions.ror:https://ror.org/055f7t516'
r = requests.get(url)
rj = r.json() 
for index, item in enumerate(rj['results']): #перебираем результаты и берем нужные поля
        df.at[index,'doi']=item['doi'] #вносим результат в нужную колонку
        df.at[index,'title']=item['title']
        df.at[index,'year']=item['publication_year']
        df.at[index,'source']=item['host_venue']['display_name']
        df.at[index,'cited_by']=item['cited_by_count']
print (df.head())
df.to_excel(r'c:\output.xlsx')

Все подробности про работу с API OpenAlex хорошо описаны в документации. Удачного программирования!

Back to top