Primeros pasos con la API de Wikipedia de Python

En este artículo, usaremos la API de Wikipedia para recuperar datos de Wikipedia. El raspado de datos ha experimentado un rápido aumento debido al uso cada vez mayor de datos y...

Introducción

En este artículo, utilizaremos la API de Wikipedia para recuperar datos de Wikipedia. El raspado de datos ha experimentado un rápido aumento debido al uso cada vez mayor de herramientas de análisis de datos y aprendizaje automático. Internet es la mayor fuente de información y, por lo tanto, es importante saber cómo obtener datos de varias fuentes. Y dado que Wikipedia es una de las fuentes de información más grandes y populares de Internet, este es un lugar natural para comenzar.

En este artículo, veremos cómo usar la API de Wikipedia de Python para obtener una variedad de información del sitio web de Wikipedia.

Instalación

Para poder extraer datos de Wikipedia, primero debemos instalar la Biblioteca Wikipedia de Python, que envuelve la API oficial de Wikipedia. Esto se puede hacer ingresando el siguiente comando en su símbolo del sistema o terminal:

1
$ pip install wikipedia

Una vez realizada la instalación, podemos usar la API de Wikipedia en Python para extraer información de Wikipedia. Para llamar a los métodos del módulo Wikipedia en Python, necesitamos importarlo usando el siguiente comando.

1
import wikipedia

Búsqueda de títulos y sugerencias

El método search() realiza una búsqueda en Wikipedia de una consulta que se proporciona como argumento. Como resultado, este método devuelve una lista de todos los títulos de los artículos que contienen la consulta. Por ejemplo:

1
2
import wikipedia
print(wikipedia.search("Bill"))

Producción:

1
['Bill', 'The Bill', 'Bill Nye', 'Bill Gates', 'Bills, Bills, Bills', 'Heartbeat bill', 'Bill Clinton', 'Buffalo Bill', 'Bill & Ted', 'Kill Bill: Volume 1']

Como puede ver en el resultado, se muestran el título buscado junto con las sugerencias de búsqueda relacionadas. Puede configurar el número de títulos de búsqueda devueltos pasando un valor para el parámetro resultados, como se muestra aquí:

1
2
import wikipedia
print(wikipedia.search("Bill", results=2))

Producción:

1
['Bill', 'The Bill']

El código anterior imprime solo 2 resultados de búsqueda de la consulta, ya que esa es la cantidad que solicitamos que se devuelva.

Digamos que necesitamos obtener las sugerencias de búsqueda de Wikipedia para un título de búsqueda, "Bill Cliton", que se ingresó incorrectamente o tiene un error tipográfico. El método suggest() devuelve sugerencias relacionadas con la consulta de búsqueda ingresada como parámetro, o devolverá "Ninguna" si no se encontraron sugerencias.

Vamos a probarlo aquí:

1
2
import wikipedia
print(wikipedia.suggest("Bill cliton"))

Producción:

1
bill clinton

Puede ver que tomó nuestra entrada incorrecta, "Bill cliton", y devolvió la sugerencia correcta de "bill clinton".

Extracción del resumen del artículo de Wikipedia

Podemos extraer el resumen de un artículo de Wikipedia utilizando el método summary(). El artículo del que se debe extraer el resumen se pasa como parámetro a este método.

Extraigamos el resumen de "Ubuntu":

1
print(wikipedia.summary("Ubuntu"))

Producción:

1
Ubuntu ( (listen)) is a free and open-source Linux distribution based on Debian. Ubuntu is officially released in three editions: Desktop, Server, and Core (for the internet of things devices and robots). Ubuntu is a popular operating system for cloud computing, with support for OpenStack.Ubuntu is released every six months, with long-term support (LTS) releases every two years. The latest release is 19.04 ("Disco Dingo"), and the most recent long-term support release is 18.04 LTS ("Bionic Beaver"), which is supported until 2028. Ubuntu is developed by Canonical and the community under a meritocratic governance model. Canonical provides security updates and support for each Ubuntu release, starting from the release date and until the release reaches its designated end-of-life (EOL) date. Canonical generates revenue through the sale of premium services related to Ubuntu. Ubuntu is named after the African philosophy of Ubuntu, which Canonical translates as "humanity to others" or "I am what I am because of who we all are".

El resumen completo se imprime en la salida. Podemos personalizar el número de oraciones en el texto de resumen que se mostrará configurando el argumento sentencias del método.

1
print(wikipedia.summary("Ubuntu", sentences=2))

Producción:

1
Ubuntu ( (listen)) is a free and open-source Linux distribution based on Debian. Ubuntu is officially released in three editions: Desktop, Server, and Core (for the internet of things devices and robots).

Como puede ver, solo se imprimen 2 oraciones del resumen de texto de Ubuntu.

Sin embargo, tenga en cuenta que wikipedia.summary generará un "error de desambiguación" si la página no existe o si la página no es ambigua. Veamos un ejemplo.

1
print(wikipedia.summary("key"))

El código anterior arroja un DisambiguationError ya que hay muchos artículos que coincidirían con "clave".

Producción:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/wikipedia/util.py", line 28, in __call__
    ret = self._cache[key] = self.fn(*args, **kwargs)
  File "/Library/Python/2.7/site-packages/wikipedia/wikipedia.py", line 231, in summary
    page_info = page(title, auto_suggest=auto_suggest, redirect=redirect)
  File "/Library/Python/2.7/site-packages/wikipedia/wikipedia.py", line 276, in page
    return WikipediaPage(title, redirect=redirect, preload=preload)
  File "/Library/Python/2.7/site-packages/wikipedia/wikipedia.py", line 299, in __init__
    self.__load(redirect=redirect, preload=preload)
  File "/Library/Python/2.7/site-packages/wikipedia/wikipedia.py", line 393, in __load
    raise DisambiguationError(getattr(self, 'title', page['title']), may_refer_to)
wikipedia.exceptions.DisambiguationError: "Key" may refer to: 
Key (cryptography)
Key (lock)
Key (map)
...

Si hubiera querido el resumen en una "clave criptográfica", por ejemplo, tendría que ingresarlo de la siguiente manera:

1
print(wikipedia.summary("Key (cryptography)"))

Con la consulta más específica ahora obtenemos el resumen correcto en la salida.

Recuperación de datos completos de la página de Wikipedia

Para obtener el contenido, las categorías, las coordenadas, las imágenes, los enlaces y otros metadatos de una página de Wikipedia, primero debemos obtener el objeto de la página de Wikipedia o el ID de página de la página. Para hacer esto, se usa el método page() con la página cuyo título se pasa como argumento al método.

Mira el siguiente ejemplo:

1
wikipedia.page("Ubuntu")

Esta llamada de método devolverá un objeto WikipediaPage, que exploraremos más en las próximas secciones.

Extracción de metadatos de una página

Para obtener el contenido de texto sin formato completo de una página de Wikipedia (excluyendo imágenes, tablas, etc.), podemos usar el atributo contenido del objeto página.

1
print(wikipedia.page("Python").content)

Producción:

1
2
Python is an interpreted, high-level, general-purpose programming language. Created by Guido van Rossum and first released in 1991, Python's design philosophy emphasizes code readability with its notable use of significant whitespace. Its language constructs and object-oriented approach aims to help programmers write clear, logical code for small and large-scale projects.Python is dynamically typed and garbage-collected. It supports multiple programming paradigms, including procedural, object-oriented, and  functional programming. Python is often described as a "batteries included" language due to its comprehensive standard library.Python was conceived in the late 1980s as a successor to the ABC language. Python 2.0, released 2000, introduced features like list comprehensions and a garbage collection system capable of collecting reference cycles.
...

De manera similar, podemos obtener la URL de la página usando el atributo url:

1
print(wikipedia.page("Python").url)

Producción:

1
https://en.wikipedia.org/wiki/Python_(programming_language)

Podemos obtener las URL de los enlaces externos en una página de Wikipedia usando la propiedad references del objeto WikipediaPage.

1
print(wikipedia.page("Python").references)

Producción:

1
[u'http://www.computerworld.com.au/index.php/id;66665771', u'http://neopythonic.blogspot.be/2009/04/tail-recursion-elimination.html', u'http://www.amk.ca/python/writing/gvr-interview', u'http://cdsweb.cern.ch/journal/CERNBulletin/2006/31/News%20Articles/974627?ln=en', u'http://www.2ality.com/2013/02/javascript-influences.html', ...]

La propiedad title del objeto WikipediaPage se puede utilizar para extraer el título de la página.

1
print(wikipedia.page("Python").title)

Producción:

1
Python (programming language)

De manera similar, el atributo categorías se puede usar para obtener la lista de categorías de una página de Wikipedia:

1
print(wikipedia.page("Python").categories)

Producción

1
['All articles containing potentially dated statements', 'Articles containing potentially dated statements from August 2016', 'Articles containing potentially dated statements from December 2018', 'Articles containing potentially dated statements from March 2018', 'Articles with Curlie links', 'Articles with short description', 'Class-based programming languages', 'Computational notebook', 'Computer science in the Netherlands', 'Cross-platform free software', 'Cross-platform software', 'Dutch inventions', 'Dynamically typed programming languages', 'Educational programming languages', 'Good articles', 'High-level programming languages', 'Information technology in the Netherlands', 'Object-oriented programming languages', 'Programming languages', 'Programming languages created in 1991', 'Python (programming language)', 'Scripting languages', 'Text-oriented programming languages', 'Use dmy dates from August 2015', 'Wikipedia articles with BNF identifiers', 'Wikipedia articles with GND identifiers', 'Wikipedia articles with LCCN identifiers', 'Wikipedia articles with SUDOC identifiers']

El elemento links del objeto WikipediaPage se puede utilizar para obtener la lista de títulos de las páginas cuyos enlaces están presentes en la página.

1
print(wikipedia.page("Ubuntu").links)

Producción

1
[u'/e/ (operating system)', u'32-bit', u'4MLinux', u'ALT Linux', u'AMD64', u'AOL', u'APT (Debian)', u'ARM64', u'ARM architecture', u'ARM v7', ...]

Búsqueda de páginas basadas en coordenadas

El método geosearch() se usa para hacer una [búsqueda geográfica] en Wikipedia (https://www.mediawiki.org/wiki/Extension:GeoData) usando argumentos de latitud y longitud suministrados como números flotantes o decimales al método.

1
print(wikipedia.geosearch(37.787, -122.4))

Producción:

1
['140 New Montgomery', 'New Montgomery Street', 'Cartoon Art Museum', 'San Francisco Bay Area Planning and Urban Research Association', 'Academy of Art University', 'The Montgomery (San Francisco)', 'California Historical Society', 'Palace Hotel Residential Tower', 'St. Regis Museum Tower', 'Museum of the African Diaspora']

Como puede ver, el método anterior devuelve artículos en función de las coordenadas proporcionadas.

Del mismo modo, podemos establecer la propiedad de coordenadas de page() y obtener los artículos relacionados con la geolocalización. Por ejemplo:

1
print(wikipedia.page(37.787, -122.4))

Producción:

1
['140 New Montgomery', 'New Montgomery Street', 'Cartoon Art Museum', 'San Francisco Bay Area Planning and Urban Research Association', 'Academy of Art University', 'The Montgomery (San Francisco)', 'California Historical Society', 'Palace Hotel Residential Tower', 'St. Regis Museum Tower', 'Museum of the African Diaspora']

Configuración de idioma

Puede personalizar el idioma de una página de Wikipedia a su idioma nativo, siempre que la página exista en su idioma nativo. Para hacerlo, puedes usar el método set_lang(). Cada idioma tiene un [código de prefijo] estándar (https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) que se pasa como argumento al método. Por ejemplo, obtengamos las primeras 2 oraciones del texto de resumen de la página wiki de "Ubuntu" en el idioma alemán.

1
2
wikipedia.set_lang("de")  
print(wikipedia.summary("ubuntu", sentences=2))  

Producción

1
Ubuntu (auch Ubuntu Linux) ist eine Linux-Distribution, die auf Debian basiert. Der Name Ubuntu bedeutet auf Zulu etwa Menschlichkeit und bezeichnet eine afrikanische Philosophie.

Puede consultar la lista de idiomas ISO admitidos actualmente junto con su prefijo, de la siguiente manera:

1
print(wikipedia.languages())

Recuperación de imágenes en una página de Wikipedia {#recuperación de imágenes en una página de wikipedia}

La lista de imágenes del objeto WikipediaPage se puede utilizar para obtener imágenes de una página de Wikipedia. Por ejemplo, el siguiente script devuelve la primera imagen de la página de Ubuntu de Wikipedia:

1
print(wikipedia.page("ubuntu").images[0])

Producción

1
https://upload.wikimedia.org/wikipedia/commons/1/1d/Bildschirmfoto_zu_ubuntu_704.png

El código anterior devuelve la URL de la imagen presente en el índice 0 en la página de Wikipedia.

Para ver la imagen, puede copiar y pegar la URL anterior en su navegador.

Retreiving Full HTML Page Content

Para obtener la página completa de Wikipedia en formato HTML, puede usar el siguiente script:

1
print(wikipedia.page("Ubuntu").html())

Producción

1
2
3
<div class="mw-parser-output"><div role="note" class="hatnote navigation-not-searchable">For the African philosophy, see <a href="/wiki/Ubuntu_philosophy" title="Ubuntu philosophy">Ubuntu philosophy</a>. For other uses, see <a href="/wiki/Ubuntu_(disambiguation)" class="mw-disambig" title="Ubuntu (disambiguation)">Ubuntu (disambiguation)</a>.</div>
<div class="shortdescription nomobile noexcerpt noprint searchaux" style="display:none">Linux distribution based on Debian</div>
...

Como se ve en la salida, se muestra la página completa en formato HTML. Esto puede tardar un poco más en cargarse si el tamaño de la página es grande, así que tenga en cuenta que puede generar un HTMLTimeoutError cuando se agota el tiempo de espera de una solicitud al servidor.

Conclusión

En este tutorial, pudimos vislumbrar el uso de la API de Wikipedia para extraer datos de la web. Vimos cómo obtener una variedad de información, como el título de una página, la categoría, los enlaces, las imágenes y recuperar artículos según las ubicaciones geográficas.

Licensed under CC BY-NC-SA 4.0