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:
@@ -63,18 +63,33 @@ def run_arxiv(args: argparse.Namespace, output_dir: Path) -> None:
|
||||
)
|
||||
|
||||
|
||||
def run_pmc(args: argparse.Namespace, output_dir: Path) -> None:
|
||||
from pmc import PMCParser
|
||||
|
||||
parser = PMCParser()
|
||||
parser.run(
|
||||
output_dir=output_dir,
|
||||
query=args.query,
|
||||
limit=args.limit,
|
||||
year_from=args.year_from,
|
||||
year_to=args.year_to,
|
||||
)
|
||||
|
||||
|
||||
def run_all(args: argparse.Namespace, output_dir: Path) -> None:
|
||||
"""Запустить все парсеры последовательно."""
|
||||
logger.info("Запуск всех парсеров...")
|
||||
run_openalex(args, output_dir)
|
||||
run_cyberleninka(args, output_dir)
|
||||
run_arxiv(args, output_dir)
|
||||
run_pmc(args, output_dir)
|
||||
|
||||
|
||||
PARSERS = {
|
||||
"openalex": run_openalex,
|
||||
"cyberleninka": run_cyberleninka,
|
||||
"arxiv": run_arxiv,
|
||||
"pmc": run_pmc,
|
||||
"all": run_all,
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user