Usuari:PereBot/robot mida articles
Aparença
# -*- coding: utf-8 -*-
# Mida dels articles d'una categoria
# Fet simplificant el programa llista espècies curtes (sinàpsids)
import sys,re,pickle
sys.path.append('C:\compat')
import wikipedia,catlib,pagegenerators
sys.path.append('C:\mwparserfromhell-0.3.3')
import mwparserfromhell
# Retorna les categories i articles d'una categoria, subcategories incloses.
# No torna a mirar les categories que ja ha mirat.
# Filtra pels noms de les categories fent servir una expressió regular.
def miracatfiltre(cat,catprevies=[],filtre=u""):
articles=cat.articlesList(recurse=False)
categories=cat.subcategoriesList(recurse=False)
for scat in categories:
print scat
# print u"Títol",scat.title()
if scat not in catprevies:
catprevies.append(scat)
if filtre==u"":
nopassa=False
#print u"Filtre desactivat"
else:
nopassa=re.search(filtre,scat.title())
if not nopassa:
print u"Sí que es llegeix", scat
noucats,nouarts=miracatfiltre(scat,catprevies+categories,filtre)
categories=categories+noucats
articles=articles+nouarts
else:
print u"No es llegeix", scat
else:
print u"Aquesta ja la tinc vista"
articles=catlib.unique(articles)
return categories, articles
# Escurça un diccionari
def talladic(dic,ntall):
claus=dic.keys()
claus.sort()
dicnou={}
compta=0
for num in claus:
dicnou[num]=dic[num]
compta=compta+dic[num].count(u"#")
if compta>ntall:
break
return dicnou
# Actualitza informe
def putinforme(pag,text0,afegit,sumari,signa=False,continua=False,fitxer=u""):
if pag.exists():
jahiha=pag.get()
if continua:
text0=jahiha+text0
contingut=text0+afegit
if signa:
contingut=contingut+u"\n--~~~~\n"
try:
pag.put(contingut,sumari)
except:
print u"No es pot gravar la pàgina",pag
if fitxer<>u"":
fitx=open(fitxer,'w')
fitx.write(contingut.encode('utf8'))
fitx.close()
return
# Ordena diccionari i el transforma en cadena
def dicallista(dicc):
claus=dicc.keys()
claus.sort()
claus.reverse()
cadena=u""
for clau in claus:
cadena=cadena+dicc[clau]
return cadena
# Neteja un article, compta els caràcters i mira si és una espècie.
def comptanet(text):
text0=text
#print u"longitud total",len(text)
text=wikipedia.removeCategoryLinks(text)
#print u"longitud",len(text)
#print text
#text=re.sub(u"\{\{ ?([Tt]ítol cursiva|[Rr]eferències) ?\}\}",u"",text)
#print u"longitud",len(text)
#print text
#print u"longitud",len(text)
#print text
trossos=re.split(u"== ?Referències ?==",text)
text=trossos[0]
#print len(trossos)
trossos=re.split(u"== ?Bibliograf[íi]a ?==",text)
text=trossos[0]
#print len(trossos)
trossos=re.split(u"== ?Enllaços [Ee]xterns ?==",text)
text=trossos[0]
#print len(trossos)
text=re.sub(u"==+.*?==+",u"",text)
#print u"longitud",len(text)
#print text
text=re.sub(u"\[\[ ?[Ff]itxer ?:.*?\|",u"\|",text)
#print u"longitud",len(text)
#print text
text=re.sub(u"\|(thumb|right|left|[0-9]+px)",u"",text)
#print u"longitud",len(text)
#print text
#text=text.replace(u"gènere (biologia)|gènere",u"gènere")
#text=text.replace(u"família (biologia)|família",u"família")
#text=text.replace(u"ordre (biologia)|família",u"ordre")
#text=re.sub(u"[\[\[\]\]]",u"",text)
#print u"longitud",len(text)
#print text
text=re.sub(u"<ref name=.{1,12}/>",u"",text)
#print u"longitud",len(text),u"<ref name=.{1,12}/>"
#print text
#text=re.sub(u"\{\{ ?[Mm]ida ?\|.*?\}\}",u"",text)
#print u"longitud",len(text)
#print text
#text=re.sub(u"\{\{ ?[Tt]axobox colour ?\|.*?\}\}",u"",text)
#print u"longitud",len(text)
#print text
#text=re.sub(u"\{\{ ?CN ?\| ?data.*?\}\}",u"",text)
#print u"longitud",len(text)
#print text
#text=re.sub(u"\{\{ ?([Cc]lade|[Tt]axobox_norank_entry|[Ee]ntrada de taxocaixa sense rang) ?\|.*?\}\}",u"",text)
#print u"longitud",len(text)
#print text
#text=re.sub(u"\{\{(.*?\|)*?.+?\}\}",u"",text)
#print u"longitud",len(text)
#print text
#print u"longitud",len(text)
#print text
text=re.sub(u"<ref name=.*?>.*?</ref>",u"",text)
#print u"longitud",len(text)
#print text
text=re.sub(u"<ref>.*?</ref>",u"",text)
codi=mwparserfromhell.parse(text)
text=codi.strip_code(normalize=True,collapse=True)
text=text.replace(u"\n",u"") #Elimina salts de línia
#print u"longitud",len(text)
#print text
#print u"longitud",len(text)
#print text
#text=re.sub(u"'''",u"",text)
#print u"longitud",len(text)
#print text
#text=re.sub(u"''",u"",text)
#print u"longitud final",len(text)
#print text
#text=re.sub(u"<references />",u"",text)
#print u"longitud final",len(text)
#print text
text=re.sub(u"<!--ORDENA generat per bot-->",u"",text)
text=re.sub(u"\{\{(en|es|ca|fr|eu|cn|de|it|Autoritat|Bases de dades taxonòmiques|CN)\}\}",u"",text)
text=re.sub(u"\{\{.*?\}\}",u"",text)
#print u"longitud final",len(text)
#print text
if re.search(u"\|\n* *binomial *\=",text0) or u"és una [[espècie]] d" in text0:
especie=True
print u"És espècie"
else:
especie=False
#print u"No és espècie"
return len(text),especie,text
# Afegeix estadístiques de l'historial d'un article als
# diccionaris existents
def histmides(pag):
hist=pag.getVersionHistory()
dicc={}
for i,linia in enumerate(hist):
#print linia
mes=linia[1][:7]
#print mes
if not mes in dicc.keys():
dicc[mes]=linia[4]
return dicc
# Converteix els diccionaris en una taula.
def dicataulacrono(dicchist,diccnet,diccrefs,diccfotos,diccinfo,diccmill,diccenllacos,dicciw):
mesos0=[]
articles=dicchist.keys()
for article in articles:
mesos0=mesos0+dicchist[article].keys()
mesos=list(set(mesos0))
mesos.sort()
for article in articles:
valor=u""
for mes in mesos:
valor=dicchist[article].setdefault(mes,valor)
mesos.reverse()
text=u'{| class="wikitable sortable" border="1"\n|+ Evolució dels articles\n'
text=text+u"|-\n"
text=text+u'! scope="col" | Article\n'
text=text+u'! scope="col" | Mida neta\n'
text=text+u'! scope="col" | Referències\n'
text=text+u'! scope="col" | Imatges\n'
text=text+u'! scope="col" | Infotaula\n'
text=text+u'! scope="col" | Etiquetes\n'
text=text+u'! scope="col" | Enllaços i redireccions\n'
text=text+u'! scope="col" | Interviquis\n'
for mes in mesos:
text=text+u'! scope="col" | {}\n'.format(mes)
text=text+u'! scope="col" | Article\n'
for article in sorted(articles):
text=text+u"|-\n|{}||{}||{}||{}||{}||{}||{}||{}".format(article,diccnet[article],diccrefs[article],diccfotos[article],diccinfo[article],diccmill[article],diccenllacos[article],dicciw[article])
for mes in mesos:
text=text+u"||{}".format(dicchist[article].setdefault(mes,u""))
text=text+u"||{}".format(article)
text=text+u"\n"
text=text+u"|}"
return text
def trobaplantilles(pag,dicc):
tits=dicc.keys()
plants=pag.templates()
res=u""
for plant in plants:
if plant in tits:
if res<>u"":
res=res+u", "
res=res+dicc[plant]
return res
def enllacos(pag):
enll=0
for art in pag.getReferences():
if art.namespace()==0:
enll=enll+1
return enll
# Torna el diccionari amb els títols dels interviquis d'una pàgina
def interviquis(pag):
pagdata=wikipedia.DataPage(pag)
#print pagdata
try:
cont= pagdata.get()
#print cont
except wikipedia.NoPage:
print u"No hi ha pàgina de dades"
return {}
iws=cont[u'links']
print iws
return iws
#Compta interviquis
def numiw(pag):
projs=interviquis(pag).keys()
viquis=0
germans=0
for proj in projs:
lloc=proj.find(u"wiki")
fam=proj[lloc:]
if fam==u"wiki" and proj<>u"commonswiki":
viquis=viquis+1
else:
germans=germans+1
return viquis,germans
#El programa comença aquí
cawiki=wikipedia.getSite('ca')
site=cawiki
vistos=[]
comptador=0
comptabloc=0
nomcat=u"Cultura de Catalunya per disciplina" #Canviar aquí per canviar de categoria
cat=catlib.Category(site,nomcat)
cats,articles=miracatfiltre(cat)
capinforme=u"== [[:categoria:{}]] ==\n\n".format(nomcat)
cosinforme=u""
# Crea els diccionaris amb les dades
dicchist={}
diccnet={}
diccrefs={}
diccfotos={}
diccinfo={}
diccmill={}
diccenllacos={}
dicciw={}
fitx=open("infotaules.txt",'r')
diccinfotaules=pickle.load(fitx)
fitx.close()
fitx=open("plantilles millorar.txt",'r')
diccmillorar=pickle.load(fitx)
fitx.close()
textinforme0=u""
asc=pagegenerators.PreloadingGenerator(articles)
for article in asc:
if article in vistos:
print article,u"ja vist"
continue
elif article.namespace()!=0:
continue
else:
vistos.append(article)
comptador=comptador+1
print comptador,article
textvell=article.get()
llargtot=len(textvell)
llarg,esp,textnou=comptanet(textvell)
numrefs=textvell.count(u"</ref>")
diccnet[article]=llarg
diccrefs[article]=numrefs
dicchist[article]=histmides(article)
diccfotos[article]=len(re.findall(u"\.(jpeg|jpg|JPEG|JPG)",textvell))
diccinfo[article]=trobaplantilles(article,diccinfotaules)
diccmill[article]=trobaplantilles(article,diccmillorar)
diccenllacos[article]=enllacos(article)
dicciw[article]=max(numiw(article)[0]-1,0)
# Fa informe amb les dades dels diccionaris
llistaesp=dicataulacrono(dicchist,diccnet,diccrefs,diccfotos,diccinfo,diccmill,diccenllacos,dicciw)
contingut=capinforme+llistaesp+u"\n--~~~~\n\n"
paginforme=wikipedia.Page(cawiki,u"Usuari:PereBot/mida articles (cronològic)/"+nomcat)
paginforme.put(u"\n"+contingut+u"\n",u"Mida dels articles segons historial")
wikipedia.stopme()
Programa auxiliar per fer fitxers amb les llistes de plantilles que el programa buscarà als articles:
# -*- coding: utf-8 -*-
# Recull els noms de les plantilles d'una categoria i les guarda en un diccionari
# És part del programa de saber si un article té aquestes plantilles
import sys
sys.path.append('C:\compat')
import wikipedia,catlib,pickle
# Retorna les categories i articles d'una categoria, subcategories incloses.
# No torna a mirar les categories que ja ha mirat.
# Filtra pels noms de les categories fent servir una expressió regular.
def miracatfiltre(cat,catprevies=[],filtre=u""):
articles=cat.articlesList(recurse=False)
categories=cat.subcategoriesList(recurse=False)
for scat in categories:
print scat
# print u"Títol",scat.title()
if scat not in catprevies:
catprevies.append(scat)
if filtre==u"":
nopassa=False
#print u"Filtre desactivat"
else:
nopassa=re.search(filtre,scat.title())
if not nopassa:
print u"Sí que es llegeix", scat
noucats,nouarts=miracatfiltre(scat,catprevies+categories,filtre)
categories=categories+noucats
articles=articles+nouarts
else:
print u"No es llegeix", scat
else:
print u"Aquesta ja la tinc vista"
articles=catlib.unique(articles)
return categories, articles
#El programa comença aquí
cawiki=wikipedia.getSite('ca')
site=cawiki
if False: # True per infotaules
cat=catlib.Category(site,u"Infotaules")
nomfitx="infotaules.txt"
else:
cat=catlib.Category(site,u"Plantilles per a millorar articles")
cats,plantilles=miracatfiltre(cat)
plantilles.append(wikipedia.Page(site,u"Plantilla:Article bo"))
plantilles.append(wikipedia.Page(site,u"Plantilla:Article de qualitat"))
nomfitx="plantilles millorar.txt"
dicc={}
for plant in plantilles:
if plant.namespace()<>10:
continue
nom=plant.title().replace(u"Plantilla:",u"")
dicc[nom]=nom
reds=plant.getReferences(redirectsOnly=True)
for red in reds:
nomred=red.title().replace(u"Plantilla:",u"")
dicc[nomred]=nom
print dicc
fitx=open(nomfitx,'w')
pickle.dump(dicc,fitx)
fitx.close()
wikipedia.stopme()