el web scraping con Python no necesita un curso de 40 horas. Con dos librerías (
requests y BeautifulSoup) y diez líneas de código vas a bajar una página, sacarle los datos que te interesan y guardarlos en un CSV que se abre en Excel. Acá está el script completo, línea por línea, y cómo adaptarlo al sitio que vos quieras.
El problema: copiar y pegar es el enemigo
Tenés que armar una planilla con los precios de 40 productos. Abrís la página, copiás el nombre, pegás en Excel, copiás el precio, pegás. Cuarenta veces. Mañana cambian los precios y lo hacés de nuevo.
Eso es exactamente lo que hace un scraper, pero en segundos y sin equivocarse en la fila 27. Y para hacer uno no necesitás ser programador: necesitás Python instalado y diez minutos.
Qué vas a construir (y qué necesitás)
Vamos a scrapear books.toscrape.com, una librería ficticia creada para practicar scraping. Es legal, es estable y se parece a cualquier tienda online real. El objetivo: título y precio de los 20 libros de la portada, guardados en un archivo
libros.csv.
Lo que necesitás:
- Python 3 instalado (en python.org si no lo tenés).
- Una terminal (en Windows, PowerShell; en Mac o Linux, la Terminal).
- Un editor de texto cualquiera. VS Code sirve, el Bloc de notas también.
El scraper completo (los 60 segundos)
Primero instalá las dos librerías. En la terminal:
pip install requests beautifulsoup4
Después creá un archivo que se llame
scraper.py y pegá esto:
import csv import requests from bs4 import BeautifulSoup url = "https://books.toscrape.com/" respuesta = requests.get(url, timeout=10) respuesta.encoding = "utf-8" soup = BeautifulSoup(respuesta.text, "html.parser") with open("libros.csv", "w", newline="", encoding="utf-8") as archivo: escritor = csv.writer(archivo) escritor.writerow(["titulo", "precio"]) for libro in soup.select("article.product_pod"): titulo = libro.h3.a["title"] precio = libro.select_one("p.price_color").text escritor.writerow([titulo, precio]) print("Listo: libros.csv")
Corrélo:
python scraper.py
Abrí
libros.csv con Excel o Google Sheets. Veinte libros con su precio. Eso fue tu primer scraper.
Paso a paso: qué hace cada línea
Paso 1: instalar dos librerías
requests es la que pide la página, como lo haría tu navegador. BeautifulSoup es la que lee el HTML que vuelve y te deja buscar adentro. Son las dos librerías más usadas para empezar y las que vas a ver en el 90 % de los tutoriales.
Paso 2: pedir la página
respuesta = requests.get(url, timeout=10)
Esto hace lo mismo que escribir la URL en el navegador y apretar Enter. La diferencia es que en vez de mostrarte la página, te la devuelve como texto. El
timeout=10 es para que no se quede esperando para siempre si el sitio no responde.
Si querés ver qué recibiste, agregá
print(respuesta.status_code). Un 200 significa "todo bien". Un 403 o 429 significa que el sitio no quiere que entres así, y eso lo vemos más abajo.
La línea
respuesta.encoding = "utf-8" le dice a requests cómo leer el texto. Algunos sitios (este incluido) no lo declaran bien en sus cabeceras y, sin esa línea, el símbolo de la libra y las tildes salen como £ o é.
Paso 3: leer el HTML
soup = BeautifulSoup(respuesta.text, "html.parser") for libro in soup.select("article.product_pod"):
El HTML de una página es un árbol de etiquetas. BeautifulSoup te deja decirle "traeme todas las etiquetas que cumplan esta condición".
article.product_pod significa: todas las etiquetas <article> que tengan la clase product_pod. En este sitio, cada una es un libro.
Dentro de cada libro,
libro.h3.a["title"] entra al <h3>, después al <a> y saca el atributo title. Y select_one("p.price_color").text busca el párrafo con la clase price_color y se queda con el texto.
Esos nombres (
product_pod, price_color) no son magia: están en el HTML del sitio y los encontrás con el inspector del navegador. Es el paso que viene.
Paso 4: guardar en CSV
with open("libros.csv", "w", newline="", encoding="utf-8") as archivo: escritor = csv.writer(archivo) escritor.writerow(["titulo", "precio"])
csv viene incluido en Python. Abrimos el archivo, escribimos una fila de encabezados y después una fila por libro. El encoding="utf-8" es para que las tildes y la libra esterlina de los precios no salgan rotas.
Ahora hacelo con la página que vos querés
El script funciona para cualquier sitio donde los datos estén en el HTML. Lo único que cambia son la URL y los selectores. Para encontrarlos:
- Abrí la página en Chrome o Firefox.
- Click derecho sobre el dato que querés (un precio, por ejemplo) y elegí Inspeccionar.
- Se abre el inspector con la etiqueta resaltada. Mirá su nombre (
,span
,p
) y su clase (div
).class="precio-final" - Subí un nivel o dos hasta encontrar la etiqueta que envuelve a todo el ítem (el producto completo). Esa va en el
.select - Reemplazá en el script:
por el contenedor del ítem yarticle.product_pod
por la etiqueta del precio.p.price_color
Una prueba rápida antes de tocar el script: en el inspector, apretá Ctrl+F y escribí el selector. Si marca 20 resultados y son los 20 productos, está bien elegido.
Si no encontrás el dato en "Ver código fuente" (click derecho en la página), el sitio lo carga con JavaScript después de abrir la página. Este script no lo va a ver. Ahí necesitás otra herramienta, y cuál usar lo explicamos en la comparativa entre BeautifulSoup, Scrapy y Playwright.
Antes de scrapear cualquier sitio: 3 reglas
Scrapear es legal en la mayoría de los casos, pero no todo vale. En AUTOScraping trabajamos con estas tres reglas y te las recomendamos desde el primer script:
- Mirá
. Escribírobots.txt
en el navegador. Ahí el sitio dice qué partes prefiere que no recorran los bots. Respetalo.tusitio.com/robots.txt - No scrapees datos personales. Nombres, mails, teléfonos. Ahí entran GDPR, CCPA y las leyes locales de protección de datos. Precios, títulos y descripciones públicas son otra historia.
- No seas una molestia. Un
entre peticiones es la diferencia entre un visitante y un ataque. Si vas a pedir cientos de páginas, pedilas despacio.time.sleep(1)
Errores comunes (y cómo se arreglan)
. No se instaló la librería, o se instaló en otro Python. CorréModuleNotFoundError: No module named 'bs4'
de nuevo desde la misma terminal donde ejecutás el script.pip install beautifulsoup4- El CSV sale vacío. El selector no coincide con nada. Volvé al inspector y probalo con Ctrl+F. Un 90 % de las veces es una clase mal escrita.
- Status 403 o 429. El sitio bloqueó la petición porque no parece venir de un navegador. Agregá un header
real y bajá el ritmo. Si sigue, el sitio no quiere scrapers y conviene buscar si tiene una API pública.User-Agent - Las tildes salen como símbolos raros. Falta
después delrespuesta.encoding = "utf-8"
, falta elget
al abrir el archivo, o Excel lo abre mal. En Excel usá "Datos > Obtener datos > Desde texto/CSV" y elegí UTF-8.encoding="utf-8" - Funcionó hoy y mañana no. El sitio cambió el HTML. Es lo más normal del scraping, y por eso los scrapers se mantienen, no se escriben una vez.
Recurso: la plantilla de scraper lista para usar
Este script lo convertimos en una plantilla comentada con todo lo de arriba ya resuelto: headers de navegador, pausa entre peticiones, paginación (para que recorra todas las páginas y no solo la primera) y exportación a CSV y Excel. Viene con una guía en PDF de dos páginas para adaptarla a cualquier sitio.
Comentá SCRAPER en el reel de esta nota y te la mandamos por mensaje.
¿Y a escala?
Con este script podés monitorear 40 productos todas las mañanas. Con la plantilla, unos cientos. El problema aparece cuando son 50.000 productos en 12 tiendas, con sitios que cambian cada semana, bloqueos, captchas y alguien del equipo que tiene que revisar por qué el CSV de hoy vino con la mitad de las filas.
Ese es el trabajo que hacemos todos los días en AUTOScraping. Con DataFactory vos definís qué datos necesitás y a qué frecuencia, y los recibís limpios en tu base de datos, en Sheets o por API. Los scrapers, los proxies y el mantenimiento quedan de nuestro lado, dentro del marco legal. El dato más caro es el que llega tarde.
Preguntas frecuentes
**¿Necesito saber programar para hacer web scraping con Python?**Para este script, no. Copiás, cambiás la URL y los selectores, y corrés. Para adaptarlo a casos más complejos (login, paginación, JavaScript) conviene aprender lo básico de Python, y este script es un buen punto de partida.
**¿Es legal hacer web scraping?**Depende del sitio, de los datos y de para qué los usás. Extraer información pública como precios o títulos suele estar permitido. Scrapear datos personales o saltear términos de uso, no. Revisá
robots.txt y los términos del sitio antes de empezar.
¿Qué pasa si la página carga los datos con JavaScript?
requests recibe el HTML "vacío" y el script no encuentra nada. Ahí se usa Playwright, que abre un navegador real, o se busca la API interna que el sitio usa para cargar los datos.
**¿Puedo correr el scraper todos los días en automático?**Sí. En Windows con el Programador de tareas, en Mac o Linux con
cron, o en la nube con GitHub Actions. Es el paso natural después de este tutorial.
**¿Requests y BeautifulSoup sirven para sitios grandes?**Para cientos de páginas, sí. Para miles o para recorrer un sitio entero conviene pasar a Scrapy, que hace las peticiones en paralelo y maneja reintentos solo.


