Proyecto de práctica: Web Scraping
5 técnicas de scraping + manejo de CAPTCHAs + truco de tokens, sobre sitios
de práctica legales (toscrape.com).
Instalar desde PyPI
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install "bytecraw[all]" # incluye navegador + Markdown
python3 -m playwright install chromium # solo si usas .browser()
bytecraw→ solo HTML estático y APIs (ligero).bytecraw[llm]→ agrega.markdown()(markdownify + trafilatura).bytecraw[all]→ todo, incluido Playwright para.browser().
La librería bytecraw/
Las 5 técnicas envueltas en una sola API limpia (estilo SDK).
from bytecraw import Scraper
bot = Scraper(delay=0.5)
# Estrategias explícitas
page = bot.static("https://books.toscrape.com") # 1 · HTML estático
page = bot.browser("https://quotes.toscrape.com/js") # 2 · JS dinámico
data = bot.api("https://quotes.toscrape.com/api/quotes") # 3 · API JSON
page = bot.fetch(url, strategy="auto") # auto: estático -> navegador
# Extraer registros con selectores (soporta ::text y ::attr(nombre))
libros = page.extract("article.product_pod", {
"titulo": "h3 a::attr(title)",
"precio": "p.price_color::text",
})
# Crawling con paginación
items = bot.crawl(url, item="div.quote",
fields={"frase": "span.text::text", "tags[]": "a.tag::text"},
next="li.next a::attr(href)")
# 5 · Sesión con login + CSRF
s = bot.session().login(url, data=creds, csrf_field="csrf_token")
home = s.fetch("https://quotes.toscrape.com")
# LLM: HTML -> Markdown limpio (menos tokens)
md = page.markdown()
print(page.tokens(), "->", page.tokens(of=md))
Landing page + dashboard
http://127.0.0.1:5000/landing— landing estilo Vercel/chat-sdk.devhttp://127.0.0.1:5000/— dashboard interactivo (ejecuta cada técnica + tiempos)
La estrategia mental
Ante un sitio nuevo, prueba en este orden (de más limpio a más costoso):
- ¿Hay una API por detrás? (técnica 3) → datos JSON limpios, lo mejor.
- ¿El HTML es estático? (técnica 1) → rápido y sencillo.
- ¿Solo se ve con JavaScript? (técnica 2) → saca el navegador.
- ¿Son miles de páginas? (técnica 4) → Scrapy.
- ¿Está detrás de login? (técnica 5) → sesión autenticada.
Archivos
| Archivo | Técnica | Sitio | Genera |
|---|---|---|---|
01_estatico_bs4.py |
1. HTML estático (requests + BeautifulSoup) | books.toscrape.com | libros.csv |
02_dinamico_playwright.py |
2. JS dinámico (Playwright) | quotes.toscrape.com/js | frases.json |
03_api_red.py |
3. API interceptada | quotes.toscrape.com/api | frases_api.json |
04_scrapy_spider.py |
4. Scrapy a escala | quotes.toscrape.com | frases_scrapy.json |
05_api_con_login.py |
5. API con login/sesión | quotes.toscrape.com/login | (consola) |
extra_captcha.py |
Manejo de CAPTCHAs | (notas + ejemplos) | — |
extra_html_a_markdown.py |
HTML→Markdown (ahorro de tokens) | quotes.toscrape.com | pagina.md |
Instalación
cd /Users/array101/scrapping
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
playwright install chromium # solo para la técnica 2
Cómo aprender con esto
- Corre
03_api_red.pyy luego02_dinamico_playwright.py: misma data, compara la velocidad. Entenderás por qué buscar la API primero. - Corre
01_estatico_bs4.pypara el caso clásico estático. - Corre
04_scrapy_spider.pypara ver el crawling a escala. - Corre
05_api_con_login.pypara el patrón de sesión + token CSRF (es el patrón que aplicarías a tu dashboard de Kapso). - Lee
extra_captcha.pyy correextra_html_a_markdown.py.
Nota ética
Practica en sitios hechos para ello (toscrape.com) o en tus propios sistemas.
Respeta robots.txt y los Términos de Servicio. No abuses del rate limit.
Metadata
Release files for bytecraw 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| bytecraw-0.1.1.tar.gz | 8.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| bytecraw-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 16.6 kB
Release files / bytecraw-0.1.1.tar.gz
| Download URL | bytecraw-0.1.1.tar.gz |
|---|---|
| Size | 8.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7495f80e9e0b9421f35265f2cdbedb4054320859ba4da8a1f37777600469d5f0
|
|
BLAKE2b-256 checksum How to use checksums |
e8f1f45b2d125eaeba201330f8edb311838787ba46e90e69db4c0c898c24a449
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.4
|
Release files / bytecraw-0.1.1-py3-none-any.whl
| Download URL | bytecraw-0.1.1-py3-none-any.whl |
|---|---|
| Size | 8.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a759875b846ac129008028fe7666c88cd72dbb6d61d520277ac9b92c83c47555
|
|
BLAKE2b-256 checksum How to use checksums |
59af3157b391b275bc98c808ad622c72b9e3c594880c7df34cd7b3df10faaced
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.4
|