Introducción al Web Scraping
Las páginas web son una fuente inagotable de información. Hoy en día foros, blogs y más espacios que publican datos de interés, que pueden sernos de gran utilidad para realizar todos los análisis que imaginemos.
Las páginas web pueden ofrecernos información en tres formas:
- Archivos: Los cuales están listos a través de la página web para ser descargados.
- Servicios: La página web ofrece sus datos a través de un servicio como API REST
- Directamente: La página web ofrece la información a través su sitio, es decir, los datos están incrustados en la misma página web. A su vez esta ultima forma puede subdividirse en dos: La primera es que la información esté disponible accediendo a la URL y la segunda es que la página requiere una interacción previa del usuario para mostrar la información final.
Esta ultima forma en la cual las páginas web nos ofrecen información y la extracción de esta, es lo que se conoce como Web Scraping.
¿Qué es Web Scraping?
Web scraping, es una técnica utilizada mediante programas de software para extraer información de sitios web. Usualmente, estos programas simulan la navegación de un humano en la World Wide Web ya sea utilizando el protocolo HTTP manualmente, o incrustando un navegador en una aplicación. Más información: https://es.wikipedia.org/wiki/Web_scraping
Entender HTML
Para hacer web scraping es de vital importancia entender la estructura básica de un documento HTML y recordar las etiquetas HTML más usadas
La estructura general de un documento HTML es el siguiente:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Titulo</h1>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempore esse, laborum harum dignissimos
mollitia voluptatem quod dicta, corporis ratione repellat commodi minima, unde fugiat quaerat nulla sapiente temporibus eligendi sint?</p>
</body>
</html>
A continuación algunas de las etiquetas HTML más usadas:
Listas
<ul>
<li>Uno</li>
<li>Dos</li>
<li>Tres</li>
</ul>
Enlaces
<a href="<http://davidcasr.co/>">Mi página web</a>
Imágenes
<img src="my_img.jpg" alt="davidcasr" width="500" height="500">
Tablas
<table>
<tr>
<th>Mes</th>
<th>Valor</th>
</tr>
<tr>
<td>Enero</td>
<td>$100</td>
</tr>
</table>
Si quieres conocer todas las etiquetas de HTML recomiendo esta página web, con ejemplos y un buen diseño: https://htmlreference.io/
Recuerda que es importante tener clara la estructura de HTML y la definición del DOM (Document Object Model), esto te ayudará a entender como extraer la información de una web
Librerías para Web Scraping
- Requests: Permite controlar HTTP
- BeatifulSoup: Extraer información de un documento HTML
- Selenium: Crear navegadores fantasmas para controlar sitios web de manera automática
- Scrapy: Framework para hacer web scraping
Extracción de información: Que forma parte de la página
Consiste en obtener datos a partir de una página web. Para extraer datos, necesitamos conocer la estructura de la página web, la cual está compuesta normalmente por código HTML, scripts y estilos.
Web Scraping con Requests & BeautifulSoup
Usaremos el sitio web quotes.toscrape.com para el siguiente ejemplo. Este sitio web contiene cientos de citas famosas, sus autores y también algunas etiquetas para describir cada cita. Esta es la información que recopilaremos, en este caso especifico realizaremos extracción de las frases o citas de la primera página. Este sitio web permite hacer procesos de scraping, recuerden que es importante revisar si la página web para comprobar que permite realizar procesos de scraping
import requests
from bs4 import BeautifulSoupurl = '<http://quotes.toscrape.com/>'
web = requests.get(url)bs = BeautifulSoup(web.text)
list = bs.find_all('div', attrs={'class': 'quote'})for item in list:
i = item.find('span', attrs={'class': 'text'})
print(i.text)
El script es sencillo y permite extraer el listado de frases famosas correspondientes a la primera página
Extracción de información: Que requiere interacción previa
A menudo nos encontraremos con páginas web que nos solicitan información que debemos completar antes de mostrar un resultado deseado, es decir, necesitan cierta interacción previa por nuestra parte. Un ejemplo son las webs que requieren introducir un usuario y contraseña para ingresar o en nuestro caso, la pagina web de Latam (aerolínea) que nos solicita los lugares de salida y llegada para consultar la disponibilidad y precios de un vuelo.
Web Scraping con Selenium
Usaremos el sitio web de https://www.latamairlines.com/co/es para el siguiente ejemplo.
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilitiesoptions = webdriver.ChromeOptions()
options.add_argument('headless')driver = webdriver.Remote(
command_executor='<http://selenium-hub:4444/wd/hub>',
desired_capabilities=DesiredCapabilities.CHROME)driver.get('<https://www.latamairlines.com/co/es>')# Imprimir titulo de página web
print(driver.title)# quit () es un comando webdriver que llama al método driver.dispose,
# que a su vez cierra todas las ventanas del navegador y finaliza la sesión de WebDriver.
# Si no usamos quit () al final del programa, la sesión de WebDriver no se cerrará correctamente
# y los archivos no se borrarán de la memoria. Esto puede resultar en errores de pérdida de memoria.
driver.quit()
Este ejemplo es bastante sencillo y permite extraer el titulo de la página. El script se programó de esa manera porque estamos usando selenium-hub sobre un ambiente Docker.
🚀 Repositorio
Referencias
- Web scraping https://es.wikipedia.org/wiki/Web_scraping
- JavaScript HTML DOM https://www.w3schools.com/js/js_htmldom.asp
- Document Object Model https://es.wikipedia.org/wiki/Document_Object_Model
- HTML Reference https://htmlreference.io/
- Quotes to Scrape http://quotes.toscrape.com/