"Verifique manualmente los precios de 3,000 productos todos los días." - Nadie está en condiciones de hacerlo, incluso después de escuchar esta frase. De hecho, muchas empresas de comercio electrónico en Corea automatizan esta tarea con solo una técnica de Python llamada web scraping, y el comienzo es sorprendentemente simple. En este artículo, se ha resumido desde los fundamentos del web scraping hasta los problemas reales que se encuentran en la práctica, junto con código que realmente funciona.
Índice
- ¿Qué es el web scraping?
- Fundamentos del web scraping con Python: requests + BeautifulSoup
- Web scraping de páginas dinámicas: Selenium y Playwright
- Problemas comunes al hacer web scraping
- Aspectos legales del web scraping - Lo que debes saber
- Realidad del web scraping a gran escala - El infierno del mantenimiento
- Hacerlo tú mismo vs. Servicios especializados - ¿Cuándo usar qué?
¿Qué es el web scraping?
Web scraping (Raspado web) es la técnica en la que un programa visita automáticamente páginas web para extraer datos deseados. También se conoce como web scraping (Extracción web), y en la práctica, ambos términos se utilizan casi de manera intercambiable.
[Diagrama básico del flujo del web scraping: Solicitud HTTP → Recepción de HTML → Análisis → Extracción de datos → Almacenamiento](images/seo1-crawling-flow.png)
¿Para qué se puede utilizar? Tiene un alcance más amplio de lo que se piensa.
- Monitoreo de precios - Recopilar automáticamente los precios de 3,000 productos de tiendas de la competencia todos los días para rastrear los precios más bajos.
- Investigación de mercado - Recopilar información de productos, reseñas y calificaciones de sitios como Naver Shopping y Coupang de una sola vez.
- Generación de leads - Recopilar en masa contactos de clientes potenciales e información empresarial para utilizar en ventas.
- Monitoreo de contenido - Seguimiento en tiempo real de palabras clave específicas en noticias, redes sociales y comunidades.
- Análisis de datos - Construcción de conjuntos de datos a gran escala como precios de bienes raíces, ofertas de trabajo, datos académicos, etc.
La razón por la que Python se utiliza ampliamente para el web scraping es clara. Las bibliotecas como BeautifulSoup, Selenium, Playwright son abundantes y la sintaxis es intuitiva, lo que permite crear prototipos rápidamente.
Fundamentos del web scraping con Python: requests + BeautifulSoup
Es la combinación más básica. Se utiliza requests para obtener el HTML y BeautifulSoup para analizar los datos deseados. Si se trata de una página HTML estática, esto es suficiente.
Instalación
pip install requests beautifulsoup4
Ejemplo básico: Recopilación de títulos de noticias
import requests
from bs4 import BeautifulSoup
# 1. 웹 페이지 HTML 가져오기
# requests.get()으로 HTTP GET 요청을 보냅니다
url = "https://news.ycombinator.com/"
# 2. User-Agent 헤더 설정
# 헤더 없이 요청하면 봇으로 판단해 차단하는 사이트가 많습니다
# 실제 브라우저처럼 보이도록 User-Agent를 설정합니다
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
response = requests.get(url, headers=headers)
# response.raise_for_status() # HTTP 에러 시 예외 발생 (선택)
# 3. BeautifulSoup으로 HTML 파싱
# html.parser는 파이썬 내장 파서 — 별도 설치 불필요
soup = BeautifulSoup(response.text, "html.parser")
# 4. CSS 선택자로 원하는 요소 추출
# .titleline > a → class="titleline" 하위의 <a> 태그 (뉴스 제목 + 링크)
titles = soup.select(".titleline > a")
for i, title in enumerate(titles, 1):
print(f"{i}. {title.text}")
print(f" 링크: {title['href']}")
Con estas 20 líneas de código, se pueden recopilar todos los títulos y enlaces de Hacker News. La razón por la que se dice que la barrera de entrada al web scraping con Python es baja es precisamente esta.
Web scraping de múltiples páginas (paginación)
En la práctica, rara vez se recopila solo una página. Si se conoce el patrón para recorrer varias páginas, se puede aplicar a la mayoría de los sitios de listas.
import requests
from bs4 import BeautifulSoup
import time
# 페이지 번호를 URL에 넣는 패턴 — 대부분의 리스트 페이지가 이 구조
base_url = "https://example-blog.com/posts?page={}"
all_posts = []
for page in range(1, 11): # 1~10페이지 순회
response = requests.get(base_url.format(page), headers=headers)
soup = BeautifulSoup(response.text, "html.parser")
# 각 게시글 카드에서 제목, 날짜, URL 추출
posts = soup.select(".post-item")
for post in posts:
all_posts.append({
"title": post.select_one(".post-title").text.strip(),
"date": post.select_one(".post-date").text.strip(),
"url": post.select_one("a")["href"]
})
# 서버 부하 방지를 위한 요청 간격 설정
# 1초도 짧을 수 있음 — 대상 사이트 robots.txt의 Crawl-delay 확인 권장
time.sleep(1)
print(f"총 {len(all_posts)}개 포스트 수집 완료")
Consejo: Es una práctica común en el web scraping dejar un intervalo entre las solicitudes con
time.sleep(). Las solicitudes demasiado rápidas sobrecargan el servidor y pueden resultar en bloqueos de IP. Por lo general, un intervalo de 1 a 3 segundos es seguro.
Web scraping de páginas dinámicas: Selenium y Playwright
Hoy en día, la mayoría de los sitios web representan su contenido con JavaScript. En las aplicaciones de una sola página SPA (Single Page Application) basadas en React, Vue, Next.js, incluso si se obtiene el HTML con requests, solo se mostrará un <div id="root"></div> vacío, ya que los datos se cargan después de ejecutar JavaScript.
En estos casos, se necesita una herramienta de automatización del navegador. Consiste en abrir un navegador real, ejecutar JavaScript y luego extraer datos del resultado renderizado.
[Comparación entre web scraping estático y dinámico: requests solo recibe HTML del servidor, Selenium/Playwright accede al DOM después de renderizar JavaScript](images/seo1-static-vs-dynamic.png)
Ejemplo de web scraping con Selenium
Selenium es una herramienta original en la automatización del navegador y tiene la mayor cantidad de recursos relacionados con el web scraping.
pip install selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 1. 크롬 브라우저를 헤드리스(화면 없이) 모드로 실행
# 서버 환경에서는 화면이 없으므로 헤드리스 모드 필수
options = webdriver.ChromeOptions()
options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options)
try:
# 2. 대상 페이지 접속
driver.get("https://example-spa.com/products")
# 3. JavaScript 렌더링이 끝날 때까지 최대 10초 대기
# WebDriverWait는 요소가 나타나면 즉시 다음 단계로 진행
# 10초 안에 안 나타나면 TimeoutException 발생
WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".product-card"))
)
# 4. 렌더링된 DOM에서 데이터 추출
products = driver.find_elements(By.CSS_SELECTOR, ".product-card")
for product in products:
name = product.find_element(By.CSS_SELECTOR, ".product-name").text
price = product.find_element(By.CSS_SELECTOR, ".product-price").text
print(f"{name}: {price}")
finally:
# 5. 브라우저 종료 — 안 닫으면 메모리 누수 발생
driver.quit()
Ejemplo de web scraping con Playwright (recomendado para 2026)
Playwright es una biblioteca de automatización de navegador de próxima generación creada por Microsoft. Es más rápido y estable que Selenium, y tiene una función de espera automática (auto-wait) incorporada, por lo que no se necesita un código boilerplate como WebDriverWait. En 2026, se recomienda Playwright para nuevos proyectos.
pip install playwright
playwright install chromium # 브라우저 바이너리 자동 다운로드
from playwright.sync_api import sync_playwright
# Playwright는 컨텍스트 매니저로 리소스를 자동 관리
with sync_playwright() as p:
# 1. Chromium 브라우저를 헤드리스 모드로 실행
browser = p.chromium.launch(headless=True)
page = browser.new_page()
# 2. 대상 페이지 접속
page.goto("https://example-spa.com/products")
# 3. Playwright는 자동으로 요소가 나타날 때까지 대기
# 별도의 WebDriverWait 코드가 필요 없음 — 훨씬 깔끔합니다
cards = page.locator(".product-card").all()
for card in cards:
name = card.locator(".product-name").text_content()
price = card.locator(".product-price").text_content()
print(f"{name}: {price}")
# 4. 브라우저 종료
browser.close()
Selenium vs Playwright - ¿Cuál elegir?
[Comparación de Selenium vs Playwright](images/seo1-selenium-vs-playwright.png)
| Característica comparada | Selenium | Playwright |
|---|---|---|
| Velocidad | Normal | Generalmente se considera más rápido que Selenium |
| Espera automática | Requiere configuración manual | Incorporada |
| Soporte del navegador | Chrome, Firefox, Edge, Safari | Chromium, Firefox, WebKit |
| Intercepción de red | Limitado | Proporcionado por defecto |
| Recursos de aprendizaje | Muy abundante (historia de más de 10 años) | Creciendo rápidamente |
| Situación recomendada | Proyectos heredados, automatización simple | Nuevos proyectos, web scraping a gran escala |
Problemas comunes al hacer web scraping
Después de leer hasta aquí, es posible que pienses "¿El web scraping no es tan complicado?" Sin embargo, al hacer web scraping con Python en la práctica, te enfrentarás a problemas mucho más complicados que simplemente escribir código. Se han recopilado cinco problemas comunes que la mayoría de los desarrolladores experimentan al crear su primer web crawler.
1. Bloqueo de IP
La mayoría de los sitios web bloquean las solicitudes repetidas desde la misma IP. Las formas de abordar esto son rotación de proxies y ajuste del intervalo entre las solicitudes, pero el problema radica en el costo. Los proxies residenciales de calidad cuestan entre $5 y $15 por GB, con una tarifa mensual básica de al menos $50 a $500. Sumando el monitoreo de la calidad de los proxies y el cambio de IPs bloqueadas, el costo total no es insignificante.
2. CAPTCHA y detección de bots
Cloudflare, PerimeterX, Akamai Bot Manager, DataDome: las soluciones de prevención de bots se vuelven más sofisticadas cada año. reCAPTCHA v3 analiza movimientos del mouse, patrones de desplazamiento y velocidad de entrada de teclas. Si se utiliza un servicio de resolución de CAPTCHA (como 2Captcha), el costo por resolución es de 1 a 5 centavos por solicitud (dependiendo del tipo), pero si se realizan 100,000 solicitudes al día, el costo mensual supera los $6 millones. Además del costo, la gestión de la velocidad y la tasa de éxito tampoco son fáciles de manejar.
3. Renderizado dinámico y scroll infinito
Cada vez más sitios web requieren renderizado de JavaScript. Al tener que abrir instancias del navegador, se necesita 300 a 500 MB de memoria por página, y la velocidad es de 5 a 10 veces más lenta que el web scraping estático. Para ejecutar 50 navegadores simultáneamente, se necesita un servidor con al menos 16 GB de RAM, lo que resulta en un costo de infraestructura en la nube de alrededor de $150,000 a $300,000 al mes.
4. Cambios en la estructura del sitio
Si el sitio web objetivo cambia su diseño o estructura HTML, el web crawler se rompe de inmediato. Los sitios web activos cambian su estructura aproximadamente una vez cada 2 a 3 meses. Para mantenerse al día, se debe mantener un ciclo de detección de cambios, modificación de código, pruebas y despliegue constantes. Si se tienen 20 sitios web objetivo, esto significa que se necesitan de 80 a 120 tareas de mantenimiento al año.
5. Limpieza de datos
Es un error esperar que los datos recopilados estén limpios. Cada sitio web tiene diferentes codificaciones (UTF-8, EUC-KR), formatos de fecha (2026.01.30 vs 2026-01-30 vs 30 de enero de 2026) y formas completamente diferentes de representar la misma información. En la experiencia, el trabajo de limpieza de datos consume 30 a 50% del tiempo de recopilación.
Aspectos legales del web scraping - Lo que debes saber
Aunque el web scraping es técnicamente fácil, legalmente es un área gris bastante amplia. "Poder raspar" y "poder raspar legalmente" son dos problemas completamente diferentes. Si el web scraping es para fines comerciales, asegúrate de verificar los siguientes tres puntos.
robots.txt - La regla básica del web scraping
robots.txt es un archivo en el que el propietario del sitio web indica "no recopilar esta ruta, por favor". Aunque hay controversia sobre si tiene fuerza legal, es ampliamente aceptado en la industria. Ignorar esto en el web scraping puede tener consecuencias negativas en caso de una demanda.
# 예시: https://example.com/robots.txt
User-agent: *
Disallow: /private/
Disallow: /api/
Crawl-delay: 2 # 요청 간격 2초 이상 유지 요청
La forma de verificarlo es simple. Solo agrega /robots.txt al final de la URL de destino (por ejemplo, https://naver.com/robots.txt). Las rutas especificadas con Disallow deben excluirse de la recopilación, y si hay Crawl-delay, se debe respetar ese intervalo.
Ley de protección de datos personales - La zona de mayor precaución
La Ley de Protección de Datos Personales de Corea se basa en el principio del consentimiento del sujeto de la información al recopilar datos personales. Si los datos recopilados a través del web scraping incluyen información que pueda identificar a una persona, como nombres, números de teléfono, correos electrónicos, recopilar o utilizar esos datos puede ser ilegal.
Puntos a tener en cuenta en la práctica:
- Aunque la página web sea pública, no se puede recopilar ni utilizar información personal sin consentimiento.
- Especialmente, hay que tener cuidado con los contactos, perfiles de redes sociales, reseñas de usuarios (incluidos los apodos).
- Si el servicio está dirigido a la UE, se aplica el GDPR - en caso de incumplimiento, se puede imponer una multa de hasta el 4% de los ingresos mundiales.
- En Corea, las sanciones de la Comisión de Protección de Datos Personales se están fortaleciendo cada vez más.
Consejo práctico: Es más seguro recopilar solo información no personal, como precios, especificaciones de productos, datos de mercado. Si se necesita información que incluya datos personales, asegúrate de obtener una revisión legal primero.
Ley de derechos de autor - Los derechos sobre los datos en sí
Textos, imágenes y videos publicados en páginas web suelen estar protegidos por derechos de autor. Aunque recopilar datos con web scraping es una acción técnica, si se republican o utilizan comercialmente los datos recopilados, se puede considerar una infracción de derechos de autor.
Precedentes y criterios:
- La información fáctica (precios, datos numéricos) generalmente no está protegida por derechos de autor.
- Las creaciones (artículos, reseñas, imágenes) están protegidas por derechos de autor.
- Si se duplica toda una base de datos, se puede considerar una violación de la Ley de Competencia Desleal.
- En el caso de hiQ Labs v. LinkedIn en EE. UU. (2022), se dictaminó que el scraping de perfiles públicos no violaba la CFAA, pero luego LinkedIn presentó una demanda separada basada en violaciones de los términos de servicio y finalmente llegaron a un acuerdo. Aunque los datos sean públicos, puede haber limitaciones en los términos de servicio y las leyes contractuales, por lo que es imprescindible verificar la legislación de cada país y los Términos de Servicio del sitio objetivo.
[Lista de verificación legal del web scraping: Verificar robots.txt → Verificar si hay información personal → Posibilidad de infracción de derechos de autor → Revisar los Términos de Servicio](images/seo1-legal-checklist.png)
En resumen: Antes de comenzar con el web scraping, asegúrate de revisar estos cuatro puntos: ① Verificar robots.txt, ② Verificar si hay información personal, ③ Alcance de uso de los datos recopilados, ④ Términos de Servicio del sitio objetivo. Si no estás seguro, invertir en asesoramiento legal es la inversión más segura en relación calidad-precio.
Realidad del web scraping a gran escala - El infierno del mantenimiento
Para proyectos pequeños, un solo script de Python es suficiente. Pero si necesitas operar el web scraping de manera continua para tu negocio, la situación cambia por completo.
Para operar un sistema de web scraping a gran escala, necesitarás lo siguiente:
- Infraestructura - Servidores, programadores de tareas (Airflow, Celery, etc.), sistema de colas, base de datos
- Gestión de proxies - Compra, rotación y monitoreo de cientos a miles de proxies (costo mensual de $50 a $500)
- Manejo de errores - Lógica de reintentos, notificaciones de fallas, recuperación automática
- Tubería de datos - Automatización de la recopilación, limpieza, carga y verificación de datos
- Monitoreo - Estado del web crawler, calidad de los datos recopilados, detección de cambios en el sitio objetivo
- Cumplimiento legal - robots.txt, Ley de Protección de Datos Personales, Ley de Derechos de Autor, revisión continua
[Arquitectura del web scraping a gran escala: Programador → Grupo de web crawlers → Rotación de proxies → Tubería de datos → Almacenamiento](images/seo1-large-scale-architecture.png)
Incluso con herramientas más complejas como Scrapy, la complejidad operativa no disminuye.
Al considerar los costos realistas, desarrollar un web crawler lleva aproximadamente 2 semanas (costo de mano de obra de $3 a $4 millones) y luego se requieren 40 a 60 horas al mes para el mantenimiento. Si el número de sitios web objetivo aumenta a 10 o 20, la gestión de la infraestructura de web scraping se convierte en un trabajo de tiempo completo. Sumando los costos de proxies, servidores, resolución de CAPTCHA, a veces se pueden gastar más de $5 millones al mes solo en web scraping.
"Crear un web crawler es fácil. Mantenerlo vivo es el verdadero desafío."
- Cualquiera que haya operado un sistema de web scraping puede estar de acuerdo con esta afirmación
Hacerlo tú mismo vs. Servicios especializados - ¿Cuándo usar qué?
| Situación | Método recomendado |
|---|---|
| Aprendizaje, recopilación única | requests + BeautifulSoup |
| Sitios dinámicos, proyectos pequeños | Playwright o Selenium |
| Operación empresarial, múltiples sitios, estabilidad necesaria | Servicios especializados de web scraping |
Aprender web scraping con Python es una inversión valiosa como desarrollador. Para recopilaciones simples de datos o prototipos, las herramientas mencionadas en este artículo son suficientes.
Sin embargo, cuando el web scraping se convierte en el **núcleo de




