Scraping de datos de cualquier web

Como ya sabemos, existe la opción de obtener datos por medio de API, pero, ¿y si queremos obtener un dato concreto de una página que no tiene API, como por ejemplo resultados de fútbol, precio del carburante, o como en este caso, el precio de la luz?

Al principio puede parecer un poco complicado pero gracias a este tutorial de pcdemano, y que ahora os explicamos veréis que en cuanto lo hagáis una vez, luego vais mucho mas rápido.

Vamos con ello:

Pasos a seguir:

1- Vamos a la web que queremos “scrapear” en este caso https://tarifaluzhora.es/

2- Seleccionamos el texto (elemento) del cual queremos obtener la información, pulsamos el botón derecho y luego “inspeccionar”.

3- Se nos abrirá una ventana de código en el que habrá una linea marcada, veréis que en este caso vamos a seleccionar el precio actual de la luz.

4- Prestamos atención al elemento que esta delante de “class” en este caso “span”

5- Vamos a la página https://colab.research.google.com/notebooks/welcome.ipynb#recent=true 

6- Pulsamos “subir” y creamos un nuevo archivo, en el que pegaremos lo siguiente, teniendo en cuenta que cada paso debe ser un “codigo” diferente

Importamos los módulos.

import requests
from bs4 import BeautifulSoup

Añadimos la web a scrappear.

URL = 'https://tarifaluzhora.es/'

Obtenemos los datos.

raw_html = requests.get(URL).text
data = BeautifulSoup(raw_html, 'html.parser')

Aplicamos el filtro del elemento que queremos numerar (estara en rojo) y ampliamos de 50 a 100 las lineas a mostrar si hiciera falta (páginas con mucho codigo.

for i in range (50):
  print(i+1,":", data.select('span')[i])

Con este proceso, solo nos enumerara las lineas de elementos que coincidan con el filtro que hemos seleccionado, solo faltaria buscar el nuestro.

Debería de quedar así

7- Buscamos nuestro elemento a scrapear y nos quedamos con el número que tiene delante, en nuestro caso es el 49.

8- Repetimos la operación con todos los elementos que nos interese, os dejo mi configuración (yo los tengo dentro de carpetas, dependiendo de donde los tengáis, habrá que cambiarlos)

ACTUALIZACIÓN: 

Debido a cambios en la página, la numeración de los elementos ha cambiado, el .yaml siguiente es el que funciona actualmente, muchas gracias a todos los compañeros del grupo de Telegram por la colaboración.

Sensores:

- platform: scrape
resource: https://tarifaluzhora.es/
name: "Fecha"
select: "span:nth-of-type(20)"
- platform: scrape
resource: https://tarifaluzhora.es/
name: "Precio Medio (€/kWH)"
select: "span:nth-of-type(19)"
value_template: '{{ value.split()[0] }}'
- platform: scrape
resource: https://tarifaluzhora.es/
name: "Minimo Diario (€/KWH)"
select: "span:nth-of-type(22)"
value_template: '{{ value.split()[0] }}'
- platform: scrape
resource: https://tarifaluzhora.es/
name: "Maximo Diario (€/KWH)"
select: "span:nth-of-type(24)"
value_template: '{{ value.split()[0] }}'
- platform: scrape
resource: https://tarifaluzhora.es/
name: "Actual (€/KWH)"
select: "span:nth-of-type(18)"
value_template: '{{ value.split()[0] }}'
- platform: scrape
resource: https://tarifaluzhora.es/
name: "Hora Recogida de Datos"
select: "h5:nth-of-type(1)"
value_template: '{{ value.split()[3] }}'

En la parte de “select” introduciremos el comando a buscar “span” y el numero de linea “49”, esto se puede hacer con otro tipo de datos como ocurre en la “hora de recogida de datos” que es un “h5”

El comando “split” se usa para “cortar” el dato que nos ofrece la web si hiciera falta, contando cada elemento desde 0, por ejemplo en el resultado original que nos daba la página nos daba 0.134 kwh y a nosotros lo que nos interesa solo son los datos numéricos para poder luego usarlos en nuestras automatizaciones, con lo que solo “cortamos el primer dato que es 0.134.

Y por último el grupo:

Grupo:

# Vista
  Datos:
    name: Luz
    view: yes
    entities:
      - group.luz
# Grupos
  luz:
    name: Datos de luz
    entities:
      - sensor.fecha
      - sensor.precio_medio_kwh
      - sensor.minimo_diario_kwh
      - sensor.maximo_diario_kwh
      - sensor.hora_recogida_de_datos
      - sensor.actual_kwh

Y eso es todo, como siempre, si tenéis cualquier duda, dejad vuestros comentarios en la web o en el grupo de telegram de @Domology

Este tutorial no habría sido posible sin la información extraída del tutorial de PCdemano, y por supuesto sin la ayuda de los compañeros del grupo de Telegram, los cuales ya sea por añadir lineas de código como por enlazar webs para investigar sobre el scrape, tienen mucho que ver en que se haya realizado con éxito.

Juntos, llevamos a la realidad esas ideas que solo a los locos del “todo conectado” se nos vienen a la cabeza. GRACIAS

Un comentario sobre “Scraping de datos de cualquier web

  • el 20 noviembre, 2018 a las 13:24
    Permalink

    Gracias por lo que nos toca y “al César lo que es del César” (PcDeMaNo)

    Solo un comentario. Creo que la parte del YAML donde se definen los sensores es incorrecta por falta de los espacios pertinentes. Es una pena que el YAML sea tan crítico con las indexaciones… y en WordPress sea tan difícil / incómodo escribir un fichero con la sintáxis del lenguaje requerido.

Deja un comentario

Síguenos

Siguenos en facebook