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:
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.
Existirá alguna manera de extraer la información que te da la pagina web para poder colocarla en tu sitio web??
Hola. Gracias por sus comentarios. Si tiene alguna consulta o duda, solicitud de creación de un programa o solicitud de cambio de software estoy para servirle en https://parzibyte.me/#contacto
Saludos!
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
Pingback: Creando un buscador de artículos con API de Wikipedia y VueJS - Parzibyte's blog - El blog de Luis Cabrera