Data Nurturing con pandas. Web Scrapping

Patricia Carmona
Ironhack
Published in
6 min readMar 24, 2020
Photo by Michael Payne on Unsplash

El Data Nurturing es un procedimiento que añade mucho valor a un DataFrame ya que permite ampliar la información de la que dispone el set de datos desde diferentes fuentes: interno, una API o desde una web.

En este post hablaremos de web scraping, una técnica que permite obtener información de un sitio web.

Para ponerlo en práctica puedes practicar con el dataset de Kaggle de vídeos de YouTube que ya utilicé en el post de Data Nurturing con pandas. API.

Puedes ver el proyecto completo en mi repositorio de GitHub.

Conociendo el DataFrame

El primer paso es conocer el DataFrame: qué datos almacena, si hay registros nulos y de qué tipo son los datos para proceder a hacer un Data Cleaning(1 y 2). De esta forma manipularemos un DataFrame con el que será muy fácil trabajar.

¿Qué es web scraping?

La técnica de web scraping es un recurso que permite obtener información disponible en una web y que es accesible a través del código HTML. Se accede desde un navegador a la web y se investiga el código de ésta en busca de la información que se necesita.

Conocer el HTML de una web

El código HTML y CSS con el que se ha desarrollado el front de una web puede consultarse a través del inspector de código del navegador. Pulsando con el botón derecho del ratón, encontramos la opción ‘‘Inspeccionar’’.

Inspector de código de Wikipedia

A la derecha de la captura de pantalla, en la parte superior puedes ver el código de Wikipedia. Si nos posicionamos encima de una etiqueta, el área que le corresponde en pantalla se remarca. Así es muy fácil saber qué apartado de la web corresponde con qué parte del código.

Inspector de código de la Wikipedia

Si buscase la información del artículo destacado en Wikipedia, puedo ver en el inspector de código (a la derecha) en qué etiqueta está almacenada esa información.

¿Cómo obtener la información de un apartado de una web?

BeautifulSoup es una librería de Pandas que permite acceder a la información del HTML de una web. El trabajo con esta librería es muy fácil, ya que solo hay que indicar la URL de la petición, el formato en el que quiero que devuelva la respuesta y después, buscar en qué etiqueta se almacena la información.

Primeros pasos con BeautifulSoup

Para comenzar hay que importar la librería, declarar la URL a la que acceder, realizar la petición del tipo GET con la librería requests y finalmente, parsear la información que devuelve en el formato más cómodo para nuestro trabajo.

import requests
from bs4 import BeautifulSoup
url = 'https://es.wikipedia.org/wiki/Wikipedia:Portada'
data = requests.get(url).text
soup = BeautifulSoup(data, 'html.parser')

Si imprimimos la variable soup, que almacena la información de la portada de Wikipedia obtenemos el código HTML que veíamos en el inspector del navegador.

Código HTML de la portada de Wikipedia

Por ello, para obtener la información de un apartado en concreto es útil recurrir al inspector de código y conocer en qué etiqueta se almacena esa información.

Ampliando la información de nuestro DataFrame

Volviendo al DataFrame que ya teníamos de vídeos de YouTube, ya que estamos analizado contenido sobre viajes una posibilidad para enriquecer el DataFrame es incluyendo el país sobre el que trata el vídeo.

Para ello en primer lugar, creo un listado de países del mundo y después comparo la serie ‘Description’ del DataFrame con el listado para saber si se menciona algún país y clasificarlo.

Para obtener el listado de países del mundo, hago web scraping de Wikipedia. Este listado voy a obtenerlo en inglés y español.

Listado de países en español

Una vez localizado el listado, abro el inspector de código y localizo cómo se almacena el nombre de los países. La tabla está en una etiqueta <table> y los países se encuentran anidados en <tr>, dentro de una etiqueta <td> y a su vez, en una subetiqueta de enlace <a>.

Web scraping para obtener el listado de países

Para obtener el listado de países con el que vamos enriquecer el DataFrame, el procedimiento es:

  1. Web: Wikipedia países y territorios
  2. Realizar la petición tipo GET y parsear el código HTML
  3. Buscar las etiquetas <td> y en ellas, las subetiquetas <a>
url = https://es.wikipedia.org/wiki/Anexo:Pa%C3%ADses_y_territorios_dependientes_por_poblaci%C3%B3ndata = requests.get(url).text
soup = BeautifulSoup(data, 'html.parser')

Como en la página hay varias tablas, localizamos cuál almacena el listado de países. En este caso, es la primera tabla.

table = soup.find_all('table')[0]
table
table[0]

El formato de la variable table es una lista o array, por lo que siendo un iterable puedo acceder al primer elemento con el índice [0]. Dentro de esta tabla, localizo las etiquetas <tr>. Éstas pueden asemejarse a las filas de la tabla. Si vas al listado de países en Wikipedia verás que hay 244 países y que la tabla contiene 3 filas más: cabecera, total del mundo y pie. Estas 3 filas extras no necesito extraerlas para el listado de países. Así que voy a iterar por la tabla desde el índice 1 hasta el índice 245.

countries = m.find_all('tr')[1:245]
countries

Ya tengo filtrada la tabla para localizar los países. El siguiente paso es encontrar las etiquetas <td> y dentro de éstas, las etiquetas <a>. Recuerda que estamos recorriendo una tabla y el formato de ésta también es iterable, por lo que cada país aparece en una fila.

for row in countries:
text = row.find_all('td')[1]
print(text)
Las dos primeras rows del listado countries donde aparecen China e India

Como aparecen diferentes etiquetas <td> por cada fila, he seleccionado la primera, que es donde se almacena el nombre del país. El último paso es reconocer en qué posición está la subetiqueta <a>, que se encuentra en segunda posición, en el índice [1]

text.find('a').text

¡Y ya tengo el nombre del país!

Para recorrer la tabla completa de forma fácil y extraer un listado de países, creo una función para extraer el nombre del país y lo aplico en una list comprehension para recorrer la tabla. Recopilo todos los pasos a continuación:

import requests
from bs4 import BeautifulSoup
url = 'https://es.wikipedia.org/wiki/Anexo:Pa%C3%ADses_y_territorios_dependientes_por_poblaci%C3%B3n'data = requests.get(url).text
soup = BeautifulSoup(data, 'html.parser')


def getCountry(row):
text = row.find_all("td")
return text[1].find("a").text


table = soup.find_all('table')[0]
countrSP = [getCountry(row) for row in table.find_all("tr")[1:245]]

Este mismo proceso lo aplico a la url de países y territorios en inglés. El procedimiento es similar, solo que las etiquetas cambian. Te animo a que lo desarrolles.

Con web scraping he conseguido el listado de países en español y el listado de países en inglés.

Enriquecer el DataFrame con la información obtenida de web scraping

Por último, itero sobre el DataFrame para complementar la información que ya tengo disponible y clasificar cada vídeo en un país, si éste aparece en la descripción.

He desarrollado una función para recorrer el listado de países y comparar si cada país aparece en la descripción del vídeo y la aplico al DataFrame con una lambda para crear la serie ‘Country’.

import redef checkCountry(countries, serie):
for country in countries:
try:
if re.findall(f'{country}', serie)[0] == country:
return country
except:
pass
df['Country'] = df['Description'].apply(lambda x: checkCountry(countries, x))
DataFrame final

El DataFrame final está complementado con información procedente de la API de YouTube, de donde he extraído las visualizaciones de cada vídeo y de web scraping, de donde he obtenido un listado de países en español e inglés.

Complementar y enriquecer un DataFrame es muy útil para realizar un análisis de valor aportando información extra de la que no se dispone por defecto en el set de datos. Puedes recurrir a diferentes fuentes para incorporar información al DataFrame: a través de operaciones con datos del propio set o uniendo diferentes sets, una API o web scraping. ¡Seguimos!

--

--

Patricia Carmona
Ironhack

Data Analyst. Improving the relation brands-users.