Skip to main content

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.dev
  • http://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):

  1. ¿Hay una API por detrás? (técnica 3) → datos JSON limpios, lo mejor.
  2. ¿El HTML es estático? (técnica 1) → rápido y sencillo.
  3. ¿Solo se ve con JavaScript? (técnica 2) → saca el navegador.
  4. ¿Son miles de páginas? (técnica 4) → Scrapy.
  5. ¿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

  1. Corre 03_api_red.py y luego 02_dinamico_playwright.py: misma data, compara la velocidad. Entenderás por qué buscar la API primero.
  2. Corre 01_estatico_bs4.py para el caso clásico estático.
  3. Corre 04_scrapy_spider.py para ver el crawling a escala.
  4. Corre 05_api_con_login.py para el patrón de sesión + token CSRF (es el patrón que aplicarías a tu dashboard de Kapso).
  5. Lee extra_captcha.py y corre extra_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)

Source distribution for bytecraw 0.1.1
File Size Uploaded
bytecraw-0.1.1.tar.gz 8.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for bytecraw 0.1.1
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page