# Web Scraping

> Extrae datos de sitios web de forma ética usando requests, BeautifulSoup, Selenium o Playwright, respetando robots.txt y aplicando rate limiting.

- Skill: `leandrobenjaminl/web-scraping` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add leandrobenjaminl/web-scraping`
- Raw SKILL.md: https://api.skillmd.com/api/skills/leandrobenjaminl/web-scraping/raw
- Safety review: PASS (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend, Browser Automation
- Tags: Beautifulsoup, Html Parsing, Playwright, Rate Limiting, Selenium, Web Scraping
- License: MIT
- Author: LeandroBenjaminL (https://skillmd.com/u/leandrobenjaminl)
- Updated: 2026-08-22
- Page: https://skillmd.com/skills/leandrobenjaminl/web-scraping

---


# Skill: web-scraping

Web scraping ético. Extraé datos sin romper el sitio ni violar términos.

## Trigger

- Los datos que necesitás están en una web sin API
- Hay que extraer información de múltiples páginas
- El sitio carga con JavaScript (requiere Selenium/Playwright)
- Necesitás monitorear cambios en una página

## Workflow LEND

```
1. ANALIZAR
   ├── ¿El sitio tiene API? si tiene, usala. Siempre preferí API sobre scraping.
   ├── robots.txt: ¿permite scraping? Respetalo.
   ├── Estático o dinámico: ¿el contenido carga con JS? (Selenium/Playwright vs BS4)
   ├── Volumen: ¿una página o 10k? define la estrategia
   └── Frecuencia: ¿one-shot o monitoreo continuo?

2. OFRECER (Menú del Senior)
   ├── A) BeautifulSoup — HTML estático, simple, rápido
   ├── B) Selenium — JS pesado, clics, navegación compleja
   └── C) Playwright — moderno, async, más rápido que Selenium

3. ELEGIR → confirmación

4. HACER
   ├── GET con headers: User-Agent real, no el de Python
   ├── Parsear: BeautifulSoup(response.text, 'html.parser')
   ├── Navegación: seguir links con href, paginación con next page
   ├── Rate limiting: time.sleep(1-3s) entre requests
   ├── Manejo de errores: capturar 403, 429, 503 con retry
   ├── Selenium: WebDriverWait para elementos dinámicos
   └── Datos extraídos: guardar en DataFrame o CSV

5. VERIFICAR
   ├── Los datos extraídos coinciden con lo que se ve en el navegador
   ├── No hay filas vacías o mal parseadas
   └── El scraper corrió dentro de los límites del robots.txt
```

## Patrones

- **robots.txt primero**: respetá las reglas del sitio. Si dice Disallow, no scrapees.
- **User-Agent real**: no uses el de Python/requests. Usá uno de Chrome real.
- **Rate limiting**: 1-3 segundos entre requests. No DDoSees el sitio.
- **BeautifulSoup para HTML estático**: es todo lo que necesitas el 80% del tiempo.
- **Playwright > Selenium**: más rápido, moderno, async. Mejor API.
- **Caché local**: guardá las páginas ya scrapeadas para no pedirlas de nuevo.

## Anti-patrones

- ❌ No respetar robots.txt — te pueden banear
- ❌ Sin rate limiting — 100 requests por segundo mata el servidor
- ❌ User-Agent de Python — los sitios bloquean bots genéricos
- ❌ Selenium cuando alcanza BS4 — es 10x más lento al pedo
- ❌ No manejar errores — un 503 mata todo el scraper sin aviso

