Scrapy — Framework de Scraping Web
Resumen
Framework de scraping web más popular de Python — extensible, asíncrono, con middleware y pipelines. 62k⭐.
Repo de referencia
- GitHub:
github.com/scrapy/scrapy - Lenguaje: Python
- Licencia: BSD
Instalación
pip install scrapy
pip install scrapy-splash # para JavaScript rendering
pip install scrapy-redis # para distributed scraping
Uso Básico
# spider.py
import scrapy
class ExampleSpider(scrapy.Spider):
name = "example"
start_urls = ["https://example.com"]
def parse(self, response):
for href in response.css("a::attr(href)").getall():
yield response.follow(href, self.parse)
yield {
'title': response.css('h1::text').get(),
'text': response.css('p::text').getall(),
}
Ejecutar
# Salida JSON
scrapy crawl example -o results.json
# Salida CSV
scrapy crawl example -o results.csv
# Con logging detallado
scrapy crawl example -s LOG_LEVEL=DEBUG
Patrones Clave
- Middlewares: Rotación de user-agents, proxies, headers
- Pipelines: Guardar en SQLite, MongoDB, PostgreSQL
- Item Loaders: Transformación y validación de datos
- Distributed: Scrapy-Redis para scraping distribuido
- Headless browser: Splash o Playwright para JS rendering
Integración con Mastermind
- Reemplaza
BeautifulSoup+requestspara scraping a escala - Ideal para government data pipelines (BOE, BORME, etc.)
- Complementa
firecrawl-web-scraping(scrapy programable, firecrawl API-based) - Útil para static-digest-pipeline
Pitfalls
- JavaScript: Scrapy no ejecuta JS. Usa Splash o Playwright para contenido dinámico.
- Rate limiting: Configurar
DOWNLOAD_DELAYpara no saturar servidores. - Robots.txt: Respetar robots.txt con
ROBOTSTXT_OBEY = True. - Memory: Para sitios grandes, usar
itemproccon pipelines asíncronos.