Ir para o conteúdo

Visualização e Qualidade de Dados no Wikidata/Abordagens Computacionais/Pywikibot/script

De Wikiversidade

Pywikibot é uma biblioteca e conjunto de implementação em Python desenvolvidos para automatizar tarefas em wikis do MediaWiki (incluindo todos os projetos Wikimedia, como Wikipedia e Wikidata). Originalmente criado para auxiliar edições automatizadas na Wikipédia, o Pywikibot evoluiu para tornar-se uma ferramenta amplamente utilizada em diversos projetos da Fundação Wikimedia e também em instalações independentes do MediaWiki.

Na essência, o Pywikibot fornece uma interface em Python para a API do MediaWiki, abstraindo detalhes de requisições HTTP e permitindo que desenvolvedores escrevam bots de forma relativamente simples. Com ele, é possível escrever códigos que leem e modificam páginas, adicionam ou removem categorias, inserem referências, migram conteúdos, entre muitas outras atividades repetitivas, tudo isso de modo automatizado e conforme as regras de bot do projeto. A biblioteca cuida de aspectos importantes como autenticação, limites de taxa (rate limiting), tratamento de exceções e repetição de tentativas em caso de falhas temporárias, facilitando a vida de quem programa bots.

O Pywikibot vem acompanhado de diversos códigos prontos (códigos utilitários) para tarefas comuns, por exemplo, um código para substituir texto em múltiplas páginas, outro para criar itens no Wikidata a partir de uma lista, etc. Esses códigos podem ser configurados e executados diretamente por usuários sem muito conhecimento de programação. Alternativamente, desenvolvedores podem usar o framework Pywikibot em seus próprios códigos Python, aproveitando as classes e métodos para navegar entre páginas, itens e propriedades.

Em suma, o Pywikibot atua como framework de bot para o universo Wikimedia, tornando viável a manutenção de projetos massivos como a Wikipédia e o Wikidata por meio de contribuições automatizadas. Seu uso adequado pode ajudar a manter os dados consistentes, acrescentar informações em massa, ou realizar correções padronizadas.

"""
Script de exemplo para acessar dados do Wikidata usando a biblioteca Pywikibot.
Demonstra como carregar um item específico e analisar suas declarações (claims).
"""

import pywikibot

# Configura a conexão com o Wikidata
# Primeiro parâmetro: projeto (wikidata)
# Segundo parâmetro: família de sites (wikidata)
site = pywikibot.Site("wikidata", "wikidata")

# Obtém o repositório de dados para operações com entidades do Wikidata
# Este objeto permite acessar itens, propriedades e outras entidades estruturadas
repo = site.data_repository()

# Carrega o item Douglas Adams (Q42) - famoso autor de "O Guia do Mochileiro das Galáxias"
# Q42 é o identificador único do Douglas Adams no Wikidata
item = pywikibot.ItemPage(repo, "Q42")

# Obtém os dados do item via API do Wikidata
# Este método faz uma requisição HTTP para buscar todos os dados do item
# Inclui labels, descrições, aliases e todas as declarações (claims)
item.get()

# Itera pelas primeiras 5 propriedades para demonstrar a estrutura de dados
# claims é um dicionário onde:
# - Chave: ID da propriedade (ex: P31 para "instância de")
# - Valor: lista de declarações para essa propriedade
claims = item.claims

# list(claims.items())[:5] converte o dicionário em lista e pega os primeiros 5 elementos
# Isso evita processar todos os dados em itens muito populados
for prop_id, claim_list in list(claims.items())[:5]:
    num_refs = 0  # Inicializa contador de referências
    
    # Verifica se existe pelo menos uma declaração para esta propriedade
    if claim_list:
        # claim_list[0] acessa a primeira declaração desta propriedade
        # .sources retorna a lista de fontes/referências desta declaração
        # len() conta quantas referências existem
        num_refs = len(claim_list[0].sources)
    
    # Exibe o ID da propriedade e número de referências da primeira declaração
    # Formato: "P31: 2 referência(s)"
    print(f"{prop_id}: {num_refs} referência(s)")

# Exemplo de saída esperada:
# P31: 1 referência(s)  [instância de: ser humano]
# P569: 1 referência(s) [data de nascimento: 1952-03-11]
# P570: 1 referência(s) [data de falecimento: 2001-05-11]
# P19: 2 referência(s)  [local de nascimento: Cambridge]
# P20: 1 referência(s)  [local de falecimento: Santa Barbara]

"""
1. Estrutura de dados do Wikidata:
   - Cada item (Q...) pode ter múltiplas propriedades (P...)
   - Cada propriedade pode ter múltiplas declarações (claims)
   - Cada declaração pode ter múltiplas referências (sources)

2. Uso:
   - item.get() carrega TODOS os dados do item, o que pode ser pesado para itens muito populados
   - [:5] limita a análise às 5 primeiras propriedades para demonstração

3. Expansões possíveis:
   - Para obter labels das propriedades: repo.getPropertyLabel(prop_id)
   - Para acessar valores das declarações: claim_list[0].getTarget()
   - Para iterar por todas as declarações de uma propriedade, não apenas a primeira
"""