Consumiendo API de Wikipedia con HTTP, en muchos idiomas

Introducción

Creo que ya todos sabemos qué cosa es la wikipedia, y si no, pues aquí dice lo que es. En fin, Wikipedia tiene una API que podemos consumir desde cualquier lenguaje de programación que hable HTTP.

Hay muchas opciones para consumirla, muchos parámetros y cosas de esas, pero vengo a exponer una forma que seguramente muchos estaremos buscando.

Prueba la app que hice

Este artículo fue publicado como un tutorial para consumir la API de Wikipedia, pero al final terminé haciendo esta app: Buscador de artículos de Wikipedia con Vue.JS

Te invito a probarla y a analizar el código fuente; este último es realmente sencillo.

Algunas aclaraciones

  • ¿Necesitamos registrarnos para hacer búsquedas? no
  • ¿Hay un límite? no, pero tampoco hay que abusar
  • ¿Puedo consumir desde cualquier lenguaje de programación? sí, mientras el lenguaje pueda hacer peticiones HTTP
  • ¿Qué pasa con el control de acceso HTTP? como sabemos, el control de acceso sólo permite peticiones si el origen es el mismo. Es decir, no podemos consumir la API desde (por ejemplo) parzibyte.me. Pero Wikipedia sí lo permite, así que podemos consumir su API desde donde sea, siempre y cuando especifiquemos el parámetro origin en *.

Consumir API de Wikipedia

El punto de entrada a la API es en https://es.wikipedia.org/w/api.php. Quiero que sepan que podemos cambiar “es” por cualquier otro idioma. Es decir, podemos ir a https://en.wikipedia.org/w/api.php para la que está en idioma inglés, y así sucesivamente.

Hay una serie de acciones que podemos hacer. Si queremos buscar con texto proporcionado por el usuario para que nos devuelva el título y un fragmento, podemos probar con este enlace:

https://es.wikipedia.org/w/api.php?action=query&list=search&srprop=snippet&format=json&origin=*&utf8=&srsearch=turing

Como vemos, nos lleva a una página en donde muestra resultados de Turing. Es decir, nuestro término fue Turing. No es necesario especificar el título exacto.

Analizando la lista de parámetros, encontramos algunos interesantes…

  • action: la acción, en este caso haremos una consulta
  • format: lo queremos en JSON. Creo que es el formato recomendado
  • origin: no queremos que marque errores de acceso no permitido
  • utf8: para que trate de decodificar los acentos y esas cosas
  • srsearch: el fragmento de búsqueda

Así que podemos hacer una petición a ese enlace, cambiando sólo el valor srsearch.

Ejemplos

Si queremos buscar “apple”: https://es.wikipedia.org/w/api.php?action=query&list=search&srprop=snippet&format=json&origin=*&utf8=&srsearch=apple

Buscar “Facebook” en la wikipedia en inglés: https://en.wikipedia.org/w/api.php?action=query&list=search&srprop=snippet&format=json&origin=*&utf8=&srsearch=facebook

Buscar “hola mundo” en la wikipedia en español: https://es.wikipedia.org/w/api.php?action=query&list=search&srprop=snippet&format=json&origin=*&utf8=&srsearch=hola%20mundo

Cabe aclarar que debemos codificar la búsqueda. Es decir, remplazar cada símbolo con su entidad. Podemos ver que en el caso de hola mundo, el espacio fue remplazado por %20.

Decodificando JSON

No encontré una manera de remover las etiquetas HTML automáticamente desde la API, así que para removerlas se tiene que hacer a mano (bueno, programar una función que remueva etiquetas HTML en el lenguaje que codifiquemos).

Una vez removidas las etiquetas decodificado toda la cadena JSON, podemos acceder a los resultados de la búsqueda que se encuentran en un arreglo. Dicho arreglo está en objeto.query.search.

Analizando respuesta

Una vez que ya hayamos decodificado el arreglo, veremos que tiene objetos. Y cada objeto tiene algunas propiedades:

  • title: el título, legible para el ser humano
  • pageid: el id de la página. Veremos cómo usarlo más adelante
  • snippet: un pequeño fragmento del artículo

Accediendo a enlace

Sea como sea que implementemos la API para búsqueda de Wikipedia, tenemos que crear una forma de que el usuario pueda acceder al artículo directamente.

Para ello utilizamos pageid. Y simplemente navegamos a una URL, pasamos el parámetro y listo. Por ejemplo, si quiero acceder a la página con el id 50712, el enlace sería este:

https://es.wikipedia.org/?curid=50712

Eso fue porque consulté la wikipedia en español. Si fuera en inglés, cambiaría el id y también la página. Por ejemplo:

https://en.wikipedia.org/?curid=13834

Y así podemos redirigir al usuario a cada enlace. Como vemos, el id no se repite.

Artículo aleatorio

Creo que esto no va bien aquí, pues no tiene que ver con la API. Sin embargo, puede que queramos obtener un artículo aleatorio. Para ello existe una URL especial:

https://es.wikipedia.org/wiki/Special:Random

Y claro que también podemos consumirla en otros idiomas:

https://en.wikipedia.org/wiki/Special:Random

Al hacer click en el enlace, se irá a un artículo aleatorio.

Acceder por categorías

También es posible consumir la API usando categorías, pero es algo más complejo y tiene que ver con el indexado de páginas.

Si vamos a este enlace:

https://es.wikipedia.org/w/api.php?action=categorytree&category=Babilonia&format=json

Veamos los argumentos (en este caso la categoría es Babilonia):

  • action: categorytree, el árbol de categorías
  • category: la categoría de la que queremos obtener los artículos
  • format: el formato, que es JSON

Devolverá algo así:

Devuelve un árbol de categorías relacionadas; y si visitamos esos enlaces podremos ver otra página. Por ejemplo, esta. Si la abrimos, nos llevará a más categorías y así sucesivamente.

El punto es que al final llegaremos a una página como esta, que ya es un artículo y no una categoría.

Ahora podemos usar la API REST de Wikipedia que permite obtener el HTML de una página visitando:

https://es.wikipedia.org/api/rest_v1/page/html/%C3%81ngel_Amor_Ruibal

Es decir, la sintaxis es:

https://es.wikipedia.org/api/rest_v1/page/html/TÍTULO_PÁGINA

Si el título tiene espacios hay que remplazarlos por guiones bajos.

Cuando tenemos el HTML de los artículos, podemos extraer el texto útil y ya estaremos indexando la Wikipedia.

En resumen, si quieres consumir artículos de una categoría primero haz una lista de los enlaces que apuntan a los artículos que quieres, después consulta todos los artículos usando la API REST; extrae el texto e indexa las cosas como texto plano.

Lista de idiomas soportados

Para terminar, aquí dejo una lista de los idiomas. Arriba vimos sólo inglés y español, pero lo cierto es que hay más. Aquí la lista: https://meta.wikimedia.org/wiki/List_of_Wikipedias

Conclusión

Con eso tenemos para hacer un pequeño buscador de la Wikipedia. Su API puede explotarse todavía más, pero podemos comenzar haciendo búsquedas. Muy pronto traeré un ejemplo de cómo consumir la API.