Usuari:PereBot/robot categories petites

De la Viquipèdia, l'enciclopèdia lliure

Programa per buscar categories amb menys de 5 elements. Produeix la llista que hi ha a Usuari:PereBot/categories petites / Usuari:Rebot/categories petites

Versió 1 Pere[modifica]

Versió actual del programa que fa servir l'API:

# -*- coding: utf-8 -*-

import sys
sys.path.append('C:\core')
import re,urllib,urllib2,json
import pywikibot

# El programa comença aquí
site=pywikibot.getSite('ca')
paginforme=pywikibot.Page(site,u"Usuari:PereBot/categories petites")
textvell=paginforme.get()
informe=[u"",u""]
informeno=[u"",u""]
pagweb0="http://ca.wikipedia.org/w/api.php?action=query&list=allcategories&format=json&acmin=1&acmax=4&aclimit=500&acprop=size&rawcontinue="
pagweb=pagweb0
textcont=""
while textcont<>"acabat":
    print pagweb
    pllista=urllib.urlopen(pagweb)
    print "obert"
    pbrut=pllista.read()
    jpag=json.loads(pbrut)
    #print jpag
    lcats=jpag["query"]["allcategories"]
    #print lcats
    for dcat in lcats:
        nom=dcat["*"]
        mida=dcat["size"]
        pags=dcat["pages"]
        subcs=dcat["subcats"]
        if subcs==0 or (subcs==1 and pags==0):
            linia=u"# [[:categoria:{}]]: {} subcategories i {} pàgines\n".format(nom,subcs,pags)
            titcat=u"Categoria:"+nom
            if re.search(u"Categoria:(Articles|Pàgines|Usuaris|Anècdotes|Viquipedistes|Infotaules|Plantilles|Demandes|Esborranys|Imatges|Logotips|Manteniment|Moure a|Peticions|Preguntes|Preses de decisió|VP Grècia|Categories|Esborrar|Drets d'autor a revisar|Manteniment|.*(que necessiten|sense registre fòssil))",titcat):
                informeno[subcs]=informeno[subcs]+linia
            else:
                informe[subcs]=informe[subcs]+linia
            print linia
    contbrut=re.findall('"accontinue":".*?"',pbrut)
    if len(contbrut)>0:
        #print contbrut
        contbrut=contbrut[0]
        contbrut=contbrut.replace('"accontinue":"','')
        contbrut=contbrut[:-1]
        print u"continuació:",contbrut
        textcont="&accontinue="+contbrut
        pagweb=pagweb0+textcont
    else:
        textcont="acabat"
print u"S'ha acabat"
textinforme=u"\n==Categories petites==\n\n"
textinforme=textinforme+u"===Categories enciclopèdiques===\n\n"
textinforme=textinforme+u"====Sense subcategoria====\n\n"+informe[0]
textinforme=textinforme+u"====Amb subcategoria====\n\n"+informe[1]
textinforme=textinforme+u"===Categories no enciclopèdiques===\n\n"
textinforme=textinforme+u"====Sense subcategoria====\n\n"+informeno[0]
textinforme=textinforme+u"====Amb subcategoria====\n\n"+informeno[1]
textinforme=textinforme+u"\n--~~~~\n\n\n"
paginforme.put(textvell+textinforme,u"Robot buscant categories petites")
pywikibot.stopme()

Versió 2 Pere[modifica]

Programa que feia servir abans per fer el mateix llegint directament les categories. És més complicat i moltíssim més lent (a més ara no em funciona perquè el generador AllCategories dóna error), tot i que en no dependre tant d'un query de l'API es controla molt millor què està fent el programa:

# -*- coding: utf-8 -*-
# Programa per buscar categories curtes.
# Exclou les categories no enciclopèdies filtrant-ne els noms.
# Detecta com a categories curtes les que tenen menys de cinc articles i cap subcategoria.
# Fa servir un fitxer amb un diccionari amb l'estructura de les categories que
# ha llegit, per estalviar feina els següents cops.
# PER FER: Buscar les categories sense cap article i amb una única subcategoria.

import sys
sys.path.append('C:\pywikipedia')
import wikipedia,catlib,urllib2,re,pickle,pagegenerators

#La teca comença aquí
def main():
    categories=pagegenerators.CategoryGenerator(pagegenerators.AllpagesPageGenerator(site=site,namespace=14,start=u"!")) #En general, treure paràmetre start
    fitx=open("categories.txt",'r') #El primer cop que executeu el programa, si no teniu el fitxer categories.txt, substituiu les 3 línies per bibliocats={}.
    bibliocats=pickle.load(fitx)   # Diccionari amb la llista de totes les subcategories d'una categoria (només un nivell)
    fitx.close()
    print u"Diccionari carregat amb",len(bibliocats),u"categories llegides"
    bibliocatsk=bibliocats.keys()
    paginforme=wikipedia.Page(site,u"Usuari:PereBot/categories petites")
    textvell=paginforme.get()
    informe=u"" # u"Edicions de prova\n\n" #Canviar per u"" excepte per proves
    comptador=0      #Categories mirades
    comptablocm=1800    #Categories mirades des de darrera guardada
    comptabloct=0    #Categories trobades des de darrera guardada
    comptapetites=0  #Categories trobades
    textinici=u""
    for categoria in categories:
        comptador += 1
        comptablocm += 1
        tesubs=False
        provada=False
#        print categoria
        titolcat=categoria.title()
        if textinici==u"":
            textinici=u"Primera categoria revisada [[:{}]]\n\n".format(titolcat)
        if re.search(ur"(?:Categoria:(?:Articles|Pàgines|Usuaris|Anècdotes|Viquipedistes|Infotaules|Plantilles|Demandes|Esborranys|Imatges|Logotips|Manteniment de|Peticions|Preguntes|VP Grècia)|que necessiten|sense registre fòssil)",titolcat):
            print comptador,categoria,"ignorada per ser aparentment de manteniment"
        else:
            if categoria in bibliocatsk:
                wikipedia.output(u"{} {} llegida. Té {}categories.".format(comptador,categoria,len(bibliocats[categoria])))
            else:
                wikipedia.output(u"{} {} desconeguda".format(comptador,categoria))
                subcats=categoria.subcategoriesList(recurse=False)
                bibliocats[categoria]=subcats
                provada=True
                wikipedia.output(u"{} {} llegida. Té {} categories.".format(comptador,categoria,len(bibliocats[categoria])))
            if len(bibliocats[categoria])==0:
                tesubs=False
            else:
                tesubs=True
            if tesubs==False:
                articles=categoria.articlesList(recurse=False)
                try:
                    wikipedia.output(u"{} {}{} articles.".format(comptador,categoria,len(articles)))
                except UnicodeEncodeError:
                    wikipedia.output(u"Té alguna subcategoria no imprimible")
                if len(articles)<5:  #Posar 5 excepte per proves
                    if provada==False:
                        subcats=categoria.subcategoriesList(recurse=False)
                        bibliocats[categoria]=subcats
                        wikipedia.output(u"{} Comprovant per si de cas {}. Té {} categories".format(comptador,categoria,len(bibliocats[categoria])))
                        if len(bibliocats[categoria])==0:
                            wikipedia.output(u"{} CATEGORIA PETITA".format(categoria))
                            informe+=u"* [[:{}]] té {}articles\n".format(titolcat,len(articles))                               
                            comptabloct+=1
                            comptapetites+=1
            if (comptablocm+100*comptabloct)>2000:
                comptabloct=0
                comptablocm=0
                textfinal=u"Trobades {} categories petites de {} categories revisades\n\n".format(comptapetites,comptador)
                textfinal+=u"Darrera categoria revisada [[:{}]]\n\n".format(titolcat)
                try:
                    textnou=u"{}\n\n==Categories petites==\n{}{}{}Tasca en curs. --~~~~\n".format(textvell,textinici,informe,textfinal)
                    paginforme.put(textnou,u"Categories petites")
                except wikipedia.EditConflict:
                    textvell=paginforme.get(force=True)
                    textnou=u"{}\n\n==Categories petites==\n{}{}Tasca en curs. --~~~~\n".format(textvell,textinici,informe)
                    paginforme.put(textnou,u"Categories petites")
                fitx=open("categories.txt",'w')
                pickle.dump(bibliocats,fitx)
                fitx.close()
#        if comptador>30:  #Per proves
#            break         #Per proves
    textfinal=u"Trobades {:} categories petites de {:} categories revisades\n\n".format(comptapetites,comptador)
    textfinal+=u"Darrera categoria revisada [[:{}]]\n\n".format(titolcat)
    try:
        textnou=u"{}\n\n==Categories petites==\n{}{}{}Tasca acabada. --~~~~\n".format(textvell,textinici,informe,textfinal)
        paginforme.put(textnou,u"Categories petites")
    except wikipedia.EditConflict:
        textvell=paginforme.get(force=True)
        textnou=u"{}\n\n==Categories petites==\n{}{}Tasca acabada. --~~~~\n".format(textvell,textinici,informe)
        paginforme.put(textnou,u"Categories petites")
    fitx=open("categories.txt",'w')
    pickle.dump(bibliocats,fitx)
    fitx.close()
    return


#El programa comença aquí
if __name__ == "__main__":
    try:
        site=wikipedia.getSite('ca')
        main()
    finally:
        wikipedia.stopme()

Versió Pau[modifica]

2022, Python3

# -*- coding: utf-8 -*-

import sys
import re,urllib,urllib.request,json
import pywikibot

# El programa comença aquí
site=pywikibot.Site('ca')
paginforme=pywikibot.Page(site,u"Usuari:Rebot/categories petites")
textvell=paginforme.get()
informe=[u"",u""]
informeno=[u"",u""]
pagweb0="http://ca.wikipedia.org/w/api.php?action=query&list=allcategories&format=json&acmin=1&acmax=4&aclimit=500&acprop=size&rawcontinue="
pagweb=pagweb0
textcont=""
while textcont!="acabat":
    print (pagweb)
    pllista=urllib.request.urlopen(pagweb)
    print ("obert")
    pbrut=pllista.read()
    jpag=json.loads(pbrut.decode('utf-8'))
    #print jpag
    lcats=jpag["query"]["allcategories"]
    #print lcats
    for dcat in lcats:
        nom=dcat["*"]
        mida=dcat["size"]
        pags=dcat["pages"]
        subcs=dcat["subcats"]
        if subcs==0 or (subcs==1 and pags==0):
            linia=u"# [[:categoria:{}]]: {} subcategories i {} pàgines\n".format(nom,subcs,pags)
            titcat=u"Categoria:"+nom
            if re.search(u"Categoria:(Articles|Pàgines|Usuaris|Anècdotes|Viquipedistes|Infotaules|Plantilles|Demandes|Esborranys|Imatges|Logotips|Manteniment|Moure a|Peticions|Preguntes|Preses de decisió|VP Grècia|Categories|Esborrar|Drets d'autor a revisar|Manteniment|.*(que necessiten|sense registre fòssil))",titcat):
                informeno[subcs]=informeno[subcs]+linia
            else:
                informe[subcs]=informe[subcs]+linia
            print (linia)
    contbrut=re.findall('"accontinue":".*?"',pbrut.decode('utf-8'))
    if len(contbrut)>0:
        #print contbrut
        contbrut=contbrut[0]
        contbrut=contbrut.replace('"accontinue":"','')
        contbrut=contbrut[:-1]
        print (u"continuació:",contbrut)
        textcont="&accontinue="+contbrut
        pagweb=pagweb0+textcont
    else:
        textcont="acabat"
print (u"S'ha acabat")
textinforme=u"\n==Categories petites==\n\n"
textinforme=textinforme+u"===Categories enciclopèdiques===\n\n"
textinforme=textinforme+u"====Sense subcategoria====\n\n"+informe[0]
textinforme=textinforme+u"====Amb subcategoria====\n\n"+informe[1]
textinforme=textinforme+u"===Categories no enciclopèdiques===\n\n"
textinforme=textinforme+u"====Sense subcategoria====\n\n"+informeno[0]
textinforme=textinforme+u"====Amb subcategoria====\n\n"+informeno[1]
textinforme=textinforme+u"\n--~~~~\n\n\n"
paginforme.put(textvell+textinforme,u"Robot buscant categories petites")
pywikibot.stopme()