¿Cómo obtener la lista completa de historial de revisiones de Wikipedia de algún artículo?

¿Cómo puedo obtener la lista completa de historial de revisiones de Wikipedia? (No quiero raspar)

import wapiti import pdb import pylab as plt client = wapiti.WapitiClient('mahmoudrhashemi@gmail.com') get_revs = client.get_page_revision_infos( 'Coffee', 1000000) print len(gen_revs) 500 

Enlace del paquete: https://github.com/mahmoud/wapiti

Si necesita más de 500 entradas de revisión, tendrá que usar la API de MediaWiki con consulta de acción, revisiones de propiedad y rvcontinue de parámetros, que se toma de la solicitud anterior, por lo que no puede obtener la lista completa solo con una solicitud:

 https://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=Coffee&rvcontinue=... 

Para obtener la información más específica de su elección, deberá utilizar también el parámetro rvprop :

 &rvprop=ids|flags|timestamp|user|userid|size|sha1|contentmodel|comment|parsedcomment|content|tags|parsetree|flagged 

Resumen de todos los parámetros disponibles que puedes encontrar aquí .

Esta es la forma de obtener el historial completo de revisión de la página de Wikipedia en C #:

 private static List GetRevisions(string pageTitle) { var url = "https://en.wikipedia.org/w/api.php?action=query&format=xml&prop=revisions&rvlimit=500&titles=" + pageTitle; var revisions = new List(); var next = string.Empty; while (true) { using (var webResponse = (HttpWebResponse)WebRequest.Create(url + next).GetResponse()) { using (var reader = new StreamReader(webResponse.GetResponseStream())) { var xElement = XElement.Parse(reader.ReadToEnd()); revisions.AddRange(xElement.Descendants("rev")); var cont = xElement.Element("continue"); if (cont == null) break; next = "&rvcontinue=" + cont.Attribute("rvcontinue").Value; } } } return revisions; } 

Actualmente para “Café” esto devuelve 10 414 revisiones.


Edición: Aquí hay una versión de Python:

 import urllib2 import re def GetRevisions(pageTitle): url = "https://en.wikipedia.org/w/api.php?action=query&format=xml&prop=revisions&rvlimit=500&titles=" + pageTitle revisions = [] #list of all accumulated revisions next = '' #information for the next request while True: response = urllib2.urlopen(url + next).read() #web request revisions += re.findall(']*>', response) #adds all revisions from the current request to the list cont = re.search(' 

Cómo ves la lógica es absolutamente lo mismo. La diferencia con C # es que en C # analicé la respuesta XML y aquí uso expresiones regulares para hacer coincidir todos los elementos de rev y continue .

Entonces, la idea es que haga una solicitud principal de la cual obtengo todas las revisiones (el máximo es 500) en la matriz de revisions . También reviso el elemento xml continue para saber si hay más revisiones, obtener el valor de la propiedad rvcontinue y usarlo en la next variable (para este ejemplo de la primera solicitud es 20150127211200|644458070 ) para hacer otra solicitud para tomar las siguientes 500 revisiones Repito todo esto hasta que el elemento continue esté disponible. Si falta, significa que no quedan más revisiones después de la última en la lista de revisión de la respuesta, por lo que salgo del bucle.

 revisions = GetRevisions("Coffee") print(len(revisions)) #10418 

Aquí están las últimas 10 revisiones para el artículo "Café" (se devuelven de la API en orden inverso), y no olvide que si necesita información de revisión más específica, puede usar el parámetro rvprop en su solicitud.

 for i in revisions[0:10]: print(i) # # # # # # # # # # 

Si utiliza pywikibot, puede extraer un generador que se ejecutará a través del historial de revisión completo para usted. Por ejemplo, para obtener un generador que pase por todas las revisiones (incluido su contenido) para la página “pagename” en la Wikipedia en inglés, use:

 site = pywikibot.Site("en", "wikipedia") page = pywikibot.Page(site, "pagename") revs = page.revisions(content=True) 

Hay muchos más parámetros que puedes aplicar a la consulta. Puedes encontrar la documentación de la API aquí

De nota es:

Revisiones (anverso = falso, total = ninguno, contenido = falso, revertir = falso, tiempo de inicio = ninguno, tiempo final = ninguno)

Generador que carga el historial de versiones como instancias de Revisión.

Pywikibot parece ser el enfoque adoptado por muchos editores de wikipedia para automatizar la edición.