Tutoriales8 min read

Tu primer scraper en Python en 60 segundos

Tu primer scraper en Python en 60 segundos

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:

  1. Abrí la página en Chrome o Firefox.
  2. Click derecho sobre el dato que querés (un precio, por ejemplo) y elegí Inspeccionar.
  3. Se abre el inspector con la etiqueta resaltada. Mirá su nombre (
    span
    ,
    p
    ,
    div
    ) y su clase (
    class="precio-final"
    ).
  4. Subí un nivel o dos hasta encontrar la etiqueta que envuelve a todo el ítem (el producto completo). Esa va en el
    select
    .
  5. Reemplazá en el script:
    article.product_pod
    por el contenedor del ítem y
    p.price_color
    por la etiqueta del precio.

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:

  1. Mirá
    robots.txt
    .
    Escribí
    tusitio.com/robots.txt
    en el navegador. Ahí el sitio dice qué partes prefiere que no recorran los bots. Respetalo.
  2. 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.
  3. No seas una molestia. Un
    time.sleep(1)
    entre peticiones es la diferencia entre un visitante y un ataque. Si vas a pedir cientos de páginas, pedilas despacio.

Errores comunes (y cómo se arreglan)

  • ModuleNotFoundError: No module named 'bs4'
    .
    No se instaló la librería, o se instaló en otro Python. Corré
    pip install beautifulsoup4
    de nuevo desde la misma terminal donde ejecutás el script.
  • 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
    User-Agent
    real y bajá el ritmo. Si sigue, el sitio no quiere scrapers y conviene buscar si tiene una API pública.
  • Las tildes salen como símbolos raros. Falta
    respuesta.encoding = "utf-8"
    después del
    get
    , falta el
    encoding="utf-8"
    al abrir el archivo, o Excel lo abre mal. En Excel usá "Datos > Obtener datos > Desde texto/CSV" y elegí 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.

Angelica Yasmin Meca Molina

Written by

Angelica Yasmin Meca Molina

Apasionada por la intersección entre la tecnología, el diseño y la innovación digital, soy diseñadora gráfica y desarrolladora Front-End. Mi trabajo se enfoca en transformar ideas complejas en soluciones visuales y funcionales, combinando estética con lógica para crear experiencias digitales significativas. Comprometida con el aprendizaje constante, busco compartir conocimiento de forma clara y práctica, aportando valor tanto a profesionales como a quienes están dando sus primeros pasos en el mundo digital.

Stay in the loop

Web scraping tips, industry news and use cases — weekly, no spam.

Share this article

Did you find it useful?

Related Articles

More from the same category