Una sola API para scrapear cualquier sitio: HTML estatico, JS dinamico, APIs, login con sesion, crawling y Markdown para LLMs.
Project description
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bytecraw-0.1.1.tar.gz.
File metadata
- Download URL: bytecraw-0.1.1.tar.gz
- Upload date:
- Size: 8.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7495f80e9e0b9421f35265f2cdbedb4054320859ba4da8a1f37777600469d5f0
|
|
| MD5 |
aa2bf23e96eae2cd0b5ff3e90181131e
|
|
| BLAKE2b-256 |
e8f1f45b2d125eaeba201330f8edb311838787ba46e90e69db4c0c898c24a449
|
File details
Details for the file bytecraw-0.1.1-py3-none-any.whl.
File metadata
- Download URL: bytecraw-0.1.1-py3-none-any.whl
- Upload date:
- Size: 8.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a759875b846ac129008028fe7666c88cd72dbb6d61d520277ac9b92c83c47555
|
|
| MD5 |
4e5f8cce30cfd659cb6bd07e534a6726
|
|
| BLAKE2b-256 |
59af3157b391b275bc98c808ad622c72b9e3c594880c7df34cd7b3df10faaced
|