Техническая документация на запрос информации о статьях из БД Health Heuristics (BioMedSciHub API)

REST API для поиска и получения научных статей из PubMed, PMC, Europe PMC и OpenAlex

https://biomedscihub.healthheuristics.org

Возможности API

Множество источников

Единый доступ к PubMed, PMC, Europe PMC и OpenAlex через унифицированные эндпоинты

Полные тексты

Получение полных текстов статей из PMC с разбивкой по секциям

Гибкий поиск

Фильтрация по годам, поиск по заголовкам и полнотекстовый поиск

Богатые метаданные

Авторы, журналы, DOI, квартили, сниппеты с подсветкой найденного

Лимиты запросов

Рекомендуемая частота: не более 3 запросов в секунду. При массовом сборе данных добавляйте задержку 0.4 сек между запросами.

HH OpenAlex API

HH PubMed API

GET /hhpubmed/article/{pmid} Получить статью по PMID

Получение полной информации о статье по её PubMed ID, включая абстракт и метаданные.

ПараметрТипОписание
pmid required string PubMed ID статьи (например: 37123456)

Попробовать

GET /hhpubmed/fulltext/{search_text} Полнотекстовый поиск через PMC

Поиск по полным текстам статей в PubMed Central. Возвращает сниппеты с выделением найденных фрагментов.

ПараметрТипОписание
search_text required string Поисковый запрос
max_results optional integer Максимум результатов (1-50)

Попробовать

HH PMC API (Полные тексты)

GET /hhpmc/article/{pmc_id} Получить полный текст статьи

Получение полного текста статьи из PMC с разбивкой по секциям (Introduction, Methods, Results, Discussion и др.).

ПараметрТипОписание
pmc_id required string PMC ID без префикса PMC (например: 7654321)

Структура ответа

fulltext string Полный текст статьи в markdown
fulltext_sections object Секции: {"Introduction": "...", "Methods": "..."}
references array Список цитируемых работ с DOI/PMID

Попробовать

HH Europe PMC API

Руководство по интеграции

1

Базовый URL

Все запросы выполняются к базовому URL API. Авторизация не требуется.

BASE_URL="https://biomedscihub.healthheuristics.org"
2

Формат ответов

API возвращает данные в формате JSON. Все успешные ответы имеют HTTP статус 200. При ошибках возвращается статус 404 или 500 с описанием ошибки.

{
    "query": "covid vaccine",
    "count": 5,
    "source": "pubmed",
    "articles": [
        {
            "title": "...",
            "authors": ["Author One", "Author Two"],
            "abstract": "...",
            "pmid": "12345678",
            "doi": "10.1000/xyz123",
            "journal": "Nature Medicine",
            "year": 2024,
            "has_fulltext": true,
            "quartile": "Q1",
            "snippet": "...relevant <mark>text</mark>...",
            "url": "https://..."
        }
    ]
}
3

Обработка ошибок

Рекомендуется обрабатывать ошибки и таймауты. API может вернуть 404 если статья не найдена, или 500 при проблемах с внешними источниками.

import requests
from requests.exceptions import RequestException

def search_articles(query, max_retries=3):
    for attempt in range(max_retries):
        try:
            response = requests.get(
                f"{BASE_URL}/hhpubmed/articles/{query}",
                timeout=30
            )
            response.raise_for_status()
            return response.json()
        except RequestException as e:
            if attempt == max_retries - 1:
                raise
            time.sleep(1)  # Ожидание перед повтором
4

Пагинация и лимиты

Используйте параметр max_results для ограничения количества результатов. Для получения большего количества статей выполняйте несколько запросов с разными фильтрами (например, по годам).

# Сбор статей по годам
all_articles = []
for year in range(2020, 2025):
    response = requests.get(
        f"{BASE_URL}/hhpubmed/articles/cancer immunotherapy",
        params={
            "year_from": year,
            "year_to": year,
            "max_results": 100
        }
    )
    all_articles.extend(response.json()["articles"])
    time.sleep(0.5)  # Соблюдение rate limit
5

Получение полных текстов

Для получения полного текста статьи сначала найдите её PMC ID через поиск, затем запросите полный текст через эндпоинт /hhpmc/article/{pmc_id}.

# 1. Поиск статьи
search = requests.get(f"{BASE_URL}/hhpubmed/articles/CRISPR").json()

# 2. Проверка доступности полного текста
for article in search["articles"]:
    if article.get("has_fulltext"):
        # Полный текст доступен
        print(f"Full text available: {article['title']}")
        
        # 3. Запрос полного текста (если есть pmc_id)
        if article.get("pmc_id"):
            pmc_id = article["pmc_id"].replace("PMC", "")
            fulltext = requests.get(f"{BASE_URL}/hhpmc/article/{pmc_id}").json()
            
            # 4. Доступ к секциям
            intro = fulltext.get("fulltext_sections", {}).get("Introduction", "")
            methods = fulltext.get("fulltext_sections", {}).get("Methods", "")

Структуры данных

Article (Статья)

title string Заголовок статьи
authors array[string] Список имён авторов
journal string Название журнала
year integer Год публикации
abstract string Абстракт статьи
snippet string Сниппет с подсветкой найденного текста (HTML <mark>)
pmid string | null PubMed ID
doi string | null Digital Object Identifier
url string Ссылка на статью
has_fulltext boolean Доступен ли полный текст
quartile string | null Квартиль журнала (Q1, Q2, Q3, Q4)
source string Источник данных (pubmed, openalex, europepmc, pmc)

Response (Ответ поиска)

query string Исходный поисковый запрос
count integer Количество возвращённых статей
source string Источник данных
articles array[Article] Массив найденных статей