WebScraping (extracción de datos) de wikipedia con Pandas
Posted on jue 19 abril 2018 in Tutorial Python • 7 min read
Continuando con la serie de artículos sobre Pandas, en este artículo se muestra un proceso de extracción de datos web de la página que contiene información sobre los Estados de Venezuela de Wikipedia.
En los procesos anteriores de WebScraping se trabajaba practicamente a mano para indentificar las secciones del código html donde se encuentra la información útil, para el caso con Pandas este abstrae ese proceso.
A continuación se muestra una captura de pantalla de la página donde se quiere extraer la información:
La información que maneja la página son los estados con sus capitales, densidad poblacional, superficie, año de admisión, población, densidad, región y código ISO, la parte de la bandera ni del mapa no se muestra por que son imágenes y no se obtiene información útil de ellas.
A continuación todo el proceso de extracción de información de la página:
In [1]:
#Se importa pandas como pd
import pandas as pd
#Se lee los datos de wikipedia de los estados de venezuela, este devuelve una lista
estados= pd.read_html('https://es.wikipedia.org/wiki/Estados_de_Venezuela')
estados
Out[1]:
[ 0 1
0 NaN Este artículo o sección necesita referencias q...,
0
0 Estados Federales de Venezuela
1 Bolívar Amazonas Apure Zulia Táchira Barinas M...,
0 1 2 3 \
0 Bandera Entidad federal Capital Código ISO
1 NaN Amazonas Puerto Ayacucho VE-Z
2 NaN Anzoátegui Barcelona VE-B
3 NaN Apure San Fernando de Apure VE-C
4 NaN Aragua Maracay VE-D
5 NaN Barinas Barinas VE-E
6 NaN Bolívar Ciudad Bolívar VE-F
7 NaN Carabobo Valencia VE-G
8 NaN Cojedes San Carlos VE-H
9 NaN Delta Amacuro Tucupita VE-Y
10 NaN Distrito Capital Caracas VE-A
11 NaN Falcón Coro VE-I
12 NaN Guárico San Juan de Los Morros VE-J
13 NaN Lara Barquisimeto VE-K
14 NaN Mérida Mérida VE-L
15 NaN Miranda Los Teques VE-M
16 NaN Monagas Maturín VE-N
17 NaN Nueva Esparta La Asunción VE-O
18 NaN Portuguesa Guanare VE-P
19 NaN Sucre Cumaná VE-R
20 NaN Táchira San Cristóbal VE-S
21 NaN Trujillo Trujillo VE-T
22 NaN Vargas La Guaira VE-X
23 NaN Yaracuy San Felipe VE-U
24 NaN Zulia Maracaibo VE-V
25 NaN Dependencias Federales Gran Roque VE-W
4 5 \
0 Año de admisión Población (2011)[2]
1 1992 &&&&&&&&&0161844.&&&&&0161 844
2 1909 &&&&&&&&02179838.&&&&&02 179 838
3 1864 &&&&&&&&&0501404.&&&&&0501 404
4 1909 &&&&&&&&01819630.&&&&&01 819 630
5 1937 &&&&&&&&&0853949.&&&&&0853 949
6 1901 &&&&&&&&02069064.&&&&&02 069 064
7 1865 &&&&&&&&02342665.&&&&&02 342 665
8 1864 &&&&&&&&&0367020.&&&&&0367 020
9 1992 &&&&&&&&&0180363.&&&&&0180 363
10 1999 &&&&&&&&04033186.&&&&&04 033 186
11 1872 &&&&&&&&01064615.&&&&&01 064 615
12 1864 &&&&&&&&&0746174.&&&&&0746 174
13 1909 &&&&&&&&01892439.&&&&&01 892 439
14 1909 &&&&&&&&&0903955.&&&&&0903 955
15 1909 &&&&&&&&03112851.&&&&&03 112 851
16 1909 &&&&&&&&&0938185.&&&&&0938 185
17 1909 &&&&&&&&&0525139.&&&&&0525 139
18 1909 &&&&&&&&&0897104.&&&&&0897 104
19 1909 &&&&&&&&&0892990.&&&&&0892 990
20 1899 &&&&&&&&01277241.&&&&&01 277 241
21 1864 &&&&&&&&&0901239.&&&&&0901 239
22 1998 &&&&&&&&&0419928.&&&&&0419 928
23 1899 &&&&&&&&&0645688.&&&&&0645 688
24 1864 &&&&&&&&04694856.&&&&&04 694 856
25 1938 &&&&&&&&&&&02155.&&&&&02155
6 7 \
0 Superficie (km²) Densidad (hab/km²)
1 &&&&&&&&&0177617.&&&&&0177 617 &&&&&&&&&&&&&&00.9900000,99
2 &&&&&&&&&&043300.&&&&&043 300 &&&&&&&&&&&&&033.90000033,9
3 &&&&&&&&&&076500.&&&&&076 500 &&&&&&&&&&&&&&06.&&&&&06,0
4 &&&&&&&&&&&07014.&&&&&07014 &&&&&&&&&&&&0235.600000235,6
5 &&&&&&&&&&035200.&&&&&035 200 &&&&&&&&&&&&&023.20000023,2
6 &&&&&&&&&0240528.&&&&&0240 528 &&&&&&&&&&&&&&07.8700007,87
7 &&&&&&&&&&&04650.&&&&&04650 &&&&&&&&&&&&0713.&10000713,01
8 &&&&&&&&&&014800.&&&&&014 800 &&&&&&&&&&&&&021.80000021,8
9 &&&&&&&&&&040200.&&&&&040 200 &&&&&&&&&&&&&&04.6500004,65
10 &&&&&&&&&&&&0433.&&&&&0433 &&&&&&&&&&&07246.4000007246,4
11 &&&&&&&&&&024800.&&&&&024 800 &&&&&&&&&&&&&036.40000036,4
12 &&&&&&&&&&064986.&&&&&064 986 &&&&&&&&&&&&&011.50000011,5
13 &&&&&&&&&&019800.&&&&&019 800 &&&&&&&&&&&&&089.60000089,6
14 &&&&&&&&&&011300.&&&&&011 300 &&&&&&&&&&&&&092.80000092,8
15 &&&&&&&&&&&07950.&&&&&07950 &&&&&&&&&&&&0336.500000336,5
16 &&&&&&&&&&028900.&&&&&028 900 &&&&&&&&&&&&&031.30000031,3
17 &&&&&&&&&&&01150.&&&&&01150 &&&&&&&&&&&&0480.&10000480,01
18 &&&&&&&&&&015200.&&&&&015 200 &&&&&&&&&&&&&057.70000057,7
19 &&&&&&&&&&011800.&&&&&011 800 &&&&&&&&&&&&&076.&&&&&076,0
20 &&&&&&&&&&011100.&&&&&011 100 &&&&&&&&&&&&0105.300000105,3
21 &&&&&&&&&&&07400.&&&&&07400 &&&&&&&&&&&&&092.80000092,8
22 &&&&&&&&&&&01497.&&&&&01497 &&&&&&&&&&&&0235.800000235,8
23 &&&&&&&&&&&07100.&&&&&07100 &&&&&&&&&&&&&084.60000084,6
24 &&&&&&&&&&063100.&&&&&063 100 &&&&&&&&&&&&&073.70000073,7
25 &&&&&&&&&&&&0120.&&&&&0120 &&&&&&&&&&&&&018.&&&&&018,0
8 9
0 Región Mapa
1 Guayana NaN
2 Nor - Oriental NaN
3 Llanos NaN
4 Central NaN
5 Andina NaN
6 Guayana NaN
7 Central NaN
8 Central NaN
9 Guayana NaN
10 Capital NaN
11 Centro-Occidental NaN
12 Llanos NaN
13 Centro-Occidental NaN
14 Andina NaN
15 Capital NaN
16 Nor - Oriental NaN
17 Insular NaN
18 Centro-Occidental NaN
19 Nor - Oriental NaN
20 Andina NaN
21 Andina NaN
22 Capital NaN
23 Centro-Occidental NaN
24 Zuliana NaN
25 Insular NaN ]
In [2]:
#Tipo de los estados
type(estados)
Out[2]:
list
In [3]:
#Tipo del primer elemento es un dataframe
type(estados[0])
Out[3]:
pandas.core.frame.DataFrame
In [4]:
#Se listan del dataframe estados y capitales (elementos 1 y 2 del dataframe, y se recorre)
for i in range(1,26):
print(estados[2][1][i],estados[2][2][i])
Amazonas Puerto Ayacucho
Anzoátegui Barcelona
Apure San Fernando de Apure
Aragua Maracay
Barinas Barinas
Bolívar Ciudad Bolívar
Carabobo Valencia
Cojedes San Carlos
Delta Amacuro Tucupita
Distrito Capital Caracas
Falcón Coro
Guárico San Juan de Los Morros
Lara Barquisimeto
Mérida Mérida
Miranda Los Teques
Monagas Maturín
Nueva Esparta La Asunción
Portuguesa Guanare
Sucre Cumaná
Táchira San Cristóbal
Trujillo Trujillo
Vargas La Guaira
Yaracuy San Felipe
Zulia Maracaibo
Dependencias Federales Gran Roque
In [5]:
#Ahora se crea una lista de diccionarios donde estará la información de cada estado
lista = []
for i in range(1,26):
lista.append({'Estado':estados[2][1][i],
'Capital': estados[2][2][i],
'codigo_iso': estados[2][3][i],
u'año_admision': estados[2][4][i],
'Poblacion': int(estados[2][5][i].split(".")[0].split("&")[-1]),
'Superficie': int(estados[2][6][i].split(".")[0].split("&")[-1]),
'Densidad': float(estados[2][7][i].split(",")[0].split("&")[-1]),
'Region': estados[2][8][i]
})
print(lista)
[{'Region': 'Guayana', 'Densidad': 0.99, 'Superficie': 177617, 'Estado': 'Amazonas', 'codigo_iso': 'VE-Z', 'Poblacion': 161844, 'Capital': 'Puerto Ayacucho', 'año_admision': '1992'}, {'Region': 'Nor - Oriental', 'Densidad': 33.90000033, 'Superficie': 43300, 'Estado': 'Anzoátegui', 'codigo_iso': 'VE-B', 'Poblacion': 2179838, 'Capital': 'Barcelona', 'año_admision': '1909'}, {'Region': 'Llanos', 'Densidad': 6.0, 'Superficie': 76500, 'Estado': 'Apure', 'codigo_iso': 'VE-C', 'Poblacion': 501404, 'Capital': 'San Fernando de Apure', 'año_admision': '1864'}, {'Region': 'Central', 'Densidad': 235.600000235, 'Superficie': 7014, 'Estado': 'Aragua', 'codigo_iso': 'VE-D', 'Poblacion': 1819630, 'Capital': 'Maracay', 'año_admision': '1909'}, {'Region': 'Andina', 'Densidad': 23.20000023, 'Superficie': 35200, 'Estado': 'Barinas', 'codigo_iso': 'VE-E', 'Poblacion': 853949, 'Capital': 'Barinas', 'año_admision': '1937'}, {'Region': 'Guayana', 'Densidad': 7.8700007, 'Superficie': 240528, 'Estado': 'Bolívar', 'codigo_iso': 'VE-F', 'Poblacion': 2069064, 'Capital': 'Ciudad Bolívar', 'año_admision': '1901'}, {'Region': 'Central', 'Densidad': 10000713.0, 'Superficie': 4650, 'Estado': 'Carabobo', 'codigo_iso': 'VE-G', 'Poblacion': 2342665, 'Capital': 'Valencia', 'año_admision': '1865'}, {'Region': 'Central', 'Densidad': 21.80000021, 'Superficie': 14800, 'Estado': 'Cojedes', 'codigo_iso': 'VE-H', 'Poblacion': 367020, 'Capital': 'San Carlos', 'año_admision': '1864'}, {'Region': 'Guayana', 'Densidad': 4.6500004, 'Superficie': 40200, 'Estado': 'Delta Amacuro', 'codigo_iso': 'VE-Y', 'Poblacion': 180363, 'Capital': 'Tucupita', 'año_admision': '1992'}, {'Region': 'Capital', 'Densidad': 7246.4000007246, 'Superficie': 433, 'Estado': 'Distrito Capital', 'codigo_iso': 'VE-A', 'Poblacion': 4033186, 'Capital': 'Caracas', 'año_admision': '1999'}, {'Region': 'Centro-Occidental', 'Densidad': 36.40000036, 'Superficie': 24800, 'Estado': 'Falcón', 'codigo_iso': 'VE-I', 'Poblacion': 1064615, 'Capital': 'Coro', 'año_admision': '1872'}, {'Region': 'Llanos', 'Densidad': 11.50000011, 'Superficie': 64986, 'Estado': 'Guárico', 'codigo_iso': 'VE-J', 'Poblacion': 746174, 'Capital': 'San Juan de Los Morros', 'año_admision': '1864'}, {'Region': 'Centro-Occidental', 'Densidad': 89.60000089, 'Superficie': 19800, 'Estado': 'Lara', 'codigo_iso': 'VE-K', 'Poblacion': 1892439, 'Capital': 'Barquisimeto', 'año_admision': '1909'}, {'Region': 'Andina', 'Densidad': 92.80000092, 'Superficie': 11300, 'Estado': 'Mérida', 'codigo_iso': 'VE-L', 'Poblacion': 903955, 'Capital': 'Mérida', 'año_admision': '1909'}, {'Region': 'Capital', 'Densidad': 336.500000336, 'Superficie': 7950, 'Estado': 'Miranda', 'codigo_iso': 'VE-M', 'Poblacion': 3112851, 'Capital': 'Los Teques', 'año_admision': '1909'}, {'Region': 'Nor - Oriental', 'Densidad': 31.30000031, 'Superficie': 28900, 'Estado': 'Monagas', 'codigo_iso': 'VE-N', 'Poblacion': 938185, 'Capital': 'Maturín', 'año_admision': '1909'}, {'Region': 'Insular', 'Densidad': 10000480.0, 'Superficie': 1150, 'Estado': 'Nueva Esparta', 'codigo_iso': 'VE-O', 'Poblacion': 525139, 'Capital': 'La Asunción', 'año_admision': '1909'}, {'Region': 'Centro-Occidental', 'Densidad': 57.70000057, 'Superficie': 15200, 'Estado': 'Portuguesa', 'codigo_iso': 'VE-P', 'Poblacion': 897104, 'Capital': 'Guanare', 'año_admision': '1909'}, {'Region': 'Nor - Oriental', 'Densidad': 76.0, 'Superficie': 11800, 'Estado': 'Sucre', 'codigo_iso': 'VE-R', 'Poblacion': 892990, 'Capital': 'Cumaná', 'año_admision': '1909'}, {'Region': 'Andina', 'Densidad': 105.300000105, 'Superficie': 11100, 'Estado': 'Táchira', 'codigo_iso': 'VE-S', 'Poblacion': 1277241, 'Capital': 'San Cristóbal', 'año_admision': '1899'}, {'Region': 'Andina', 'Densidad': 92.80000092, 'Superficie': 7400, 'Estado': 'Trujillo', 'codigo_iso': 'VE-T', 'Poblacion': 901239, 'Capital': 'Trujillo', 'año_admision': '1864'}, {'Region': 'Capital', 'Densidad': 235.800000235, 'Superficie': 1497, 'Estado': 'Vargas', 'codigo_iso': 'VE-X', 'Poblacion': 419928, 'Capital': 'La Guaira', 'año_admision': '1998'}, {'Region': 'Centro-Occidental', 'Densidad': 84.60000084, 'Superficie': 7100, 'Estado': 'Yaracuy', 'codigo_iso': 'VE-U', 'Poblacion': 645688, 'Capital': 'San Felipe', 'año_admision': '1899'}, {'Region': 'Zuliana', 'Densidad': 73.70000073, 'Superficie': 63100, 'Estado': 'Zulia', 'codigo_iso': 'VE-V', 'Poblacion': 4694856, 'Capital': 'Maracaibo', 'año_admision': '1864'}, {'Region': 'Insular', 'Densidad': 18.0, 'Superficie': 120, 'Estado': 'Dependencias Federales', 'codigo_iso': 'VE-W', 'Poblacion': 2155, 'Capital': 'Gran Roque', 'año_admision': '1938'}]
In [6]:
#Luego se crea un dataframe de la lista de diccionarios
df = pd.DataFrame(lista)
df
Out[6]: | ID | Capital | Densidad | Estado | Poblacion | Region | Superficie | año_admision | codigo_iso | | :- | :----------------: | :----------: | :------------- | :------: | :-------------: | :------- | :-----: | :-------: | | 0 | Puerto Ayacucho | 9.900000e-01 | Amazonas | 161844 | Guayana | 177617 | 1992 | VE-Z | | 1 | Barcelona | 3.390000e+01 | Anzoátegui | 2179838 | Nor - Oriental | 43300 | 1909 | VE-B | | 2 | San Fernando de Apure | 6.000000e+00 | Apure | 501404 | Llanos | 76500 | 1864 | VE-C | | 3 | Maracay | 2.356000e+02 | Aragua | 1819630 | Central | 7014 | 1909 | VE-D | | 4 | Barinas | 2.320000e+01 | Barinas | 853949 | Andina | 35200 | 1937 | VE-E | | 5 | Ciudad Bolívar | 7.870001e+00 | Bolívar | 2069064 | Guayana | 240528 | 1901 | VE-F | | 6 | Valencia | 1.000071e+07 | Carabobo | 2342665 | Central | 4650 | 1865 | VE-G | | 7 | San Carlos | 2.180000e+01 | Cojedes | 367020 | Central | 14800 | 1864 | VE-H | | 8 | Tucupita | 4.650000e+00 | Delta Amacuro | 180363 | Guayana | 40200 | 1992 | VE-Y | | 9 | Caracas | 7.246400e+03 | Distrito Capital| 4033186 | Capital | 433 | 1999 | VE-A | | 10 | Coro | 3.640000e+01 | Falcón | 1064615 |Centro-Occidental | 24800 | 1872 | VE-I | | 11 | San Juan de Los Morros| 1.150000e+01 | Guárico | 746174 | Llanos | 64986 | 1864 | VE-J | | 12 | Barquisimeto | 8.960000e+01 | Lara | 1892439 | Centro-Occidental| 19800 | 1909 | VE-K | | 13 | Mérida | 9.280000e+01 | Mérida | 903955 | Andina | 11300 | 1909 | VE-L | | 14 | Los Teques | 3.365000e+02 | Miranda | 3112851 | Capital | 7950 | 1909 | VE-M | | 15 | Maturín | 3.130000e+01 | Monagas | 938185 | Nor - Oriental | 28900 | 1909 | VE-N | | 16 | La Asunción | 1.000048e+07 | Nueva Esparta | 525139 | Insular | 1150 | 1909 | VE-O | | 17 | Guanare | 5.770000e+01 | Portuguesa | 897104 | Centro-Occidental| 15200 | 1909 | VE-P | | 18 | Cumaná | 7.600000e+01 | Sucre | 892990 | Nor - Oriental | 11800 | 1909 | VE-R | | 19 | San Cristóbal | 1.053000e+02 | Táchira | 1277241 | Andina | 11100 | 1899 | VE-S | | 20 | Trujillo | 9.280000e+01 | Trujillo | 901239 | Andina | 7400 | 1864 | VE-T | | 21 | La Guaira | 2.358000e+02 | Vargas | 419928 | Capital | 1497 | 1998 | VE-X | | 22 | San Felipe | 8.460000e+01 | Yaracuy | 645688 | Centro-Occidental| 7100 | 1899 | VE-U | | 23 | Maracaibo | 7.370000e+01 | Zulia | 4694856 | Zuliana | 63100 | 1864 | VE-V | | 24 | Gran Roque | 1.800000e+01 | D. Federales |2155 | Insular | 120 | 1938 | VE-W |
In [7]:
#Si se quiere la información de Carabobo
mascara = df["Estado"] == "Carabobo"
df[mascara]
Out[7]: | ID | Capital | Densidad | Estado | Poblacion | Region | Superficie | año_admision | codigo_iso | | :- | :----------------: | :----------: | :------------- | :------: | :-------------: | :------- | :-----: | :-------: | | 6 | Valencia | 1.000071e+07 | Carabobo | 2342665 | Central | 4650 | 1865 | VE-G |
In [8]:
#Otra forma de traer la información de Carabobo
df.iloc[6]
Out[8]:
Capital Valencia
Densidad 1.00007e+07
Estado Carabobo
Poblacion 2342665
Region Central
Superficie 4650
año_admision 1865
codigo_iso VE-G
Name: 6, dtype: object
In [9]:
#Para obtener la capital del estado
df.iloc[6]["Capital"]
Out[9]:
'Valencia'
In [ ]:
El proceso de eliminar la basura dentro del texto de algunos campos no se muestra, pero se usa en la construcción del diccionario.
¡Haz tu donativo! Si te gustó el artículo puedes realizar un donativo con Bitcoin (BTC) usando la billetera digital de tu preferencia a la siguiente dirección: 17MtNybhdkA9GV3UNS6BTwPcuhjXoPrSzV
O Escaneando el código QR desde la billetera: