feat(parsers): новый источник PubMed Central (PMC) — реальный полный текст
Отвечает на "неужели больше нет библиотек" — добавлен четвёртый источник. PMC Open Access Subset (NCBI E-utilities) — крупнейший биомедицинский открытый архив, бесплатный API без обязательного ключа (NCBI_API_KEY — опционально, поднимает лимит 3→10 запросов/сек). В отличие от остальных источников отдаёт РЕАЛЬНЫЙ полный текст статьи (bodyJATS XML) прямо в ответе efetch — 17-53К символов на статью в проверке вживую, не аннотацию и не 700-символьный OCR- фрагмент. Никаких новых зависимостей — xml.etree.ElementTree (stdlib) + httpx, по образцу arxiv.py. - scripts/parsers/pmc.py: esearch (open access[filter]) → efetch (батчи по 20, JATS XML) → плоские словари → unified schema. Год-фильтр, свой User-Agent. - Зарегистрирован в index.run_parser (services/worker-indexer/app/tasks/index.py) и в CLI run_parser.py — доступен как source_type="pmc" наравне с остальными. - 7 юнит-тестов на реальных JATS XML-фрагментах (без сети): извлечение полей, фильтр contrib-type=author (не editor), пустой/битый XML, батч из 2 статей. Рассмотрены и НЕ добавлены: Semantic Scholar (общий rate-limit исчерпан без API-ключа, ключ — самостоятельная регистрация юзера) и CORE.ac.uk (обязателен ключ). Google Scholar/ResearchGate — намеренно не трогаем, скрейпинг нарушает ToS. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -501,6 +501,14 @@ def run_parser(source_id: int) -> dict[str, Any]:
|
||||
"limit": cfg["limit"],
|
||||
"year_from": cfg.get("year_from"),
|
||||
}
|
||||
elif stype == "pmc":
|
||||
from pmc import PMCParser as P
|
||||
fetch_kwargs = {
|
||||
"query": cfg.get("query") or "",
|
||||
"limit": cfg["limit"],
|
||||
"year_from": cfg.get("year_from"),
|
||||
"year_to": cfg.get("year_to"),
|
||||
}
|
||||
else:
|
||||
raise ValueError(f"неизвестный тип источника: {stype}")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user