# -*- coding: utf-8 -*-
# Recull l'activitat dels editors als articles d'una categoria
# i dels seus interviquis
import sys
sys.path.append('C:\compat')
import wikipedia,catlib,re
# Torna 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
# Prefix a partir de nom del projecte
def prefix(codiproj0):
lloc=codiproj0.find(u"wiki")
lleng=codiproj0[:lloc].replace(u"_",u"-")
fam=codiproj0[lloc:]
if lleng==u"commons":
fam=u"commons"
elif fam==u"wiki":
fam=u"wikipedia"
prefixos={u"wikipedia":u":", u"wikiquote":u":q:", u"wikisource":u":s:", "commons":":", u"wikivoyage":u":voy:", u"wikinews":u":n:", u"wikibooks":u":b:"}
return prefixos[fam]+lleng+u":"
# Torna codi de llengua i pàgina a partir de codi estil "cawiki" i títol
def artiw(codiproj0,tit):
lloc=codiproj0.find(u"wiki")
lleng=codiproj0[:lloc].replace(u"_",u"-")
fam=codiproj0[lloc:]
if fam==u"wiki":
fam=u"wikipedia"
if codiproj0==u"commonswiki":
proj=wikipedia.getSite('commons','commons')
else:
proj=wikipedia.getSite(lleng,fam)
print proj,tit
pagiw=wikipedia.Page(proj,tit)
return codiproj0,pagiw
# 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
# Afegeix estadístiques de l'historial d'un article als
# diccionaris existents
def historial(pag,diccedits,dicccrea,diccafegeix,diccaftreu):
hist=pag.getVersionHistory()
for i,linia in enumerate(hist):
#print linia
usuari=linia[2]
#print usuari
try:
mida=linia[4]-hist[i+1][4]
except IndexError:
mida=linia[4]
if usuari in dicccrea:
dicccrea[usuari]=dicccrea[usuari]+1
else:
dicccrea[usuari]=1
#print mida
if usuari in diccedits:
diccedits[usuari]=diccedits[usuari]+1
else:
diccedits[usuari]=1
if mida>0:
if usuari in diccafegeix:
diccafegeix[usuari]=diccafegeix[usuari]+mida
else:
diccafegeix[usuari]=mida
if usuari in diccaftreu:
diccaftreu[usuari]=diccaftreu[usuari]+mida
else:
diccaftreu[usuari]=mida
if not usuari in dicccrea:
dicccrea[usuari]=0
if not usuari in diccafegeix:
diccafegeix[usuari]=0
return diccedits,dicccrea,diccafegeix,diccaftreu
wikipedia.stopme()
# Agafa el valor número num d'un diccionari
def minnum(dicc,num,val0):
llista=[]
for clau in dicc.keys():
llista.append(dicc[clau])
llista.sort()
llista.reverse()
if len(llista)>num:
valor=llista[num]
if valor>val0:
val0=valor
return val0
# Converteix diccionaris en taules
def dicataula(diccedits,dicccrea,diccafegeix,diccaftreu,llengua):
text=u'{| class="wikitable sortable" border="1"\n|+ Editors\n'
text=text+u"|-\n"
text=text+u'! scope="col" | Editor\n'
text=text+u'! scope="col" | Edicions\n'
text=text+u'! scope="col" | Articles creats\n'
text=text+u'! scope="col" | Octets afegits\n'
text=text+u'! scope="col" | Afegits nets\n'
claus=diccedits.keys()+dicccrea.keys()+diccafegeix.keys()+diccaftreu.keys()
claus=set(claus)
anonusuaris=anonedit=anoncrea=anonafegeix=anonaftreu=0
petitsusuaris=petitsedit=petitscrea=petitsafegeix=petitsaftreu=0
nummin=20 #5 per proves, previst 30
minedits=minnum(diccedits,nummin,12)
mincrea=minnum(dicccrea,nummin,1)
minafegeix=minnum(diccafegeix,nummin,1000)
minaftreu=minnum(diccaftreu,nummin,200)
for usuari in claus:
try:
nomusuari=unicode(usuari)
except TypeError:
print u"Nom d'usuari intractable"
nomusuari=u"Nom intractable"
if re.search(u"[a-zA-Z]",nomusuari) or not "." in nomusuari:
if diccedits[usuari]>=minedits or dicccrea[usuari]>=mincrea or diccafegeix[usuari]>=minafegeix or diccaftreu[usuari]>=minaftreu:
text=text+dicalinia(usuari,diccedits,dicccrea,diccafegeix,diccaftreu,llengua)
else:
petitsusuaris=petitsusuaris+1
petitsedit=petitsedit+diccedits[usuari]
if usuari in dicccrea.keys():
petitscrea=petitscrea+dicccrea[usuari]
if usuari in diccafegeix.keys():
petitsafegeix=petitsafegeix+diccafegeix[usuari]
petitsaftreu=petitsaftreu+diccaftreu[usuari]
else:
anonusuaris=anonusuaris+1
anonedit=anonedit+diccedits[usuari]
if usuari in dicccrea.keys():
anoncrea=anoncrea+dicccrea[usuari]
if usuari in diccafegeix.keys():
anonafegeix=anonafegeix+diccafegeix[usuari]
anonaftreu=anonaftreu+diccaftreu[usuari]
if anonusuaris>0:
text=text+u"|-\n"
text=text+u"|{} anònims||{}||{}||{}||{}\n".format(anonusuaris,anonedit,anoncrea,anonafegeix,anonaftreu)
if petitsusuaris>0:
text=text+u"|-\n"
text=text+u"|{} usuaris més||{}||{}||{}||{}\n".format(petitsusuaris,petitsedit,petitscrea,petitsafegeix,petitsaftreu)
sumausuari=len(claus)
sumaedits=0
for usuari in diccedits.keys():
sumaedits=sumaedits+diccedits[usuari]
sumacrea=0
for usuari in dicccrea.keys():
sumacrea=sumacrea+dicccrea[usuari]
sumaafegeix=0
for usuari in diccafegeix.keys():
sumaafegeix=sumaafegeix+diccafegeix[usuari]
sumaaftreu=0
for usuari in diccaftreu.keys():
sumaaftreu=sumaaftreu+diccaftreu[usuari]
text=text+u"|-\n"
text=text+u"!{} usuaris!!{}||{}||{}||{}\n".format(sumausuari,sumaedits,sumacrea,sumaafegeix,sumaaftreu)
text=text+u"|}\n"
text=text+u"S'han agrupat els usuaris amb menys de {} edicions, {} articles creats, {} octets afegits i {} octets afegits nets (afegits menys eliminats).".format(minedits,mincrea,minafegeix,minaftreu)
return text
def dicalinia(usuari,diccedits,dicccrea,diccafegeix,diccaftreu,llengua):
#print usuari,u"edicions:",diccedits[usuari],u"crea:",dicccrea[usuari],u"afegeix:",diccafegeix[usuari],u"aftreu:",diccaftreu[usuari]
pref=prefix(llengua)
try:
text=u"|-\n|[["+pref+u"User:"+usuari+u"]]||"
except TypeError:
print u"nom invàlid. usuari:",usuari
text=u"|-\n|Nom d'usuari no vàlid||"
text=text+str(diccedits[usuari])+u"||"
if usuari in dicccrea:
text=text+str(dicccrea[usuari])+u"||"
else:
text=text+u"0"+u"||"
if usuari in diccafegeix:
text=text+str(diccafegeix[usuari])+u"||"
else:
text=text+u"0"+u"||"
text=text+str(diccaftreu[usuari])+u"\n"
return text
#Transforma llista d'articles en una cadena presentable
def llistaneta(llista,codiproj):
pref=prefix(codiproj)
text=u""
for nom in llista:
text=text+u"[[{}{}]], ".format(pref,nom)
return text
# El programa comença aquí.
cawiki=wikipedia.getSite('ca')
site=cawiki #Canviar aquí per canviar de Viquipèdia origen
diccedits={}
dicccrea={}
diccafegeix={}
diccaftreu={}
llistarticles={}
nomcat=u"catalans històrics" #Canviar aquí per canviar de categoria
cat=catlib.Category(site,nomcat)
cats,articles=miracatfiltre(cat)
for pag in articles:
print pag
iws=interviquis(pag)
for codilleng in iws.keys():
lleng,art=artiw(codilleng,iws[codilleng][u'name'])
#print art
if lleng not in llistarticles.keys():
llistarticles[lleng]=[]
llistarticles[lleng].append(art.title())
if lleng not in diccedits.keys():
diccedits[lleng]={}
dicccrea[lleng]={}
diccafegeix[lleng]={}
diccaftreu[lleng]={}
diccedits[lleng],dicccrea[lleng],diccafegeix[lleng],diccaftreu[lleng]=historial(art,diccedits[lleng],dicccrea[lleng],diccafegeix[lleng],diccaftreu[lleng])
if len(articles)>0:
textinf=u"==[[:categoria:{}]]==\n\n".format(nomcat)
textinf=textinf+u"{} articles en {} subcategories\n\n".format(len(articles),len(cats))
for lleng in sorted(diccedits.keys()):
textinf=textinf+u"=== {} ===\n".format(lleng)
textinf=textinf+u"{} articles\n\n".format(len(llistarticles[lleng]))
textinf=textinf+llistaneta(llistarticles[lleng],lleng)+u"\n\n"
textinf=textinf+dicataula(diccedits[lleng],dicccrea[lleng],diccafegeix[lleng],diccaftreu[lleng],lleng)+u"\n\n"
paginforme=wikipedia.Page(cawiki,u"Usuari:PereBot/autors articles/"+nomcat)
paginforme.put(u"\n"+textinf+u"\n",u"Estadístiques d'edicions")
else:
print u"No hi ha articles a la categoria."
wikipedia.stopme()