Usuario:InfoBot/infobot.py

De Wikipedia, la enciclopedia libre
# -*- coding: utf-8  -*-

#    Jesús Ruiz-Ayúcar Vázquez <chuso AT gnoma DOT es>
#    Copyright (C) 2007  Jesús Ruiz-Ayúcar Vázquez
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.

import sys, re , time, sets, getopt
import wikipedia, pagegenerators, catlib, config

# Acerca de infobot.py:
#
# Este script se encarga de averiguar qué campos del infobox de ciudades están completados
# El único requisito es partir de una página en la que todos los enlaces apunten a los municipios
# que se quieran analizar. Se puede personalizar los campos comprobar, para ello deben ponerse a 
# True o False cada parámetro. Además, para poder comprobar que la alcaldía y el censo están actualizados
# se deben utilizar los campos alcalde_año y ine_año en el infobox respectivamente.
#
# Para establecer la página sobre la que trabajar hay que añadir la ruta relativa en el campo url

# Parámetros globales
url = u"Wikiproyecto:Toledo/Infobox"	# url en la que están los enlaces a municipios
infobox = False				# Para comprobar existencia del infobox
mapa = True				# Para comprobar existencia del mapa
coor = False				# Para comprobar existencia de las coordenadas
altitud = False				# Para comprobar existencia de la altitud
superficie = False			# Para comprobar existencia de la superficie
poblacion = False			# Para comprobar existencia de población. 
					# Debe tener un año ine en el campo ine_anyo
ine_anyo = 2006
gentilicio = True			# Para comprobar existencia del gentilicio
alcaldia = False			# Para comprobar existencia de la alcaldía (alcalde o 
					# alcaldesa). Debe tener un año de alcaldía en alcaldia_anyo
alcaldia_anyo = 2007
tamanyo = True				# Para extraer el tamaño del documento
codigo_postal = True			# Para comprobar existencia del código postal
escudo = True				# Para comprobar existencia del escudo
bandera = True				# Para comprobar existencia de la bandera
patron = True				# Para comprobar existencia del patrón
patrona = True				# Para comprobar existencia de la patrona
partido = True				# Para comprobar existencia del partido judicial
capital = True				# Para comprobar existencia de la distancia a la
					# capital de provincia. Debe tener el nombre de la
					# capital en nombre_capital
nombre_capital = "Toledo"

verbose = False				# Modo verboso, para que muestre información por consola
debug = False				# Modo debug, para que no actualicer y comprobar
					# previamente el resultado

yes = u"Ok"				# Texto que indicará que el campo existe y es correcto
no = u""				# Texto que indicará que el campo no existe o es erróneo

def usage():
	wikipedia.output(u"Cómo usar este script\n")
	wikipedia.output(u"-h, --help: Muestra esta ayuda")
	wikipedia.output(u"-d, --debug: Modo debug. No actualiza la página y muestra la salida")
	wikipedia.output(u"--infobox=[si|no]: Comprobar existencia de infobox")
	wikipedia.output(u"--mapa=[si|no]: Comprobar existencia de mapa")
	wikipedia.output(u"--coor=[si|no]: Comprobar existencia de coordenadas")
	wikipedia.output(u"--altitud=[si|no]: Comprobar existencia de altitud")
	wikipedia.output(u"--superficie=[si|no]: Comprobar existencia de superficie")
	wikipedia.output(u"--poblacion=[si|no]: Comprobar existencia de poblacion")
	wikipedia.output(u"--ine_ayo=[año]: Establecer año del censo INE")
	wikipedia.output(u"--gentilicio=[si|no]: Comprobar existencia de gentilicio")
	wikipedia.output(u"--alcaldia=[si|no]: Comprobar existencia de alcaldia")
	wikipedia.output(u"--alcaldia_anyo=[año]: Establecer primer año de la legislatura de la alcaldia")
	wikipedia.output(u"--tamanyo=[si|no]: Mostrar tamaño del artículo")
	wikipedia.output(u"--codigo_postal=[si|no]: Comprobar existencia de codigo postal")

def getparams():
	global infobox, mapa, coor, altitud, superficie, poblacion, ine_anyo, gentilicio, alcaldia, alcaldia_anyo, tamanyo, codigo_postal
	try:
		opts, args = getopt.getopt(sys.argv[1:], "hd:v", ["help", "debug", "infobox=", "mapa=", "coor=", "altitud=", "superficie=", "poblacion=", "ine_anyo=", "gentilicio=", "alcaldia=", "alcaldia_anyo=", "tamanyo=", "codigo_postal="])
	except getopt.GetoptError:
		# Mostrar información de ayuda y salir
		usage()
		sys.exit(2)
	for o, a in opts:
		if o == "-v":
			verbose = True
		if o in ("-h", "--help"):
			usage()
			sys.exit()
		if o in ("-d", "--debug"):
			debug = True
		if o in ("--infobox"):
			if a in ("si", "Si"):
				infobox = True
			if a in ("no", "No"):
				infobox = False
		if o in ("--mapa="):
			if a in ("si", "Si"):
				mapa = True
			if a in ("no", "No"):
				mapa = False
		if o in ("--coor="):
			if a in ("si", "Si"):
				coor = True
			if a in ("no", "No"):
				coor = False
		if o in ("--altitud="):
			if a in ("si", "Si"):
				altitud = True
			if a in ("no", "No"):
				altitud = False
		if o in ("--superficie="):
			if a in ("si", "Si"):
				superficie = True
			if a in ("no", "No"):
				superficie = False
		if o in ("--poblacion="):
			if a in ("si", "Si"):
				poblacion = True
			if a in ("no", "No"):
				poblacion = False
		if o in ("--gentilicio="):
			if a in ("si", "Si"):
				gentilicio = True
			if a in ("no", "No"):
				gentilicio = False
		if o in ("--alcaldia="):
			if a in ("si", "Si"):
				alcaldia = True
			if a in ("no", "No"):
				alcaldia = False
		if o in ("--tamanyo="):
			if a in ("si", "Si"):
				tamanyo = True
			if a in ("no", "No"):
				tamanyo = False
		if o in ("--codigo_postal="):
			if a in ("si", "Si"):
				codigo_postal = True
			if a in ("no", "No"):
				codigo_postal = False
		if o in ("--ine_anyo="):
			ine_anyo = a
		if o in ("--alcaldia_anyo="):
			alcaldia_anyo = a

def main():
	# Parametros wikipedia
	es_site = wikipedia.Site('es','wikipedia','InfoBot')
	sp = wikipedia.Page(es_site, url)
	
	getparams()
	
	# Salida preliminar
	salida=u""
	salida+=u"{| class=\"wikitable\"\n"
	salida+=u"|+ '''Código de colores'''\n"
	salida+=u"! Color\n"
	salida+=u"! Clave\n"
	salida+=u"! Rango (bytes)\n"
	salida+=u"|-\n"
	salida+=u"| bgcolor=\"#ff0000\"| || #ff0000 || 0-500\n"
	salida+=u"|-\n"
	salida+=u"| bgcolor=\"#ff3000\"| || #ff3000 || 501-1000\n"
	salida+=u"|-\n"
	salida+=u"| bgcolor=\"#ff6000\"| || #ff6000 || 1001-2000 \n"
	salida+=u"|-\n"
	salida+=u"| bgcolor=\"#ff9000\"| || #ff9000 || 2001-3000\n"
	salida+=u"|-\n"
	salida+=u"| bgcolor=\"#ffc000\"| || #ffc000 || 3001-4000\n"
	salida+=u"|-\n"
	salida+=u"| bgcolor=\"#ffff00\"| || #ffff00 || 4001-5000\n"
	salida+=u"|-\n"
	salida+=u"| bgcolor=\"#ccff00\"| || #ccff00 || 5001-6000\n"
	salida+=u"|-\n"
	salida+=u"| bgcolor=\"#99ff00\"| || #99ff00 || 6001-7000\n"
	salida+=u"|-\n"
	salida+=u"| bgcolor=\"#66ff00\"| || #66ff00 || 7001-8000\n"
	salida+=u"|-\n"
	salida+=u"| bgcolor=\"#33ff00\"| || #33ff00 || 8001-9000\n"
	salida+=u"|-\n"
	salida+=u"| bgcolor=\"#00ff00\"| || #00ff00 || >9001\n"
	salida+=u"|}\n\n"
	salida+=u"{| class=\"sortable wikitable\"\n"
	salida+=u"! Municipio\n"
	if infobox:
		salida+=u"! Infobox\n"
	if mapa:
		salida+=u"! Mapa\n"
	if coor:
		salida+=u"! Coord\n"
	if altitud:
		salida+=u"! Altitud\n"
	if superficie:
		salida+=u"! Superf\n"
	if poblacion:
		salida+=u"! Pob. %d\n" % (ine_anyo)
	if gentilicio:
		salida+=u"! Gentilicio\n"
	if alcaldia:
		salida+=u"! Alcaldía %d\n" % (alcaldia_anyo)
	if codigo_postal:
		salida+=u"! CP\n"
	if escudo:
		salida+=u"! Escudo\n"
	if bandera:
		salida+=u"! Bandera\n"
	if patron:
		salida+=u"! Patrón\n"
	if patrona:
		salida+=u"! Patrona\n"
	if partido:
		salida+=u"! Partido\n"
	if capital:
		salida+=u"! Distancia a capital\n"
	if tamanyo:
		salida+=u"! Tamaño\n"
	
	# Generamos lista de poblaciones
	gen = pagegenerators.LinkedPageGenerator(sp)
	gen = pagegenerators.NamespaceFilterPageGenerator(gen,[0])
	preloadingGen = pagegenerators.PreloadingGenerator(gen, pageNumber = 500)
	
	# Navegamos por cada municipio para extraer información
	for page in preloadingGen:
		# Obtenemos solo enlaces a páginas "reales"
		if re.search(ur"Image",page.title()):
			continue
		if page.isRedirectPage():
			page=wikipedia.Page(page.site(), page.getRedirectTarget())
	
		# Extraemos el texto
		texto=page.get()
	
		# Comprobamos si tiene infobox
		if infobox:
			infobox_output=no
			if re.search(ur"(?s)\{\{[Ii]nfobox.ciudad.España",texto):
				infobox_output=yes
	
		# Comprobamos si tiene mapa
		if mapa:
			mapa_output=no
			if re.search(ur"(?s)\|\s*[iI]magen?\s*=\s*\[\[[Ii]magen?:.+\]\]", texto):
				mapa_output=yes
	
		# Comprobamos si tiene coordenadas
		if coor:
			coor_output=no
			if re.search(ur"(?s)\|\s*coor\s*=\s*\{\{coor d?m?s?\|[\d\|]+\|[NnSs][\d\|]+\|[EeOoWw][\|]?\}\}", texto):
				coor_output=yes
	
		# Comprobamos si tiene altitud
		if altitud:
			altitud_output=no
			if re.search(ur"(?s)\|\s*altitud\s*=\s*\d", texto):
				altitud_output=yes
	
		# Comprobamos si tiene superficie
		if superficie:
			superficie_output=no
			if re.search(ur"(?s)\|\s*superficie\s*=\s*\d", texto):
				superficie_output=yes
	
		# Comprobamos si tiene población
		if poblacion:
			poblacion_output=no
			if re.search(ur"(?s)\|\s*población\s*=\s*\d", texto):
				if re.search(ur"(?s)\|\s*ine_año\s*=\s*%d" % (ine_anyo), texto):
					poblacion_output=yes
	
		# Comprobamos si tiene gentilicio
		if gentilicio:
			gentilicio_output=no
			if re.search(ur"(?s)\|\s*gentilicio\s*=\s*[\wá-úÁ-ÚñÑ]+", texto):
				gentilicio_output=yes
		
		if codigo_postal:
			codigo_postal_output=no
			if re.search(ur"(?s)\|\s*cp\s*=\s*\d{4,5}", texto):
				codigo_postal_output=yes
	
		# Comprobamos si tiene alcalde
		if alcaldia:
			alcaldia_output=no
			if re.search(ur"(?s)\|\s*alcalde(sa)?\s*=\s*\[?\[?[\wá-úÁ-ÚñÑ]+", texto):
				if re.search(ur"(?s)\|\s*alcalde(sa)?_año\s*=\s*%d" % (alcaldia_anyo), texto):
					alcaldia_output=yes
	
		# Comprobamos si tiene escudo
		if escudo:
			escudo_output=no
			if not re.search(ur"(?s)\|\s*escudo\s*=\s*no", texto):
				if re.search(ur"(?s)\|\s*escudo\s*=\s*[\wá-úÁ-ÚñÑ\-\_\.]+", texto):
					escudo_output=yes

		# Comprobamos si tiene bandera
		if bandera:
			bandera_output=no
			if not re.search(ur"(?s)\|\s*bandera\s*=\s*no", texto):
				if re.search(ur"(?s)\|\s*bandera\s*=\s*[\wá-úÁ-ÚñÑ\-\_\.]+", texto):
					bandera_output=yes

		# Comprobamos si tiene patrón
		if patron:
			patron_output=no
			if re.search(ur"(?s)\|\s*patrón\s*=\s*\[?\[?[\wá-úÁ-ÚñÑ]+", texto):
				patron_output=yes

		# Comprobamos si tiene patrona
		if patrona:
			patrona_output=no
			if re.search(ur"(?s)\|\s*patrona\s*=\s*\[?\[?[\wá-úÁ-ÚñÑ]+", texto):
				patrona_output=yes

		# Comprobamos si tiene partido
		if partido:
			partido_output=no
			if re.search(ur"(?s)\|\s*partido\s*=\s*\[?\[?[\wá-úÁ-ÚñÑ]+", texto):
				partido_output=yes

		# Comprobamos si tiene la distancia a la capital
		if capital:
			capital_output=no
			m = re.search(ur"(?s)\|\s*referencia(\d*)\s*=\s*\[?\[?%s\]?\]?" % (nombre_capital),texto,re.IGNORECASE)
			if (m):
				ref_id = m.group(1)
				p = re.search(ur"(?s)\|\s*distancia%s\s*=\s*\d+" % (ref_id),texto)
				if (p):
					capital_output=yes

		# Asignamos un color en función del tamaño en bytes de la página
		if tamanyo:
			tam=len(texto)
			if tam <500:
				tam_s='bgcolor="#ff0000" | %d' % (tam)
			elif tam < 1000:
				tam_s='bgcolor="#ff3000" | %d' % (tam)
			elif tam < 2000:
				tam_s='bgcolor="#ff6000" | %d' % (tam)
			elif tam < 3000:
				tam_s='bgcolor="#ff9000" | %d' % (tam)
			elif tam < 4000:
				tam_s='bgcolor="#ffc000" | %d' % (tam)
			elif tam < 5000:
				tam_s='bgcolor="#ffff00" | %d' % (tam)
			elif tam < 6000:
				tam_s='bgcolor="#ccff00" | %d' % (tam)
			elif tam < 7000:
				tam_s='bgcolor="#99ff00" | %d' % (tam)
			elif tam < 8000:
				tam_s='bgcolor="#66ff00" | %d' % (tam)
			elif tam < 9000:
				tam_s='bgcolor="#33ff00" | %d' % (tam)
			else:
				tam_s='bgcolor="#00ff00" | %d' % (tam)
	
		if verbose:
			# Mostramos salida por consola
	        	wikipedia.output( u"==== %s ==== (%s) - (%d) - %s" % (page.title(),infobox,tam, coor) )
			
		# Sacamos el código wikipedia con la fila del municipio
		salida+=u"|--\n| [[%s]]" % (page.title())
		if infobox:
			salida+=u" || %s" % (infobox_output)
		if mapa:
			salida+=u" || %s" % (mapa_output)
		if coor:
			salida+=u" || %s" % (coor_output)
		if altitud:
			salida+=u" || %s" % (altitud_output)
		if superficie:
			salida+=u" || %s" % (superficie_output)
		if poblacion:
			salida+=u" || %s" % (poblacion_output)
		if gentilicio:
			salida+=u" || %s" % (gentilicio_output)
		if alcaldia:
			salida+=u" || %s" % (alcaldia_output)
		if codigo_postal:
			salida+=u" || %s" % (codigo_postal_output)
		if escudo:
			salida+=u" || %s" % (escudo_output)
		if bandera:
			salida+=u" || %s" % (bandera_output)
		if patron:
			salida+=u" || %s" % (patron_output)
		if patrona:
			salida+=u" || %s" % (patrona_output)
		if partido:
			salida+=u" || %s" % (partido_output)
		if capital:
			salida+=u" || %s" % (capital_output)
		if tamanyo:
			salida+=u" || %s" % (tam_s)
		salida+=u" \n"
	salida+=u"|}"
	
	if debug:
		wikipedia.output( u"%s" % (salida) )
	else:
		# Actualizamos información en la wikipedia
		sp.put(salida,comment=u"actualizando", minorEdit= True)
if __name__ == "__main__":
	main()