"""
03-scraper-real.py — Scraping de un sitio web real (books.toscrape.com).

Qué es:      Scraper contra un sitio real de práctica: descarga la página,
             extrae título, precio y stock de cada producto y exporta CSV.
Cuándo usarlo: Como plantilla para scrapear catálogos reales — cambia la
             URL y los selectores (find/find_all) por los de tu sitio.
Requisitos:  Python 3.10+, conexión a internet,
             pip install -r requirements.txt
Cómo usarlo: python 03-scraper-real.py
             Genera: libros_scrapeados.csv
Nota ética:  Scrapea solo sitios que lo permitan (revisa robots.txt y los
             términos de uso) y no satures el servidor con peticiones.
"""

import httpx
from bs4 import BeautifulSoup
import pandas as pd

url = "https://books.toscrape.com/"

try:
    respuesta = httpx.get(url, timeout=30.0)
    respuesta.raise_for_status()
except httpx.RequestError as e:
    print(f"Error de conexión: {e}")
    exit(1)
except httpx.HTTPStatusError as e:
    print(f"Error HTTP: {e.response.status_code}")
    exit(1)

soup = BeautifulSoup(respuesta.text, "lxml")

libros = soup.find_all("article", class_="product_pod")

datos = []
for libro in libros:
    titulo = libro.h3.a["title"]
    precio_texto = libro.find("p", class_="price_color").text
    precio = float(precio_texto.replace("£", "").replace("Â", ""))
    disponibilidad = libro.find("p", class_="instock availability")
    stock = "En stock" if disponibilidad else "Agotado"

    datos.append({
        "titulo": titulo,
        "precio": precio,
        "stock": stock,
    })

df = pd.DataFrame(datos)

print("=== LIBROS DISPONIBLES ===")
print(df.to_string(index=False))

print(f"\n=== RESUMEN ===")
print(f"Total de libros: {len(df)}")
print(f"Precio promedio: £{df['precio'].mean():.2f}")
print(f"Más caro: £{df['precio'].max():.2f}")
print(f"Más barato: £{df['precio'].min():.2f}")

df.to_csv("libros_scrapeados.csv", index=False)
print("\n✅ Datos guardados en: libros_scrapeados.csv")
