Saltar para: Posts [1], Pesquisa [2]

Bits & Bots

Robôs e pedaços de bits do planeta wikimédia e arredores.

Bits & Bots

Robôs e pedaços de bits do planeta wikimédia e arredores.

"Por Jnvalves (Obra do próprio) [CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0)], undefined" href="https://commons.wikimedia.org/wiki/File%3AO_Fanal%2C_Ilha_da_Madeira%2C_Portugal.jpg">

Tutorial de pywikipediabot - IV

por Alchimista, em 18.01.13

No wikivoyage.org houve necessidade de mover uma enorme quantidade de páginas que estavam no formato "JAMGuides:" para "Wikivoyage:", não deixando para trás redirecionamentos, algo que se revelou extremamente simples. O pormenor foi a flag temporária de administrador que o bot recebeu, para poder não deixar redirecionamentos, pois isso é basicamente uma eliminação automática dos mesmos. Como o projecto tem ainda poucas páginas, e era uma operação básica, a listagem das páginas foi obtida pela lista de páginas totais no domínio principal, caso contrário teria de ser usada uma outra opção, e, além do mais, a opção mais lógica, que é a busca por páginas começadas por uma determinada string não estava a funcionar correctamente, portanto seguiu-se esta via. O script em sí é básico, e creio, facilmente entendível:

  

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import wikipedia as pywikibot
import pagegenerators


def main():

    # Definir o site, e obter a listagem de todas as páginas do domínio principal.
    site = pywikibot.getSite("pt","wikivoyage")
    gen = pagegenerators.AllpagesPageGenerator(site=site,includeredirects=False)
    for i in gen:

        # Aqui filtramos os títulos que começam por "JAMGuides", separando primeiro

        # o título tendo por base o ":", e, caso tenha o ":", verificar se antes da ocorrência

        # o texto é "JAMGuides".
        if i.title().split(":")[0] == u'JAMGuides':

            # Criação do novo título, a segunda parte é igual, logo compõem-se o novo título fácilmente
            ntitle = u"Wikivoyage:%s" % i.title().split(":")[1]
            print u"old title: ", i.title(), u" |--->  new title: ", ntitle, u" |--> afluentes: "
            try:

                # E por fim move-se a página para o novo título.
                i.move(ntitle, leaveRedirect=False, reason=u"[[Wikivoyage:BOT|BOT]]: A mover páginas para título correcto.")
            except:
                print u"error"
        else:
            pass

if __name__ == "__main__":
    try:
        main()
    finally:
        pywikibot.stopme() 

https://github.com/alchimista/pywikipedia-tutorial

 

 


Tutorial de pywikipediabot - III

por Alchimista, em 20.09.12

Neste tópico abordaremos outras funcionalidades interessantes do pywikipediabot, nomeadamente a obtenção no namespace de uma página, quer no formato numérico, quer no nome do namespace. Veremos igualmente como obter o título da página principal, ou seja, por exemplo no caso wikipedia:Ajuda/edição, obter wikipedia:Ajuda, ou então somente Ajuda. Há outras formas de filtrar os artigos, por exemplo, se apenas pretendesse-mos os artigos do domínio wikipéda da categoria !Robótica, o módulo pagegenerators tem opções para isso, mas para já, iremos aumentando a complexidade aos poucos.

 

Informação sobre os namespaces pode ser encontrada em Mediawiki.org:Manual:Namespaces, ou Mediawiki.org:Namespaces. Nos projectos locais é frequente usarem para além dos namespaces padrão, formas personalisadas, e, na wikipédia Lusófona por exemplo, a documentação pode ser encontrada em Wikipédia:Domínio.

 

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#	   
#	   (C) 2012 Alchimista <alchimistawp@gmail.com>
#		 
#		Distributed under the terms of the GNU GPL license.

import sys, os

import wikipedia
import catlib
import pagegenerators

def main():
	site = wikipedia.Site("pt", "wikipedia")
	cat = catlib.Category(site, u"!Robótica")
	''' Como explicado anteriormente, temos definido o site e a categoria
		podendo então passar-mos a obter a listagem das páginas,
		onde desta vez usaremos o pagegenerators. Uma opção mais rápida será
		usar igualmente o preloadingGen, bastando para isso
		fazer algo como 
		pages = pagegenerators.PreloadingGenerator(pagegenerators.CategorizedPageGenerator(cat))
		Isto faz com que as páginas sejam carregadas no início, ao contrário
		do script actual, que carrega à medida que forem necessárias. 
	'''
	pages = pagegenerators.CategorizedPageGenerator(cat)
	for page in pages:
		'''Agora que temos a iteração vamos primeiro obter o título
		'''
		print page.title()
		
		''' Com o page.namespace() obtemos o namespace da página
			embora no formato canonico, ou seja, número. Para obter
			o nome do namespace, fazemos o site.namespace().
			Para fazer tudo junto, basta substituir as duas linhas por
			namespace = site.namespace(page.namespace())
		'''
		
		pageNamespaceNumber = page.namespace()
		namespace = site.namespace(pageNamespaceNumber)
		if namespace == u"Ajuda":
			''' Aqui filtramos as páginas que pertencem ao namespace Ajuda
				e obteremos o nome do namespace, assim como as predefinições
				contidas nas páginas. '''
			print len(page.get())
			print u"namespace: ", site.namespace(page.namespace())
			print u"templates: ", page.templates()
		elif namespace == u"Wikipédia":
			''' Neste bloco, apenas os artigos do namespace wikipédia são filtrados,
				e obteremos o namespage e o título do artigo, sem namespace ou subpáginas
				(resumidamente, o título do artigo principal)
			'''
			print u"namespace: ", site.namespace(page.namespace())
			print u"Página principal (título sem subpágina): ", page.sectionFreeTitle()
			print u"Página principal sem título nem namespace: ", page.title(withNamespace=False)
			
			
if __name__ == "__main__":
	try:
		main()
	finally:
		wikipedia.stopme()	

https://github.com/alchimista/pywikipedia-tutorial 

Tutorial de pywikipediabot - II

por Alchimista, em 19.09.12

 

No primeiro post vimos como de uma forma básica se pode obter o conteúdo de uma página. Infelizmente, na sua utilização tradicional, os bots são utilizados para edições massiças, ou então para obter informação de um grande número de páginas pelo que o script anterior não nos seve, então vamos interagir com categorias. Há um pormenor importante a realçar: caso se trate de obter informação de um grande número de páginas, é extremamente aconselhado usar dumps, que podem ser obtidos em http://dumps.wikimedia.org/,por exemplo. Mais informação pode ser obtida em Meta:Data dumps.

 

No script seguinte, contaremos os artigos de uma categoria. Obteremos o título dos artigos, e contaremos os elementos. Relativamente ao script do primeiro post, o código ficará dentro de uma definição ( def main()) para tirar-mos vantagem do wikipedia.stopme(), que basicamente informa o servidor de que o script fez o seu trabalho, interrompendo a ligação.

 

 

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#	   
#	   (C) 2012 Alchimista <alchimistawp@gmail.com>
#		 
#		Distributed under the terms of the GNU GPL license.

import sys, os

import wikipedia
import catlib
import pagegenerators

def main():
	''' Esta é a def onde o nosso script vai estar '''
	
	site = wikipedia.Site("pt", "wikipedia") # definimos que o site é a pt.wp
	
	'''De seguida, definimos a categoria Ambiente
	 e obtemos a listagem dos títulos dos artigos.
	 Na demonstração o código está por extenso para
	 mais fácil percepção, na prática, bastaria
	 pages = catlib.Category(site, u"Ambiente").articles()
	 para se obter a listagem	  
	'''
	cat = catlib.Category(site, u"Ambiente") # Aqui definimos a categoria Ambiente. 
	catList = cat.articlesList()


	'''Agora que temos uma listagem,
	 e antes de contar os elementos,
	 vamos ver os títulos que constam na catList.
	 
	 Esta abordagem serve bem para ilustrar este exemplo,
	 caso fosse para interagir directamente com os artigos,
	 como veremos noutro post, há abordagens mais eficientes.
 
	 O primeiro print, ou seja, no caso o objecto page,
	 é um objecto python, enquanto que o segundo print,
	 o do page.title(), já tem o formato de unicode.
	'''
	
	for page in catList:
		print u"página (objecto):", page
		print u"Título da página: ", page.title() # mostra o título do artigo


	''' Por fim, fazemos a contagem dos artigos	'''
	
	print u"\n Nº de artigos na categoria: ", len(catList)
	
if __name__ == "__main__":
	try:
		main()
	finally:
		wikipedia.stopme()	

https://github.com/alchimista/pywikipedia-tutorial

Tutorial de pywikipediabot - I

por Alchimista, em 19.09.12

Não há muitos developers de bots na pt.wp, na verdade, contam-se pelos dedos das mãos aqueles que criam regularmente scripts próprios. A verdade é que nunca houve um grupo activo dedicado ao pywp, contrariamente por exemplo, ao que acontece com os gadjects, ou scripts em javascript.

 

Com isso em mente, há há agum tempo que planeio criar um tutorial para que os primeiros passos sejam mais fáceis, pois a verdade é que não há propriamente um ponto de partida que contenha informação suficientemente desenvolvida para que possa ser um verdadeiro manual introdutório. Enquanto não arranjo tempo e vontade para escrever um manual explicativo e bem estruturado, espero ir colocando aqui informações avulsas que possam ajudar, e, quem sabe, no final compilar tudo num tutorial final, na wikipédia.

 

Pois bem, o primeiro exemplo de um script pywp terá como finalidade colocar um texto numa página da wikipédia. Estes primeiros passos vão ser explicados com mais detalhe, porque a verdade é que na esmagadora maioria dos meus scripts, o pywp ocupa apenas uma pequena parte, e é sensivelmente sempre a mesma, ou seja, para as tarefas do quotidiano, conhecer meia dúzia de classes e definições é quanto baste para criar scripts úteis no dia a dia wikipédico.

 

No script seguinte, vamos obter o texto de Wikipédia:Página de testes/4  e substitui-lo por "Olá Mundo! Isto é um teste de edição :D". Presume-se que tenham conhecimentos básicos de python, caso haja dificuldade em compreender algo, a secção de comentários está á disposição.

 

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#       
#       (C) 2012 Alchimista <alchimistawp@gmail.com>
#         
#        Distributed under the terms of the GNU GPL license.

import sys, os

try:
	sys.path.append(os.environ['HOME'] + '/wp/bots/pywikipedia')
except:
	pass

''' 
 Primeiro importamos o módulo wikipedia, o qual nos trará as soluções mais básicas,
 e ao mesmo tempo grande parte das que normalmente são necessárias para interagir com
 o mediawiki. '''

import wikipedia

''' O primeiro passo antes de interagir com a API do mediawiki, é definir
qual o projecto/site com que estamos a lidar, para isso usamos:
'''
site= wikipedia.Site("pt", "wikipedia") # definimos que o site é a pt.wp

''' Agora, vamos estabelecer as definições de uma página, neste caso,
 a página de testes/4: '''

wpage = wikipedia.Page(site, u"wikipédia:Página de testes/4")

''' Agora que definimos a página, vamos obter o texto da página: '''
wpagetext = wpage.get()

print wpagetext # print ao conteúdo da página

''' Tendo o conteúdo, e ignorando-o por completo, vamos então substituir
 por um novo texto.
'''
newtext = u"Olá Mundo! Isto é um teste de edição :D" # definimos o novo texto

wikipedia.showDiff(wpagetext, newtext) # mostra o diferencial da edição sem salvar

Mais sobre mim

foto do autor

Arquivo

  1. 2017
  2. J
  3. F
  4. M
  5. A
  6. M
  7. J
  8. J
  9. A
  10. S
  11. O
  12. N
  13. D
  14. 2016
  15. J
  16. F
  17. M
  18. A
  19. M
  20. J
  21. J
  22. A
  23. S
  24. O
  25. N
  26. D
  27. 2015
  28. J
  29. F
  30. M
  31. A
  32. M
  33. J
  34. J
  35. A
  36. S
  37. O
  38. N
  39. D
  40. 2014
  41. J
  42. F
  43. M
  44. A
  45. M
  46. J
  47. J
  48. A
  49. S
  50. O
  51. N
  52. D
  53. 2013
  54. J
  55. F
  56. M
  57. A
  58. M
  59. J
  60. J
  61. A
  62. S
  63. O
  64. N
  65. D
  66. 2012
  67. J
  68. F
  69. M
  70. A
  71. M
  72. J
  73. J
  74. A
  75. S
  76. O
  77. N
  78. D
  79. 2011
  80. J
  81. F
  82. M
  83. A
  84. M
  85. J
  86. J
  87. A
  88. S
  89. O
  90. N
  91. D