Aprovecha el precio especial

Antes:$249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Comienza ahora

Termina en:

03d

15h

31m

12s

3

Tutorial: BeatifulSoap

En este artículo aprenderemos a utilizar la librería BeatifulSoap de Python para obtener contenidos de páginas webs de manera automática.
En internet encontramos de todo: artículos, noticias, estadísticas e información útil (¿e inútil?), pero ¿cómo la extraemos? No siempre se encuentra en forma de descarga ó puede haber información repartida en multiples dominios, ó puede que necesitemos información histórica, de webs que cambian con el tiempo.
Para poder generar nuestros propios archivos con los datos que nos interesan y de manera automática es que utilizaremos la técnica de WebScraping.
Para poder usar esta técnica hay diversas librerías, pero utilizaremos una muy popular llamada Beautiful Soap.

pip install BeautifulSoup4
pip install requests
 

Conocimientos básicos de HTML y CSS

<html><head><title>Titulo de pagina</title></head><body><p> Soy un parrafo</p><div>Soy un texto en un DIV</div><table><tr><td>soy una celda dentro de una tabla</td></tr></table></body></html>

Aqui Vemos las etiquetas básicas de HTML, es decir las de inicio y cierre y dentro de body el contenido de la página. Como ejemplo vemos un párrafo “p”, un “div” y una tabla.

¿Y porqué CSS? en realidad no necesitamos estrictamente saber CSS, pero sí sus selectores, puesto que nos pueden ser de mucha ayuda. Lo básico para comprender selectores, usando este bloque de ejemplo es:

<html><head>/head>
    <body><divclass="contenedor"><divid="123"name="bloque_bienvenida"class="verde">
        Bienvenido a mi web
        </div></div></body></html>

Para poder seleccionar el texto “Bienvenido a mi web“, tenemos diversas formas:

  • la más directa será si la etiqueta tiene un atributo id que es único en el ejemplo “123”

  • Podríamos buscar los nodos de tipo div, pero podría haber muchos y deberemos filtrarlos.

  • Podemos filtrar un div con el atributo name = “bloque_bienvenida”.

  • Podemos buscar por clase CSS, en el ejemplo “verde”.

  • Muchas veces se combinan selectores, por ejemplo: dentro de la clase “contenedor”, la clase “verde”. O decir: “traer un div con la clase verde”

La librería de Beautiful Soap nos permite buscar dentro de los nodos del árbol de la página web, también conocido como DOM

Inspección Manual de la web

Esta es la web de la bolsa de Madrid, en donde nos interesa obtener el Indice del IBEX35®
Para el ejemplo inspeccionaremos la web de la Bolsa de Madrid. ¿Qué es eso de inspeccionar? Bueno, los navegadores web “modernos” (Safari, Firefox, Chrome) cuentan con una opción que nos permite ver el código html completo de la página que estamos viendo.

Además existe una opción de “inspección del código” que nos permite ver el HTML, Javascript, CSS y la web al mismo tiempo. Con ello buscaremos la manera de extraer el texto que nos interesa, si buscamos por id, por algún atributo, clase ó nodos.

Por lo general podemos inspeccionar haciendo click con el botón derecho del mouse sobre el área que nos interesa.

Al hacer clic derecho, aparece la opción de Inspeccionar Elemento. Así podemos ver las entrañas de la web en la que estamos navegando y pensar la mejor opción para extraer contenidos.
En nuestro caso nos interesa obtener el valor de la fila con nombre IBEX35® y el valor de la columna “último”.

Código Python

Veamos en código cómo haremos para acceder a esa porción de texto.

Primero importamos las librerías Python que utilizaremos:

import requests
from bs4 import BeautifulSoupimport csv
from datetime import datetime

Indicamos la ruta de la web que deseamos acceder:

# indicar la rutaurl_page = 'http://www.bolsamadrid.es/esp/aspx/Indices/Resumen.aspx'

Y ahora haremos el request a esa ruta y procesaremos el HTML mediante un objeto de tipo BeautifulSoap:

# tarda 480 milisegundospage = requests.get(url_page).text 
soup = BeautifulSoup(page, "lxml")

Bien, ahora toca pensar la estrategia para acceder al valor. En nuestro caso nos interesa primero acceder a la tabla, y de allí a sus celdas. Por suerte la tabla tiene un id único!

# Obtenemos la tabla por un ID específico
tabla = soup.find('table', attrs={'id': 'ctl00_Contenido_tblÍndices'})
tabla

Aqui vemos el id de la tabla marcado en amarillo.
En rojo, se muestra la tercera celda de la primer fila a la que queremos acceder.
Bien, ahora dentro de la tabla y siendo que en este caso no tenemos un acceso directo a las celdas por ids únicos ni por clases, sólo nos queda iterar… Entonces, accederemos a la primer fila y obtendremos de las celdas el nombre del índice y su valor:

name=""price=""nroFila=0
for fila in tabla.find_all("tr"):
    ifnroFila==1:nroCelda=0
        for celda in fila.find_all('td'):
            ifnroCelda==0:name=celda.text
                print("Indice:", name)
            ifnroCelda==2:price=celda.text
                print("Valor:", price)
            nroCelda=nroCelda+1nroFila=nroFila+1

Veremos cómo salida:

Indice: IBEX 35® <br>Valor: 9.185,20

Ya sólo nos queda guardar los datos para usar en el futuro.

Obtener los enlaces de una página web

Otro caso práctico que nos suele ocurrir es querer colectar los enlaces de una página web. Para ello, obtenemos las etiquetas “A” e iteramos obteniendo el atributo HREF que es donde se encuentran las “nuevas rutas”, con posibilidad de hacer un nuevo request a cada una y extraer sus contenidos.

url_page = 'https://www.lifeder.com/cientificos-famosos/'
page = requests.get(url_page).text 
soup = BeautifulSoup(page, "lxml")
contenido = soup.find('div', attrs={'class': 'td-post-content'})
items = contenido.find_all('a')
foriteminitems:
    print(item['href'])

Conclusiones, repaso y código
Ahora sabemos cómo afrontar el proceso de obtener información de cualquier página web. Resumiendo el procedimiento básico que seguimos es:

  • Cargar la página en el navegador

  • Inspeccionar e investigar el HTML

  • En Python: importar las librerías

  • Obtener la página, parsear el contenido con BeautifulSoap

  • Obtner el “trozo” de contenido que buscamos

– Mediante ID

– Mediante Etiqueta

– Mediante Clases CSS

– Otros Atributos

  • Guardamos los datos en csv

Repasando, cuando ya tenemos el contenido en un objeto “soap”, solemos utilizar los métodos find() ó para múltiples etiquetas el find_all().

Si combinamos un script para webscraping, como en el ejemplo para capturar valores de la bolsa con el cron del sistema (ó con algún tipo de “repetidor de tareas del sistema”) que nos permita ejecutar nuestro código cada “x” tiempo, podremos generar un valioso archivo de información muy a medida de lo que necesitamos.

Escribe tu comentario
+ 2