Vés al contingut

Usuari:PereBot/robot mida articles

De la Viquipèdia, l'enciclopèdia lliure
# -*- 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()