Pular para conteúdo

CLI

ojs_scrape.cli

CLI para ojs-scrape.

build_parser

build_parser() -> argparse.ArgumentParser

Cria o parser de argumentos da CLI.

Source code in src/ojs_scrape/cli.py
def build_parser() -> argparse.ArgumentParser:
    """Cria o parser de argumentos da CLI."""
    parser = argparse.ArgumentParser(
        prog="ojs-scrape",
        description="Coleta de dados estruturados de periódicos OJS via OAI-PMH",
    )
    parser.add_argument("url", help="URL base do periódico OJS ou endpoint /oai")
    parser.add_argument("--from", dest="from_date", help="Data inicial (YYYY-MM-DD ou YYYY)")
    parser.add_argument("--until", dest="until_date", help="Data final (YYYY-MM-DD ou YYYY)")
    parser.add_argument(
        "--set",
        dest="set_specs",
        nargs="+",
        help="Sets OAI-PMH para filtrar (ex: afroasia:ART afroasia:DOS)",
    )
    parser.add_argument("--issues", nargs="+", help="IDs das edições (issue view IDs do OJS)")
    parser.add_argument("--author", help="Filtrar por nome de autor (substring)")
    parser.add_argument("--pdf", action="store_true", help="Baixar PDFs dos artigos")
    parser.add_argument("--pdf-dir", default="pdfs", help="Diretório para PDFs (default: pdfs/)")
    parser.add_argument(
        "--pdf-limit",
        type=int,
        help="Baixar no máximo N PDFs; útil para testar se o download funciona",
    )
    parser.add_argument(
        "--format",
        dest="output_formats",
        choices=["json", "csv", "bibtex"],
        nargs="+",
        default=["json"],
        help="Formato(s) de saída: json csv bibtex (default: json)",
    )
    parser.add_argument("-o", "--output", help="Nome base do arquivo de saída, sem extensão")
    parser.add_argument(
        "--delay",
        type=float,
        default=1.0,
        help="Delay mínimo entre requisições em segundos (default: 1.0)",
    )
    parser.add_argument(
        "--timeout",
        type=float,
        default=30.0,
        help="Timeout de rede em segundos (default: 30.0)",
    )
    parser.add_argument("-v", "--verbose", action="store_true", help="Saída verbosa")
    parser.add_argument("-q", "--quiet", action="store_true", help="Saída mínima")
    return parser

main

main(args: Sequence[str] | None = None) -> int

Ponto de entrada da CLI.

Source code in src/ojs_scrape/cli.py
def main(args: Sequence[str] | None = None) -> int:
    """Ponto de entrada da CLI."""
    parser = build_parser()
    opts = parser.parse_args(args)
    _configure_logging(verbose=opts.verbose, quiet=opts.quiet)

    from_date = _normalize_date(opts.from_date)
    until_date = _normalize_date(opts.until_date, is_until=True)

    with OAIPMHClient(opts.url, delay=opts.delay, timeout=opts.timeout) as client:
        journal = client.identify()
        logger.info("Repositório: %s", journal.repository_name)
        logger.info("OAI endpoint: %s", journal.oai_base_url)
        logger.info("Data mais antiga: %s", journal.earliest_datestamp)

        sets = client.list_sets()
        journal.sets = sets
        logger.info("Sets disponíveis: %s", len(sets))
        for oai_set in sets:
            logger.debug("  %s%s", oai_set.spec, oai_set.name)

        articles = _collect_articles(
            client=client,
            from_date=from_date,
            until_date=None,
            set_specs=opts.set_specs,
        )

    if from_date or until_date:
        articles = filter_by_publication_date_range(
            articles,
            from_date=from_date,
            until_date=until_date,
        )
        logger.info("Após filtro por data de publicação: %s artigos", len(articles))

    if opts.issues:
        articles = _filter_by_issues(
            base_url=opts.url,
            issue_ids=opts.issues,
            articles=articles,
            timeout=opts.timeout,
        )

    if opts.author:
        articles = filter_by_author(articles, opts.author)
        logger.info("Após filtro por autor %r: %s artigos", opts.author, len(articles))

    if opts.pdf:
        downloaded = download_pdfs(
            articles, opts.pdf_dir, timeout=opts.timeout, limit=opts.pdf_limit
        )
        if opts.pdf_limit is not None:
            logger.info("PDFs baixados: %s/%s amostrados", len(downloaded), opts.pdf_limit)
        else:
            logger.info("PDFs baixados: %s", len(downloaded))

    output_paths = _export_outputs(articles, opts.output, opts.output_formats)
    exported_count = _active_article_count(articles)
    deleted_count = len(articles) - exported_count
    output_label = ", ".join(output_paths)
    if deleted_count:
        logger.info(
            "Saídas: %s (%s artigos exportados; %s registros deletados ignorados)",
            output_label,
            exported_count,
            deleted_count,
        )
    else:
        logger.info("Saídas: %s (%s artigos)", output_label, exported_count)
    return 0

Ajuda da linha de comando

ojs-scrape --help

Opções principais:

  • --from: data inicial do recorte;
  • --until: data final do recorte;
  • --set: sets/seções OAI-PMH;
  • --issues: IDs internos de edições OJS;
  • --author: filtro local por autor;
  • --format: um ou mais formatos: json, csv, bibtex; padrão: json;
  • -o/--output: nome base da saída, sem extensão; o pacote adiciona .json, .csv ou .bib;
  • --pdf: baixa PDFs públicos;
  • --pdf-limit: limita a quantidade de PDFs baixados para teste;
  • --pdf-dir: diretório de saída dos PDFs;
  • --delay: intervalo mínimo entre requisições;
  • --timeout: timeout de rede.