Extracción de datos de paginas web con Pandas - WebScraping con Python

Introducción:

Hola amigos de Internet. Bienvenidos a Mi Diario Python, el mejor blog para Aprender Python.

En este corto articulo, les mostrare la funcionalidad de la librería Pandas para leer datos de paginas web.  Esto nos permitirá extraer información de tablas de cuerpos HTML.

Imagen relacionada

La función read_html

La función read_html  es un método disponible en la librería Pandas utilizada para el análisis de datos. Ya hemos visto como funciona Pandas, almacena los datos en tablas, y nos permite escribir archivos csv. La función read_html  nos permite extraer datos directamente de paginas web. 

La función es muy fácil de utilizar, con solo pasarle la URL de la pagina web con la que queremos trabajar como argumento, extraerá los datos en tablas.

Veamos un pequeño ejemplo:

import pandas as pd
#Se lee los datos de wikipedia de los países
paises=pd.read_html('https://es.wikipedia.org/wiki/Anexo:Pa%C3%ADses')
print(paises)

[                                            0  
 0                       Estado(forma oficial)   
 1            República Islámica de Afganistán   
 2                        República de Albania   
 3               República Federal de Alemania   
 4                       Principado de Andorra   
 5                         República de Angola   
 6                           Antigua y Barbuda   
 7                     Reino de Arabia Saudita   
 8    República Argelina Democrática y Popular   
 9                         República Argentina   
 10                       República de Armenia   
 11                  Mancomunidad de Australia   
 12                       República de Austria   
 13                    República de Azerbaiyán   
 14                Mancomunidad de las Bahamas   
 15             República Popular de Bangladés   
 16                                   Barbados   
 17                            Reino de Baréin   
 18                           Reino de Bélgica   
 19                                     Belice   
 20                       República de Belarús   
 21                         República de Benín   
 22       República de la Unión de Myanmar[4]​   
 23            Estado Plurinacional de Bolivia   
 24                       Bosnia y Herzegovina   
 25                      República de Botsuana   
 26             República Federativa de Brasil   
 27                Estado de Brunéi Darussalam   
 28                      República de Bulgaria   
 29                               Burkina Faso   
 ..                                        ...   
 166                         Reino de eSwatini   

En el ejemplo estoy utilizando una pagina de Wikipedia la cual contiene una lista de los países del mundo con sus respectivas características. El resultado es una lista de los nombres de los pises y sus respectivas características. Cada tabla, tiene su espacio, veremos como extraer lo que necesitemos.

paises[0]

0 1 2 3 4 5 6 7 8
0 Estado(forma oficial) Nombre común Forma de gobierno Capital(es) Continente Estatus ONU Soberanía Notas Ubicación
1 República Islámica de Afganistán Afganistán República islámica presidencialista Kabul Asia Miembro (1946) Reconocida NaN NaN
2 República de Albania Albania República parlamentaria Tirana Europa Miembro (1955) Reconocida NaN NaN
3 República Federal de Alemania Alemania República parlamentaria Berlín Europa Miembro (1973)[1]​ Reconocida Estado miembro de la Unión Europea. Alemania e... NaN
4 Principado de Andorra Andorra Monarquía constitucional Andorra la Vieja Europa Miembro (1993) Reconocida Coprincipado con dos jefes de Estado, el presi... NaN

Si mostramos el indice 0 de "paises", veremos una tabla extremadamente grande, solo les estoy mostrando 4 columnas de las 195 que me muestra la pagina.

Muy bien, si sabes utilizar Pandas, sabe lo que viene ahora. Vemos mucha información, es momento de extraer lo que más nos interese. En este caso yo quiero el nombre de los países, su capital y su continente.

for x in range(1, 195):
    nombre = paises[0][1][x] # Nombre de los paises. Por ello utilizamos el indice 1
    capital = paises[0][3][x] # Nombre d elas capitales. Indice 3
    continente = paises[0][4][x] # Nombre de los continentes. Indice 4
    print("%s es la capital de %s (%s)" % (capital, nombre, continente))

Kabul es la capital de Afganistán (Asia)
Tirana es la capital de Albania (Europa)
Berlín es la capital de Alemania (Europa)
Andorra la Vieja es la capital de Andorra (Europa)
Luanda es la capital de Angola (África)
Saint John es la capital de Antigua y Barbuda (América)
Riad es la capital de Arabia Saudí / Arabia Saudita (Asia)
Argel es la capital de Argelia (África)
Buenos Aires es la capital de Argentina (América)
Ereván es la capital de Armenia (Asia-Europa)
...

Y el resultado debería ser una lista de 195 lineas.
Este proceso realizado con Pandas, nos abre las puertas a crear archivos csv o excel con 
todos los datos que tu extraigas.

¿Que te pareció? No dudo en que te servirá de mucho.

¿Alguna duda? No dudes en dejar tu comentario.

Mi nombre es Luis, y fue un placer compartir mis conocimientos con todos ustedes :D.
  1. Enrique Farias dice:

    Gracias muy bien presentado el tema pero quizas sea valioso usar jupyter para mostrar los datos creo que es un poco mas tangible y facil de comprender.

    Nuevamente excelente tutorial, este tema es complicado y me ha costado mucho tiempo dominarlo. Felicidades

    1. Luis Salcedo dice:

      Hola Enrique, gracias por visitar nuestro blog. De hecho todo esto lo he hecho en Jupyter. Si quiere que le facilite el archivo "ipynb" solo digamelo.

      1. carlos dice:

        Hola, muchas gracias me puedes facilitar el notebook
        gracias

    2. lhezzen dice:

      hola amigo por favor me podrias facilitar el arcgivo "ipynb" te lo agradeceria lo necesito pra un proyecto de mi universidad

  2. Unknown dice:

    Excelente, no conocía pandas

    1. Luis Salcedo dice:

      Gracias por visitar el blog. Puede conocer más sobre Pandas indagando en nuestros artículos :D.

  3. Anónimo dice:

    hola amigo
    me encanta sus tutoriales, son geniales y me ayudan mucho.

    dos cosas, la primera es una petición, si es posible claro. Me gustaría que realizaras proyectos enteros de aplicaciones para el día a día, como pueden ser compresores de archivos(rar, zip, etc), gestores de descargas, y cosas así, para diseñas nuestras propias aplicaciones.

    los segundo, comentar que su código de arriba, me lanza un error:
    Traceback (most recent call last):
    File "109-Scraping con Pandas.py", line 20, in
    nombre = dfs[0][1][x] # Nombre de los paises. Por ello utilizamos el indice 1
    File "C:ProgramDataAnaconda3libsite-packagespandascoreframe.py", line 2800, in __getitem__
    indexer = self.columns.get_loc(key)
    File "C:ProgramDataAnaconda3libsite-packagespandascoreindexesbase.py", line 2648, in get_loc
    return self._engine.get_loc(self._maybe_cast_indexer(key))
    File "pandas_libsindex.pyx", line 111, in pandas._libs.index.IndexEngine.get_loc
    File "pandas_libsindex.pyx", line 138, in pandas._libs.index.IndexEngine.get_loc
    File "pandas_libshashtable_class_helper.pxi", line 1618, in pandas._libs.hashtable.PyObjectHashTable.get_item
    File "pandas_libshashtable_class_helper.pxi", line 1626, in pandas._libs.hashtable.PyObjectHashTable.get_item
    KeyError: 1

    y no se ha que se debe.

    lo solucione modificandolo:
    for x in range(1, 195):
    nombre = dfs[0]['Nombre común'][x] # Nombre de los paises. Por ello utilizamos el indice 1
    capital = dfs[0]['Capital(es)'][x] # Nombre de elas capitales. Indice 3
    continente = dfs[0]['Continente'][x] # Nombre de los continentes. Indice 4
    print("%s es la capital de %s (%s)" % (capital, nombre, continente))

    muchas gracias por su tiempo.
    un saludo

    1. Anónimo dice:

      Las líneas del Blog me dan error, pero la corrección del Anónimo funciona!!

  4. Miguel Cárcamo dice:

    Muy bueno el código que permite rescatar datos de una página web.

    1. dcaraballo dice:

      Gracias Miguel, Saludos

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir
White Monkey