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.
Decidí construir el sistema sobre Django por varias razones:
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
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:
# 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:
Y extrae solo lo importante: título y contenido del artículo.
Probé varias soluciones, pero OpenAI GPT-4 resultó ser la más efectiva para:
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.
Añadí una funcionalidad muy interesante: prompts personalizados por usuario. Cada usuario puede configurar instrucciones específicas como:
Esto se guarda en la base de datos y se añade al contexto de GPT automáticamente.
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.
No quería limitarme a WordPress, así que diseñé la arquitectura para soportar:
Publicar en Facebook fue más complejo de lo que pensaba. Descubrí que necesitaba un sistema de doble token:
1. User Access Token:
2. Page Access Token:
Esto garantiza que los permisos sean correctos y no expire nada inesperadamente.
Implementé dos formas de usar el sistema:
Usuario introduce URL
↓
Scraping automático
↓
GPT reescribe
↓
Selección de taxonomías
↓
Preview interactivo
↓
Publicación
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.
Creé varios modelos para gestionar todo:
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.
class UserPromptConfig(models.Model):
user = models.OneToOneField(User, ...)
custom_prompt = models.TextField()
Guardo cada artículo procesado con:
Cada sitio tiene su estructura. Añadir headers realistas y delays aleatorios fue crucial para evitar bloqueos.
Dividir en dos fases redujo costos significativamente. Típicamente cada artículo cuesta $0.01-0.03.
El preview interactivo te permite revisar y ajustar antes de confirmar.
Diseñé el sistema para múltiples usuarios y grupos desde el principio. Esto facilitó mucho el escalado.
Este sistema está diseñado para:
Es importante verificar los permisos de uso de las fuentes.
Backend:
Web Scraping:
IA:
Integraciones:
Base de Datos:
Después del desarrollo y refinamiento, el sistema:
Estoy trabajando en:
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:
El código está en producción y procesando artículos diariamente. Ha sido una experiencia de aprendizaje increíble.
¿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
Módulo Verifactu para Prestashop: La Solución Definitiva para 2026 Si tu tienda online usa Prestashop,…
Tener una tienda PrestaShop desactualizada no es simplemente arriesgado: es una amenaza directa para tus…
¿Te imaginas contar con un sistema de automatizaciones totalmente gratuito para tu empresa? ¡Es posible!…
Se puede corregir el problema modificando en el CORE el siguiente código:
Modifica tu tienda en un solo sitio Si por algún motivo, no utilizas multitienda y…
En el proceso de compra no se muestran las opciones de pago Si te has…