1. Trabajando con una API de clima
Ahora que conocemos los conceptos básicos, veamos un escenario realista. Imagina que necesitamos recopilar datos sobre el clima cada 30 minutos. Para esto, usaremos una API de clima. Por supuesto, para fines educativos, el uso de una API real puede estar limitado, por lo que imaginaremos cómo sería.
Obteniendo el clima actual con OpenWeather API
Este ejemplo muestra cómo usar requests
para obtener datos del clima en una ciudad específica utilizando la API de OpenWeather.
import schedule
import time
import requests
def fetch_weather(city):
api_key = "YOUR_API_KEY" # Reemplaza con tu API key de OpenWeather
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"
try:
response = requests.get(url)
response.raise_for_status()
data = response.json()
temperature = data["main"]["temp"]
weather_description = data["weather"][0]["description"]
print(f"Temperatura actual en {city}: {temperature}°C")
print(f"Descripción del clima: {weather_description}")
except requests.exceptions.RequestException as e:
print(f"Error al obtener datos del clima: {e}")
def fetch_weather_of_london():
fetch_weather("London")
# Configuración para ejecutar la tarea cada 30 minutos
schedule.every(30).minutes.do(fetch_weather_of_london)
while True:
schedule.run_pending()
time.sleep(1)
Aquí enviamos una solicitud GET a la API de OpenWeather para obtener el clima actual de una ciudad en particular. Del JSON de respuesta, extraemos la temperatura y la descripción del clima, que mostramos en pantalla. No olvides reemplazar YOUR_API_KEY
con tu clave API.
Obteniendo el tipo de cambio actual con API
En este ejemplo, utilizaremos requests
para obtener el tipo de cambio actual a través de una API.
import schedule
import time
import requests
def fetch_exchange_rate():
url = "https://api.exchangerate-api.com/v4/latest/USD"
try:
response = requests.get(url)
response.raise_for_status() # Verifica si la solicitud fue exitosa
data = response.json()
usd_to_eur = data["rates"]["EUR"]
print(f"Tipo de cambio actual USD a EUR: {usd_to_eur}")
except requests.exceptions.RequestException as e:
print(f"Se produjo un error al obtener los datos: {e}")
# Configuración para ejecutar la tarea cada 10 minutos
schedule.every(10).minutes.do(fetch_exchange_rate)
while True:
schedule.run_pending()
time.sleep(1)
Aquí enviamos una solicitud GET a la API de tipo de cambio y obtenemos los datos en formato JSON. El tipo de cambio USD a EUR se extrae del JSON de respuesta y se muestra en pantalla. Este script se puede adaptar para recopilar datos sobre otros pares de monedas cambiando la clave en data["rates"]
.
Con este script, podemos recopilar continuamente datos sobre el clima y las monedas. No está mal para empezar, ¿verdad?
Escenarios reales de uso
La automatización de la recopilación de datos puede ser útil en diferentes escenarios:
- Monitorización del estado de servidores: Las verificaciones automáticas del estado del servidor pueden identificar y prevenir problemas antes de que ocurran.
- Recopilación de datos de redes sociales: Análisis constante de tendencias y menciones de marcas.
- Seguimiento de tipos de cambio: Cambios en los tipos de cambio pueden ser útiles para negocios o necesidades personales.
2. Ejemplo de recopilación automatizada de datos web
¿Qué pasa si queremos recopilar datos de una página web? Por ejemplo, verificar regularmente la disponibilidad de noticias. Para esto, utilizaremos BeautifulSoup
y requests
.
Recopilación de datos de una página web
Supongamos que tenemos un sitio del cual queremos recopilar titulares de noticias. Así es como podemos hacerlo:
import requests
from bs4 import BeautifulSoup
def fetch_news():
response = requests.get("http://example.com/news")
soup = BeautifulSoup(response.content, 'html.parser')
for headline in soup.find_all('h2', class_='news'):
print(headline.text)
schedule.every().hour.do(fetch_news)
while True:
schedule.run_pending()
time.sleep(1)
En este ejemplo podemos ver que cada 60 minutos nuestro script verificará la página web y mostrará los titulares de noticias. Esto simplifica el proceso de obtener información actualizada.
Recopilación de titulares de noticias desde un sitio web
En este ejemplo, usaremos requests
para cargar la página HTML y BeautifulSoup
para analizar los titulares de noticias.
import requests
from bs4 import BeautifulSoup
def fetch_news_headlines():
url = "https://www.bbc.com/news"
try:
response = requests.get(url)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
headlines = soup.find_all('h3') # Buscando todas las etiquetas <h3> (donde usualmente están los titulares)
print("Últimos titulares de noticias en BBC:")
for headline in headlines[:5]: # Tomamos los primeros 5 titulares
print("-", headline.get_text(strip=True))
except requests.exceptions.RequestException as e:
print(f"Error al obtener datos: {e}")
fetch_news_headlines()
Aquí cargamos la página de BBC News y usamos BeautifulSoup
para buscar todas las etiquetas <h3>
, donde están los titulares de noticias. Mostramos los primeros 5 titulares, eliminando espacios y caracteres adicionales con strip=True
.
Recopilación de datos sobre precios de productos desde una tienda online
Este ejemplo muestra cómo extraer datos sobre precios de productos desde una página de tienda online (por ejemplo, Amazon u otra tienda). Usamos requests
para solicitar la página y BeautifulSoup
para analizar los precios.
import requests
from bs4 import BeautifulSoup
def fetch_product_price(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/89.0.4389.82 Safari/537.36"
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
product_name = soup.find('span', {'id': 'productTitle'}).get_text(strip=True)
price = soup.find('span', {'class': 'a-price-whole'}).get_text(strip=True)
print(f"Producto: {product_name}")
print(f"Precio: {price} rub.")
except requests.exceptions.RequestException as e:
print(f"Error al obtener los datos: {e}")
except AttributeError:
print("No se pudo encontrar información sobre el producto o el precio")
# Ejemplo de URL de producto
fetch_product_price("https://www.amazon.com/dp/B08N5WRWNW")
En este ejemplo, enviamos una solicitud GET con un encabezado User-Agent
para evitar bloqueos. Luego, usando BeautifulSoup
, buscamos el nombre del producto por su id="productTitle"
y el precio del producto por la clase a-price-whole
. Usamos strip=True
para eliminar espacios adicionales.
GO TO FULL VERSION