apis

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í:

{"categorytree":{"*":"<div class=\"CategoryTreeSection\"><div class=\"CategoryTreeItem\"><span class=\"CategoryTreeBullet\"><span class=\"CategoryTreeToggle\" data-ct-title=\"Asiriolog\u00eda\" data-ct-state=\"collapsed\">\u25ba</span> </span> <a class=\"CategoryTreeLabel  CategoryTreeLabelNs14 CategoryTreeLabelCategory\" href=\"/wiki/Categor%C3%ADa:Asiriolog%C3%ADa\" title=\"Categor\u00eda:Asiriolog\u00eda\">Asiriolog\u00eda</a></div><div class=\"CategoryTreeChildren\" style=\"display:none\"></div></div><div class=\"CategoryTreeSection\"><div class=\"CategoryTreeItem\"><span class=\"CategoryTreeBullet\"><span class=\"CategoryTreeToggle\" data-ct-title=\"Babilonios\" data-ct-state=\"collapsed\">\u25ba</span> </span> <a class=\"CategoryTreeLabel  CategoryTreeLabelNs14 CategoryTreeLabelCategory\" href=\"/wiki/Categor%C3%ADa:Babilonios\" title=\"Categor\u00eda:Babilonios\">Babilonios</a></div><div class=\"CategoryTreeChildren\" style=\"display:none\"></div></div><div class=\"CategoryTreeSection\"><div class=\"CategoryTreeItem\"><span class=\"CategoryTreeEmptyBullet\">\u25ba </span> <a class=\"CategoryTreeLabel  CategoryTreeLabelNs14 CategoryTreeLabelCategory\" href=\"/wiki/Categor%C3%ADa:Batallas_de_Babilonia\" title=\"Categor\u00eda:Batallas de Babilonia\">Batallas de Babilonia</a></div><div class=\"CategoryTreeChildren\" style=\"display:none\"></div></div><div class=\"CategoryTreeSection\"><div class=\"CategoryTreeItem\"><span class=\"CategoryTreeBullet\"><span class=\"CategoryTreeToggle\" data-ct-title=\"Casitas\" data-ct-state=\"collapsed\">\u25ba</span> </span> <a class=\"CategoryTreeLabel  CategoryTreeLabelNs14 CategoryTreeLabelCategory\" href=\"/wiki/Categor%C3%ADa:Casitas\" title=\"Categor\u00eda:Casitas\">Casitas</a></div><div class=\"CategoryTreeChildren\" style=\"display:none\"></div></div><div class=\"CategoryTreeSection\"><div class=\"CategoryTreeItem\"><span class=\"CategoryTreeBullet\"><span class=\"CategoryTreeToggle\" data-ct-title=\"Dinast\u00edas_de_Babilonia\" data-ct-state=\"collapsed\">\u25ba</span> </span> <a class=\"CategoryTreeLabel  CategoryTreeLabelNs14 CategoryTreeLabelCategory\" href=\"/wiki/Categor%C3%ADa:Dinast%C3%ADas_de_Babilonia\" title=\"Categor\u00eda:Dinast\u00edas de Babilonia\">Dinast\u00edas de Babilonia</a></div><div class=\"CategoryTreeChildren\" style=\"display:none\"></div></div><div class=\"CategoryTreeSection\"><div class=\"CategoryTreeItem\"><span class=\"CategoryTreeBullet\"><span class=\"CategoryTreeToggle\" data-ct-title=\"Idioma_acadio\" data-ct-state=\"collapsed\">\u25ba</span> </span> <a class=\"CategoryTreeLabel  CategoryTreeLabelNs14 CategoryTreeLabelCategory\" href=\"/wiki/Categor%C3%ADa:Idioma_acadio\" title=\"Categor\u00eda:Idioma acadio\">Idioma acadio</a></div><div class=\"CategoryTreeChildren\" style=\"display:none\"></div></div><div class=\"CategoryTreeSection\"><div class=\"CategoryTreeItem\"><span class=\"CategoryTreeEmptyBullet\">\u25ba </span> <a class=\"CategoryTreeLabel  CategoryTreeLabelNs14 CategoryTreeLabelCategory\" href=\"/wiki/Categor%C3%ADa:Matem%C3%A1ticas_babil%C3%B3nicas\" title=\"Categor\u00eda:Matem\u00e1ticas babil\u00f3nicas\">Matem\u00e1ticas babil\u00f3nicas</a></div><div class=\"CategoryTreeChildren\" style=\"display:none\"></div></div><div class=\"CategoryTreeSection\"><div class=\"CategoryTreeItem\"><span class=\"CategoryTreeBullet\"><span class=\"CategoryTreeToggle\" data-ct-title=\"Religi\u00f3n_babil\u00f3nica\" data-ct-state=\"collapsed\">\u25ba</span> </span> <a class=\"CategoryTreeLabel  CategoryTreeLabelNs14 CategoryTreeLabelCategory\" href=\"/wiki/Categor%C3%ADa:Religi%C3%B3n_babil%C3%B3nica\" title=\"Categor\u00eda:Religi\u00f3n babil\u00f3nica\">Religi\u00f3n babil\u00f3nica</a></div><div class=\"CategoryTreeChildren\" style=\"display:none\"></div></div>"}}

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

  • Existirá alguna manera de extraer la información que te da la pagina web para poder colocarla en tu sitio web??

  • Hola que tal, mi nombre es Gerardo. Soy estudiante de doctorado de la UPM en España. Tengo una consulta y es si sabes el alcance de esta API de Wikipedia, es decir, podría ser capaz de recuperar todos los artículos categorizados como enfermedades, por ejemplo.

    No se si me he explicado bien, mi intención es identificar el alcance de la API para poder usarla.

    Muchas gracias por tu tiempo.

    • Hola Gerardo. Claro que se puede, aunque sería un poco complicado. Ya he actualizado el post para que veas cómo hacerlo; tiene que ver más con el web scrapping pero es totalmente posible.
      Saludos :)

      • Muchas gracias por tu rápida respuesta y por despejar mi duda y ese buen ejemplo que has elaborado. Ahora entiendo que buscar por categorías es más engorroso. Tal vez una búsqueda por un patrón como el infobox sería mas indicado, es decir, creo que los artículos médicos tienen un tipo de nfobox particular y tal vez consultar por ello podría tener una buena lista mas directamente de artículos referentes a la medicina. Pero mi otra pregunta y perdona por cargar la mano, esto se podría lograr desde la api de wikipedia?

        • Exacto, tendría que ser una búsqueda manual o de términos. Con la API de Wikipedia no es posible hasta donde sé, pero te digo que con web scrapping podrías hacerlo; indexando las páginas y extrayendo el texto de las mismas
          Saludos

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.