Introducción: El Problema que Quería Resolver
Hace unos meses me enfrenté a un problema: gestionar contenido para varios blogs era un proceso lento y repetitivo. Entre buscar fuentes, reescribir para evitar duplicados, optimizar para SEO y publicar… cada artículo me llevaba horas. Así que decidí construir una solución: Article Scraper, un sistema que automatiza todo el proceso usando web scraping e inteligencia artificial.
En este tutorial os cuento cómo lo hice, qué tecnologías usé y cómo funciona todo por dentro.
La Arquitectura: Django como Base
Decidí construir el sistema sobre Django por varias razones:
- Framework maduro y robusto
- Excelente manejo de modelos y bases de datos
- Sistema de usuarios y permisos ya integrado
- Fácil integración con APIs externas
La estructura del módulo quedó así:
📁 article_scraper/
├── models.py → Configuración de API keys y usuarios
├── services.py → Toda la lógica de scraping y procesamiento
├── views.py → Interfaz y flujo del usuario
└── wordpress_categories_tags.py → Gestión de taxonomías
Parte 1: El Scraper – Extrayendo Contenido Limpio
El Reto del Web Scraping
Lo primero que necesitaba era extraer contenido de URLs de forma limpia. No quería publicidad, menús, footers ni nada de eso. Solo el artículo.
Mi solución:
- Usé para parsear el HTML
- Implementé headers realistas para evitar bloqueos
- Configuré un sistema de reintentos con delays aleatorios
# Simular un navegador real
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...',
'Accept': 'text/html,application/xhtml+xml...',
'Accept-Language': 'es-ES,es;q=0.9,en;q=0.8',
}
El scraper elimina automáticamente:
- Menús de navegación
- Publicidad
- Sidebars
- Footers
- Scripts y estilos
Y extrae solo lo importante: título y contenido del artículo.
Parte 2: Inteligencia Artificial – La Reescritura con OpenAI
Por Qué GPT-4
Probé varias soluciones, pero OpenAI GPT-4 resultó ser la más efectiva para:
- Reescribir contenido manteniendo el sentido
- Generar metadatos SEO optimizados
- Crear títulos atractivos
- Sugerir categorías y tags inteligentemente
Cómo Implementé el Procesamiento
Dividí el proceso en dos fases:
Fase 1 – Generación de Contenido:
# Le pido a GPT que:
- Genere un título optimizado para SEO
- Reescriba completamente el artículo
- Cree un resumen/excerpt
- Genere meta título (máx. 60 caracteres)
- Genere meta descripción (máx. 155 caracteres)
Fase 2 – Taxonomías Inteligentes:
# Primero obtengo todas las categorías y tags del WordPress
# Luego le pido a GPT que:
- Seleccione 2-3 categorías existentes apropiadas
- Sugiera 2-3 categorías nuevas si es necesario
- Elija 4-5 tags existentes relevantes
- Proponga 3-5 tags nuevos complementarios
Esta separación en dos fases me permitió optimizar costos y tener mejor control sobre el proceso.
El Sistema de Prompts Personalizados
Añadí una funcionalidad muy interesante: prompts personalizados por usuario. Cada usuario puede configurar instrucciones específicas como:
- «Escribe en tono formal para sector financiero»
- «Usa siempre ejemplos prácticos y lenguaje cercano»
- «Incluye datos estadísticos cuando sea posible»
Esto se guarda en la base de datos y se añade al contexto de GPT automáticamente.
Parte 3: Integración con CMS – WordPress y Más
La API de WordPress
Para publicar en WordPress usé su REST API. Lo que implementé:
1. Autenticación con Application Password:
# Uso autenticación básica con credenciales seguras
auth = (username, application_password)
2. Paginación para taxonomías:
El problema es que WordPress limita los resultados. Mi solución fue implementar un sistema que recorre todas las páginas:
while True:
response = requests.get(url, params={'per_page': 100, 'page': page})
# Procesar y continuar hasta que no haya más resultados
3. Creación automática de categorías y tags:
Si una categoría o tag no existe, el sistema la crea automáticamente.
Compatibilidad con Otros CMS
No quería limitarme a WordPress, así que diseñé la arquitectura para soportar:
- PrestaShop (para blogs de e-commerce)
- Ghost (CMS moderno)
- Strapi (headless CMS)
- Cualquier CMS con API REST
Parte 4: Integración con Facebook
El Reto del Doble Token
Publicar en Facebook fue más complejo de lo que pensaba. Descubrí que necesitaba un sistema de doble token:
1. User Access Token:
- Lo renuevo automáticamente cada 27 días
- Lo guardo en la base de datos
2. Page Access Token:
- Lo genero dinámicamente cada vez
- NO lo guardo (se obtiene del user token)
- Es el que realmente uso para publicar
Esto garantiza que los permisos sean correctos y no expire nada inesperadamente.
Dos Modos de Entrada
Implementé dos formas de usar el sistema:
Modo 1: Desde URL
Usuario introduce URL
↓
Scraping automático
↓
GPT reescribe
↓
Selección de taxonomías
↓
Preview interactivo
↓
Publicación
Modo 2: Texto Manual
Usuario pega texto
↓
GPT genera título y reescribe
↓
Selección de taxonomías
↓
Preview interactivo
↓
Publicación
El preview interactivo fue clave: permite editar todo antes de publicar.
La Base de Datos: Modelos en Django
Creé varios modelos para gestionar todo:
ApiKey – Gestión de Credenciales
class ApiKey(models.Model):
group = models.ForeignKey(Group, ...)
api_type = models.CharField(choices=['openai', 'wordpress', 'facebook'])
api_key = models.TextField()
api_url = models.URLField() # Para WordPress
facebook_page_id = models.CharField() # Para Facebook
Esto permite que cada grupo tenga sus propias credenciales.
UserPromptConfig – Prompts Personalizados
class UserPromptConfig(models.Model):
user = models.OneToOneField(User, ...)
custom_prompt = models.TextField()
ArticleHistory – Historial Completo
Guardo cada artículo procesado con:
- URL o texto original
- Contenido generado
- Categorías y tags seleccionados
- Tipo de entrada (URL o manual)
- Timestamp
Lecciones Aprendidas
1. El Web Scraping No Es Trivial
Cada sitio tiene su estructura. Añadir headers realistas y delays aleatorios fue crucial para evitar bloqueos.
2. GPT-4 es Potente pero Caro
Dividir en dos fases redujo costos significativamente. Típicamente cada artículo cuesta $0.01-0.03.
3. Los Previews Son Imprescindibles
El preview interactivo te permite revisar y ajustar antes de confirmar.
4. Multi-tenancy Desde el Inicio
Diseñé el sistema para múltiples usuarios y grupos desde el principio. Esto facilitó mucho el escalado.
Consideraciones Éticas
Este sistema está diseñado para:
- Transformar contenido, no copiarlo
- Usarse con contenido público o licenciado
- Añadir valor al contenido original
- Funcionar como herramienta de curación
Es importante verificar los permisos de uso de las fuentes.
Tecnologías Utilizadas
Backend:
- Django
- Python
Web Scraping:
- BeautifulSoup4
- Requests
IA:
- OpenAI API (GPT-4)
Integraciones:
- WordPress REST API
- Facebook Graph API
Base de Datos:
- SQLite (desarrollo)
- PostgreSQL (producción)
Resultados
Después del desarrollo y refinamiento, el sistema:
- Reduce el tiempo de procesamiento de horas a pocos minutos
- Genera contenido completamente único
- Optimiza automáticamente para SEO
- Publica en múltiples plataformas
- Gestiona taxonomías inteligentemente
Próximas Mejoras
Estoy trabajando en:
- Soporte para más CMS (Drupal, Joomla)
- Integración con Instagram
- Sistema de programación de publicaciones
- Analytics integrado
Conclusión
Construir Article Scraper fue un proyecto interesante que combinó múltiples tecnologías: web scraping, inteligencia artificial, APIs REST y gestión de usuarios. Django demostró ser una excelente base para este tipo de sistema, y GPT-4 realmente marca la diferencia en la calidad del contenido generado.
Si estáis pensando en construir algo similar, mi consejo es:
- Empezad con un MVP simple
- Probad diferentes modelos de IA
- Implementad previews antes de publicar
- Diseñad para multi-tenancy desde el inicio
- No subestimeis la complejidad del web scraping
El código está en producción y procesando artículos diariamente. Ha sido una experiencia de aprendizaje increíble.
Preguntas Frecuentes
¿Cuál fue la parte más difícil?
La gestión del doble token de Facebook y hacer el scraping robusto contra diferentes estructuras web.
¿Funcionaría para mi blog?
Si tu CMS tiene API REST (WordPress, Ghost, Strapi, PrestaShop), sí. Es bastante flexible. Sólo se necesita algo de desarrollo.
¿Qué pasa si un sitio bloquea el scraping?
El sistema tiene reintentos y delays, pero si un sitio bloquea agresivamente, siempre queda la opción de entrada manual.
Tags: tutorial, django, python, web scraping, openai, gpt-4, automatización, cms, desarrollo web, inteligencia artificial, api rest, wordpress, facebook

