32

Introducción al web scraping con Python

112849Puntos

hace 5 años

Un paso primordial en la Ciencia de Datos es la extracción de los mismos. Es el primero de un proceso que se conoce como ETL. Significa Extract Transform Load y es el día a día dentro de la Ingeniería de Datos.

En Extract nos dedicamos a escoger nuestras fuentes de datos, pudiendo ser bases de datos, archivos CSV, datasets públicos. Luego pasamos a Transform y es aquí donde vamos a transformarlos para introducirlos a nuestro data warehouse, debemos identificar ciertos problemas como datos faltantes o datos erróneos y solucionarlos. Por último Load, no es más que la inserción de los datos en nuestro data warehouse.

Web scraping

Para hacer esto con Python vamos a necesitar una librería muy popular en el lenguaje llamada requests que nos facilita la manera en que realizamos peticiones a la web con una sintaxis no tan complicada.

Es necesario instalar requests, puede ser con pip, pipenv, conda o el que sea de tu preferencia.

>import requests
> r = requests.get('https://platzi.com')

> r.status_code
200

requests nos va a devolver un objeto del cual podemos hacer uso de varios métodos para acceder a él. Si quisiéramos saber el tipo de contenido que nos está regresando Platzi podemos hacer:

> r.headers['Content-Type']
'text/html; charset=utf-8'

Vamos a lo importante. Queremos ver todo el HTML que obtuvimos en nuestro objeto response. Podemos encontrarlo haciendo lo siguiente:

> r.text
<htmllang='ES_es'....

No lo voy a colocar todo pero puedes hacer la prueba si deseas.

Ahora para extraer la información que tenemos almacenada en nuestra variable podemos hacer uso de otra librería llamada BeautifulSoup, esta nos ayudará a parsear nuestro HTML y organizarlo de una manera para así nosotros podamos consultarlo y manipularlo usando los selectores de CSS

Al Igual que requests, también debemos instalar la librería BeautifulSoup4. Debemos importarlo en nuestra línea de comandos o en el archivo donde estamos trabajando y pasarle nuestro documento html.

frombs4 importBeautifulSoup
platzi = BeautifulSoup(r.text, 'html.parser')

html.parser es importante ya que BeautifulSoup también nos ayuda a manipular documentos XML.

Supongamos por un momentos que queremos saber el nombre de todas las carreras de Platzi o la cantidad. Usemos el código actual para lograr eso y agreguemos un par de líneas más. Necesitamos saber cuál clase o id usa la gente de Platzi para estructurar el HTML, en específico los nombres de las carreras en el home. Eso podemos averiguarlo desde nuestro navegador y usando el inspector de elemento, se puede abrir con click derecho > Inspeccionar Elemento o simplemente F12

En Firefox, obtendremos algo como esto:

Se puede ver que usan la clase Card-title en una etiqueta span. Usemos eso.

careers_name = platzi.select('.Card-title')
careers = [career.stringfor career in careers_name]

Nuestra primera variable careers_name nos guarda una lista con todas las etiquetas span con la clase que especificamos. Un ejemplo: Fundamentos de Programación, ya estamos un poco más cerca de lo que necesitamos.

En la segunda línea que agregamos, hacemos uso de un list comprehension para iterar sobre la variable anterior y conseguir únicamente el texto(string) importante, en este caso el nombre de la carrera.

Si queremos ver la cantidad de carreras que tenemos en nuestra variable careers, podemos hacer esto:

len(careers)46

En este momento Platzi tiene un total de 46 carreras. También podemos imprimir los nombres en pantalla con print(careers) o puedes también imprimirlas todas con un for.

for career in careers:
    print(career)

El código completo es este:

import requests
from bs4 import BeautifulSoup

r = requests.get('https://platzi.com')

platzi = BeautifulSoup(r.text, 'html.parser')

careers_name = platzi.select('.Card-title')
careers = [career.stringfor career in careers_name]
print(careers)

Conclusión

Esto mismo lo podemos hacer para conseguir el precio de algún producto de Amazon o los títulos de una página de noticias como El País o El Universal. De hecho, en el Curso de Ingeniería de Datos con Python se trabaja en ese proyecto para poder comparar ambas plataformas de noticias.

Si quieres saber mucho más sobre este mundo, aprender sobre Jupyter Notebooks y Pandas, es un curso que no te puedes perder.

Kevin
Kevin
iKenshu

112849Puntos

hace 5 años

Todas sus entradas
Escribe tu comentario
+ 2
3
12312Puntos

Muy bueno! ¿De que manera comparan ambas plataformas en el curso?