Skip to main content

Ferramenta CLI para coleta de dados estruturados de periódicos OJS via OAI-PMH

Project description

OJS-Scrape

Ferramenta CLI e pacote Python para coleta estruturada de dados de periódicos acadêmicos hospedados em OJS (Open Journal Systems).

Escopo ético e vínculo institucional

O ojs-scrape é desenvolvido sem fins lucrativos e sem pretensão de acessar dados sigilosos, contornar controles de acesso ou alterar informações nos servidores das instituições.

A ferramenta é produzida no âmbito das pesquisas do Laboratório de Humanidades Digitais da UFBA (LABHDUFBA).

Decisão metodológica

O ojs-scrape usa OAI-PMH como fonte primária para metadados.

O scraping leve entra apenas como complemento para dados que o protocolo não cobre diretamente, como mapeamento artigo → edição e links de PDF.

Método

Primário: OAI-PMH ({base_url}/oai) para metadados Dublin Core:

  • título
  • autores
  • resumo
  • palavras-chave
  • DOI
  • data
  • fonte/revista
  • idioma
  • identificadores

Complementar: requests + BeautifulSoup para:

  • identificar artigos dentro de edições específicas;
  • enriquecer seção, páginas e link de PDF a partir da TOC;
  • baixar PDFs quando solicitado.

Validação com periódicos OJS reais:

  • Afro-Ásia: 127 registros no recorte 2024-2025 via OAI-PMH. As edições n. 69, 70 e 71 retornam 104 registros quando cruzadas com suas TOCs.
  • História da Historiografia: 842 artigos exportados na coleta completa; 256 artigos no recorte de publicação 2020-2026. Essa revista revelou dois casos tratados pelo pacote: caracteres de controle inválidos no XML OAI-PMH e diferença entre datestamp OAI e data de publicação (dc:date).
  • RENBIO: metadados e PDFs públicos validados em lote, com URL pública terminada em /index normalizada para o endpoint OAI-PMH correto.
  • Revista Brasileira de Sociologia (RBS): metadados validados; download de PDFs validado por amostragem com --pdf-limit, incluindo galleys numéricos e links OJS que precisam ser convertidos de /article/view/... para /article/download/....

Observação sobre datas: --from e --until são interpretados como recorte por data de publicação. O OAI-PMH usa esses parâmetros como datestamp; por isso o pacote aplica também filtro local por dc:date para evitar que artigos antigos atualizados recentemente entrem no recorte.

Escopo e limites de compatibilidade

O ojs-scrape não promete funcionar com qualquer periódico OJS.

Formulação segura: o pacote coleta metadados de periódicos OJS que exponham OAI-PMH público e baixa PDFs públicos quando os artigos usam galleys OJS acessíveis por URL padrão ou detectável.

Para metadados, a compatibilidade depende de:

  • OAI-PMH habilitado e acessível sem autenticação;
  • respostas XML legíveis, mesmo que exijam limpeza de caracteres de controle inválidos;
  • exposição de metadados Dublin Core suficientes (dc:title, dc:creator, dc:date, dc:identifier, etc.);
  • ausência de bloqueios por IP, CAPTCHA, Cloudflare ou rate limit agressivo.

Para PDFs, a compatibilidade depende de:

  • artigos com PDF disponível;
  • PDFs públicos, sem login ou embargo;
  • galleys OJS acessíveis por links padrão ou detectáveis nas páginas dos artigos;
  • servidor estável o suficiente para downloads sucessivos;
  • links de PDF que não estejam quebrados.

Metadados tendem a ser mais confiáveis do que PDFs. A razão é metodológica: OAI-PMH é um protocolo padronizado para colheita de metadados; já o acesso aos PDFs depende da configuração local de galleys, permissões, tema OJS e plugins de cada revista.

Antes de baixar uma coleção inteira de PDFs, teste uma amostra:

ojs-scrape <URL> --from 2024 --until 2025 --pdf --pdf-limit 3 --pdf-dir pdfs_teste/

Se a amostra funcionar, rode o lote completo sem --pdf-limit.

Processo de desenvolvimento com Hermes Agent

Este pacote foi desenvolvido com apoio do Hermes Agent, em diálogo com o pesquisador Eric Brasil.

O processo combinou:

  • validação empírica de endpoints OAI-PMH reais;
  • definição de OAI-PMH como fonte primária;
  • implementação incremental da CLI;
  • testes com revistas concretas, sobretudo Afro-Ásia e História da Historiografia;
  • transformação de falhas reais em testes de regressão;
  • refatoração para padrões atuais de Python;
  • validação com Ruff, MyPy, pytest e build via uv.

Hermes Agent foi usado como ferramenta de trabalho e automação. As decisões metodológicas e acadêmicas permaneceram sob julgamento humano.

Citação

Se usar o ojs-scrape em pesquisa, ensino, desenvolvimento ou análise institucional, cite o software.

Citação recomendada:

BRASIL, Eric. OJS-Scrape: coleta de metadados de periódicos OJS via OAI-PMH. Versão 0.1.0. 2026. Software. Disponível em: https://ericbrasil.com.br/ojs-scrape.

O repositório inclui um arquivo CITATION.cff com metadados de citação.

Agradecimentos e transparência

O projeto agradece a Ricardo Sodré Andrade pela referência intelectual e histórica associada ao Holmes e às experiências de colheita de metadados em periódicos científicos.

Agradece também ao Laboratório de Humanidades Digitais da UFBA (LABHDUFBA) pelo ambiente de pesquisa, interlocução e desenvolvimento metodológico em Humanidades Digitais.

Este pacote e sua documentação foram desenvolvidos com apoio de sistemas de IA generativa, em especial o Hermes Agent, usado como ferramenta de automação, programação assistida, revisão técnica, organização documental e execução de testes.

O uso de IA não substitui julgamento acadêmico, revisão humana ou validação empírica. As decisões sobre método, escopo, interpretação, licenciamento e publicação pertencem ao pesquisador responsável.

Agentes de código que forem usar ou modificar este repositório devem ler AGENTS.md.

Para o histórico das decisões metodológicas e arquiteturais, consulte docs/design-rationale.md.

Para próximas etapas públicas do pacote, consulte docs/roadmap.md.

Para mudanças por versão, consulte CHANGELOG.md.

Instalação para desenvolvimento

git clone <repo>
cd ojs-scrape
uv sync

Executar a CLI local:

uv run ojs-scrape --help

Documentação

A documentação pública do projeto está publicada em:

https://ericbrasil.com.br/ojs-scrape

O site usa MkDocs Material com mkdocstrings para gerar referência de API a partir do código.

Servir localmente:

uv run --group docs mkdocs serve

Gerar o site estático:

uv run --group docs mkdocs build --strict

A publicação da documentação é feita por GitHub Actions em pushes para main, usando GitHub Pages. Pull requests validam o build da documentação sem publicar.

Uso

# Coletar metadados da Afro-Ásia (2024-2025)
ojs-scrape https://periodicos.ufba.br/index.php/afroasia --from 2024 --until 2025

# Salvar JSON
ojs-scrape https://periodicos.ufba.br/index.php/afroasia \
  --from 2024 --until 2025 \
  -o afro_asia_2024_2025.json

# Filtrar por sets/seções OAI-PMH
ojs-scrape https://periodicos.ufba.br/index.php/afroasia \
  --from 2024 --until 2025 \
  --set afroasia:ART afroasia:DOS

# Filtrar por edições OJS (IDs internos da URL /issue/view/{id})
ojs-scrape https://periodicos.ufba.br/index.php/afroasia \
  --from 2024 --until 2025 \
  --issues 2785 2858 2964

# Buscar por autor
ojs-scrape https://periodicos.ufba.br/index.php/afroasia \
  --from 2024 --until 2025 \
  --author "Puntoni"

# Exportar CSV ou BibTeX
ojs-scrape <URL> --from 2024 --until 2025 --format csv -o dados.csv
ojs-scrape <URL> --from 2024 --until 2025 --format bibtex -o dados.bib

# Baixar PDFs junto com metadados
ojs-scrape <URL> --from 2024 --until 2025 --pdf --pdf-dir pdfs/

# Testar rapidamente se o download de PDFs funciona sem baixar tudo
ojs-scrape <URL> --from 2024 --until 2025 --pdf --pdf-limit 3 --pdf-dir pdfs_teste/

Estrutura

src/ojs_scrape/
├── cli.py        # Interface CLI (argparse)
├── oaipmh.py     # Cliente OAI-PMH (Identify, ListSets, ListRecords, GetRecord)
├── models.py     # Dataclasses tipadas: Article, OJSJournal, OAISet
├── toc.py        # Scraping leve de TOCs OJS
├── pdf.py        # Download de PDFs
├── filters.py    # Filtros por edição, autor, set e data
├── exporters.py  # JSON, CSV, BibTeX
└── py.typed      # Marcador PEP 561

Dependências de runtime: requests, beautifulsoup4. Sem API keys. Sem Selenium.

Qualidade de código

uv run ruff format --check .
uv run ruff check .
uv run mypy
uv run pytest -q
uv run pytest -q --run-integration
uv build

Padrões adotados:

  • layout src/;
  • pyproject.toml como fonte única de configuração;
  • Python >=3.12;
  • type aliases com sintaxe type;
  • dataclasses com slots=True;
  • pacote tipado com py.typed;
  • Ruff para lint/format;
  • MyPy em modo strict;
  • testes unitários separados de testes de integração.

Licença

GNU General Public License v3 — em alinhamento com o espírito do PKP Open Harvester Systems (GPL v2). Consulte o arquivo LICENSE.

Referência

O Holmes foi um harvester OAI-PMH desenvolvido por Nanci Oddone e Ricardo Sodré Andrade (LABHD/UFBA) sobre o PKP Open Harvester Systems. Coletou metadados de 26 provedores e 13k+ documentos. Está descontinuado, mas validou o método. O ojs-scrape retoma essa abordagem com nova implementação em Python.

Referência:

  • Oddone, Nanci; Andrade, Ricardo Sodré. "Sistema de acesso à informação baseado em Open Archives: a experiência do Holmes." In: SNBU — Seminário Nacional de Bibliotecas Universitárias, 14., 2006, Salvador. Disponível em: http://repositorio.febab.org.br/items/show/5703

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ojs_scrape-0.1.0.tar.gz (32.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ojs_scrape-0.1.0-py3-none-any.whl (20.8 kB view details)

Uploaded Python 3

File details

Details for the file ojs_scrape-0.1.0.tar.gz.

File metadata

  • Download URL: ojs_scrape-0.1.0.tar.gz
  • Upload date:
  • Size: 32.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for ojs_scrape-0.1.0.tar.gz
Algorithm Hash digest
SHA256 60761d1cf339e20032ecbeda8bad3ac7c6518c71727419d5d59b4255d8107919
MD5 45a1d6ba331a8d472b8a54b22e818721
BLAKE2b-256 ec26bd5e87fea79c9d4eb11f065b109e4e6aed62b355fda60735f1c52204f8b0

See more details on using hashes here.

File details

Details for the file ojs_scrape-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: ojs_scrape-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 20.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for ojs_scrape-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 272333566c4ee257fc6fe1f93e5e0a2d308ddf7c8c33d86cef3ab8d3a16cb628
MD5 c35cf628bd66ccf32d29446d330881c7
BLAKE2b-256 c50eab66eb88a5197ae572c7e490ab4cbcaded979bb525b214d42e8fabd2bf6b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page