mediawiki - wikipedia api json
Cómo obtener una lista de títulos de todos los artículos de Wikipedia (2)
En este momento, según las estadísticas actuales, el número de artículos es de alrededor de 5.8M. Para obtener la lista de páginas utilicé la API de AllPages . Sin embargo, el número de páginas que recibo es de alrededor de 14.5M, lo que representa ~ 3 veces más de lo que esperaba. Me restringí al espacio de nombres 0 para obtener la lista. A continuación se muestra el código de ejemplo que estoy usando:
# get the list of all wikipedia pages (articles) -- English
import sys
from simplemediawiki import MediaWiki
listOfPagesFile = open("wikiListOfArticles_nonredirects.txt", "w")
wiki = MediaWiki(''https://en.wikipedia.org/w/api.php'')
continueParam = ''''
requestObj = {}
requestObj[''action''] = ''query''
requestObj[''list''] = ''allpages''
requestObj[''aplimit''] = ''max''
requestObj[''apnamespace''] = ''0''
pagelist = wiki.call(requestObj)
pagesInQuery = pagelist[''query''][''allpages'']
for eachPage in pagesInQuery:
pageId = eachPage[''pageid'']
title = eachPage[''title''].encode(''utf-8'')
writestr = str(pageId) + "; " + title + "/n"
listOfPagesFile.write(writestr)
numQueries = 1
while len(pagelist[''query''][''allpages'']) > 0:
requestObj[''apcontinue''] = pagelist["continue"]["apcontinue"]
pagelist = wiki.call(requestObj)
pagesInQuery = pagelist[''query''][''allpages'']
for eachPage in pagesInQuery:
pageId = eachPage[''pageid'']
title = eachPage[''title''].encode(''utf-8'')
writestr = str(pageId) + "; " + title + "/n"
listOfPagesFile.write(writestr)
# print writestr
numQueries += 1
if numQueries % 100 == 0:
print "Done with queries -- ", numQueries
print numQueries
listOfPagesFile.close()
El número de consultas realizadas es de alrededor de 28900, lo que resulta en aprox. 14.5M nombres de las páginas.
También probé el enlace de all-titles-in-ns0 mencionado en la respuesta anterior. En ese caso también estoy obteniendo alrededor de 14.5M de páginas.
Pensé que esta sobreestimación del número real de páginas se debe a las redirecciones, y agregué la opción ''no redirecciones'' al objeto de solicitud:
requestObj[''apfilterredir''] = ''nonredirects''
Después de hacer eso obtengo solo 112340 páginas. Que es demasiado pequeño en comparación con 5.8M.
Con el código anterior esperaba aproximadamente 5,8 millones de páginas, pero ese no parece ser el caso.
¿Hay alguna otra opción que deba intentar obtener el conjunto real (~ 5.8M) de nombres de página?
Me gustaría obtener una lista de todos los títulos de todos los artículos de Wikipedia. Sé que hay dos formas posibles de obtener contenido de un wiki con tecnología Wikimedia. Uno sería la API y el otro sería un volcado de base de datos.
Prefiero no descargar el volcado de wiki. Primero, es enorme, y segundo, no tengo mucha experiencia con consultas de bases de datos. El problema con la API, por otra parte, es que no pude encontrar una manera de recuperar solo una lista de los títulos de los artículos e incluso si necesitaría más de 4 solicitudes mio que probablemente me bloquearían de cualquier otra solicitud.
Así que mi pregunta es
- ¿Hay alguna forma de obtener solo los títulos de los artículos de Wikipedia a través de la API?
- ¿Hay una manera de combinar múltiples solicitudes / consultas en una? ¿O tengo que descargar un volcado de Wikipedia?
El módulo API de allpages
permite hacer precisamente eso. Su límite (cuando establece aplimit=max
) es 500, por lo que para consultar todos los artículos de 4.5M, necesitará aproximadamente 9000 solicitudes.
Pero un volcado es una mejor opción, ya que hay muchos volcados diferentes, incluidos all-titles-in-ns0
, que, como su nombre indica, contiene exactamente lo que desea (59 MB de texto comprimido con gzip).