Técnicas y herramientas
de Web Scraping
¿Quién soy?
David Hernández
Desarrollador en Political Watch
Political Watch es una fundación donde desarrollamos herramientas de transparencia y rendición de cuentas para conseguir un mundo más justo.
david.hernandez@politicalwatch.es
@David_Baltha
¿Qué vamos a ver hoy?
Conocimientos necesarios previos
- XML y HTML
- XPath
Scraping con Google Sheets
- HTML scraping
- Extracción de CSVs
- Extracción de Feeds RSS
Explotando los datos mediante herramientas No Code
- N8N
Conocimientos necesarios previos
¿Qué es el Web Scraping?
Entornos no Open Data
Muchos portales de datos abiertos los datos no usan los formatos adecuados y simplemente están incrustados en la propia página web.
Aunque podemos copiar y pegar la información que nos interese, puede ser un problema dependiendo del volumen. Para rescatar dicha información de una manera más automática se usa una técnica denominada Web Scraping.
Web Scrapping
La web se construye utilizando un lenguaje llamado HTML. Por tanto, la técnica consiste en obtener dicho código HTML y procesarlo para extraer el contenido que nos interesa, reduciendo el tiempo que necesitamos para extraer dicha información.
Para ser capaces de aplicar el Web Scraping, tenemos que conocer un mínimo de como funciona el HTML y como podemos procesarlo. Y para entender HTML, necesitamos conocer antes XML.
XML
El XML es un metalenguaje que define una estructura para crear lenguajes. El formato es el siguiente:
<etiqueta atributo="valor">Contenido</etiqueta>
El contenido puede ser otras etiquetas o simplemente texto, pudiendo generar una estructura anidada:
<madre atributo="valor">
<hija></hija>
</madre>
Ejemplo XML
<Contrato>
<IssueDate>2021-04-08+02:00</IssueDate>
<ContractingParty type="Administración Local">Ayuntamiento de Sanchidrián</ContractingParty>
<Project>
<Description>La actuación consistirá en la construcción de un edificio...</Description>
<EstimatedContractAmount currency="EUR">356820.52</EstimatedContractAmount>
</Project>
</Contrato>
HTML
Como hemos dicho antes, XML es un metalenguaje que nos permite definir lenguajes. HTML es un lenguaje definido mediante XML.
Al contrario que con XML que puedes usar cualquier texto para las etiquetas y los atributos, HTML tiene una especificación de que etiquetas y atributos puedes usar.
Estas etiquetas definen la estructura y el contenido de una pagina web: los enlaces, los textos, las tablas...
Ejemplos de HTML
Enlace:
<a href="https://politicalwatch.es">Political Watch</a>
Imagen:
<img src="http://www.upv.es/imagenes/marcaUPVN1.png"></img>
Lista:
<ul>
<li>Elemento 1</li>
<li>Elemento 2</li>
</ul>
XPATH
XPath es un formato que nos permite identificar cualquier etiqueta del HTML o XML. Por ejemplo, dada la siguiente estructura:
Seleccionar todos los enlaces:
<html>
<a class="menu" href=""></a>
<div>
<a class="link" href=""></a>
</div>
</html>
//a
Seleccionar el div:
/html/div
Seleccionar segundo enlace:
//a[2]
Usando atributos:
//a[@class="link"]
XPATH
<html>
<a class="menu" href=""></a>
<div>
<a class="link" href=""></a>
</div>
</html>
/html//a[@class="link"]
Consola del navegador
En la ventana del navegador, usamos F12 o botón derecho e inspeccionar
Scraping con Google Sheets
Importar tablas
Nos permite importar los datos de las tablas de una web
- url: La dirección de la pagina web
- "table": Para indicar que es una tabla (<table>)
- index: Para indicar que tabla de la pagina es
=IMPORTHTML(url, "table", index)
Importar listas
Nos permite importar los datos de las listas de una web
- url: La dirección de la pagina web
- "list": Para indicar que es una tabla
- index: Para indicar que tabla de la pagina es
=IMPORTHTML(url, "list", index)
Importar XML
Nos permite importar los datos de cualquier documento que use el formato XML
- url: Dirección web de los datos estructurados (XML o xHTML)
- query: Criterio de búsqueda en el XML usando XPATH
IMPORTXML(url, query)
Importar feed RSS
Nos permite importar los datos de un feed RSS
- url: Dirección web del feed
- query: Elemento que se desea importar del feed
- headers: Se desea incluir cabeceras o no (TRUE o FALSE)
- num_items: Número de elementos a importar
IMPORTFEED(url, query, headers, num_items)
Importar CSV
Nos permite importar los datos de cualquier documento CSV
- url: Dirección web en donde se encuentra el fichero CSV que se desea importar
IMPORTDATA(url)
Limitaciones
Páginas cuyo contenido cambia dinámicamente
Páginas cuya URL no dirija a un único contenido
Cuando el contenido esta en una imagen o documento no HTML
Cuando necesitamos iniciar sesión.
Cuando el HTML no es "estable" y cambia con frecuencia (Google)
Probémoslo
https://bit.ly/3y4ULV5
Explotando los datos
con N8N
¿Qué es N8N?
Es una herramienta abierta y gratuita de automatización de flujos.
¿Y eso qué significa?
Te permite conectar servicios web con otros servicios. Por ejemplo: un formulario de TypeForm con una hoja de calculo de Google o un Feed RSS con el envío de un correo.
Hagamos una prueba
Vamos a hacer un bot de telegram que publique los contratos públicos.
Conectaremos una pieza de leer un feed RSS.
A continuación, usaremos otro bloque para seleccionar el ultimo contrato.
Y conectaremos ese bloque con otro de Telegram para mandarlo a un chat de difusión.
Pero antes, creamos el bot:
Antes de poder empezar, necesitamos crear un bot de telegram. Para ello, tenemos que hablar con el @BotFather:
Lo primero que necesitamos es el token:
Lo siguiente es crear el canal
Invitamos al bot al canal como administrador y accedemos a la siguiente URL:
https://api.telegram.org/bot<Token>/getUpdates
Vamos a N8N:
Vamos a la instalación de N8N:
https://n8n.politicalwatch.es
Usuario: upv
Password: agentesod4d
Trigger nodes
Cada pieza de nuestro puzle es un nodo y el puzle completo es un workflow.
Desde la cruz superior derecha, añadimos nuevos nodos.
Los nodos de tipo Trigger son los que inician nuestro worflow.
El trigger "start" ejecuta el workflow cuando se lo pedimos nosotros.
El trigger "cron" nos permite iniciar el workflow periódicamente
Regular nodes
Los nodos normales son los que realizan las diferentes operaciones.
Desde la cruz superior derecha, añadimos nuevos nodos.
Para nuestro bot, usaremos tres regular nodes:
- RSS Feed Read: descarga los datos de un feed RSS.
- SplitInBatches: coge la primera entrada del feed.
- Telegram: Formatea los datos y los envía por Telegram.
RSS
Cogemos el último contrato
Lo enviamos a Telegram
Lo programamos para hacerlo a diario
Listo!
¿Hacemos un bot?
Algunos feeds:
- Noticias El País: https://feeds.elpais.com/mrss-s/pages/ep/site/elpais.com/portada
- Indice de feeds de El Mundo: http://rss.elmundo.es/rss/
- Contratos Públicos: https://contrataciondelestado.es/sindicacion/sindicacion_643/licitacionesPerfilesContratanteCompleto3.atom
- Catálogo de datos abiertos: https://datos.gob.es/feeds/dataset.atom
- Catálogo de datos abiertos VLC: https://www.valencia.es/dadesobertes/va/rss2feed/
- RSS Aemet: http://www.aemet.es/es/rss_info
- Catalogo Open Data EU: https://data.europa.eu/api/hub/search/en/feeds/datasets.rss
Siguientes pasos
Programación
Posibilidades infinitas
¿Preguntas?
Bibliografía
- XML: https://es.wikipedia.org/wiki/Extensible_Markup_Language
- HTML: https://es.wikipedia.org/wiki/HTML
- XPath: https://es.wikipedia.org/wiki/XPath
- IMPORTHTML: https://support.google.com/docs/answer/3093339
- IMPORTXML: https://support.google.com/docs/answer/3093342
- IMPORTFEED: https://support.google.com/docs/answer/3093337
- IMPORTDATA: https://support.google.com/docs/answer/3093335
- Google Sheets function list: https://support.google.com/docs/table/25273?hl=en
- N8N: https://n8n.io/
- Documentación nodos N8N: https://n8n.io/integrations
- Nodo RSS: https://n8n.io/integrations/n8n-nodes-base.rssFeedRead
- Nodo SplitInBatches: https://n8n.io/integrations/n8n-nodes-base.splitInBatches
- Nodo Telegram: https://n8n.io/integrations/n8n-nodes-base.telegram
- Parlamento 2030: https://www.parlamento2030.es/
Técnicas y herramientas de Web Scrapping
By david_hernandez
Técnicas y herramientas de Web Scrapping
- 1,039