================================================================================
PROMPT 02 — CONVERSACIONAL (CHAT WEB)
Nombre: Contract Downloader · Track Conversacional
Herramientas: ChatGPT (web/app), Claude.ai (web), Gemini (web/Pro)
Tiempo estimado breakout: 25 minutos
Nivel: Sin experiencia en programacion; sabe abrir terminal o usar Replit/Colab
================================================================================
OBJETIVO DEL BREAKOUT
---------------------
Al finalizar los 25 minutos, el participante debe haber recibido del modelo un
unico bloque de codigo Python listo para copiar, pegarlo en su computadora o en
Replit/Google Colab, ejecutarlo y obtener una carpeta `descargas/` con archivos
PDF reales de contratos colectivos descargados desde el portal publico del
Centro Federal de Conciliacion y Registro Laboral (CFCRL).
El facilitador entrega al inicio del breakout 3 numeros de CCT de prueba.
REQUISITOS PREVIOS
------------------
- Cuenta activa en ChatGPT, Claude.ai o Gemini
- Una de estas tres opciones para ejecutar el codigo:
Opcion A: Python 3.10+ instalado en la computadora + terminal
Opcion B: Cuenta gratuita en https://replit.com (recomendada para no tecnicos)
Opcion C: Cuenta de Google para usar Google Colab (https://colab.research.google.com)
- Lista de 3 CCTs de prueba entregada por el facilitador
- Conexion a internet sin proxy corporativo que bloquee .gob.mx
ALCANCE DEL EJERCICIO
---------------------
Este script descarga archivos PDF cuyos enlaces estan visibles directamente en
el HTML del repositorio (tabuladores, contratos colectivos, actas). NO incluye
el flujo de descarga protegido (boton "btn-generar-liga") que requiere CSRF y
tokens temporales — ese componente diferencia al descargador profesional y se
abordara en otro modulo. Aun asi, esta version basica recupera la mayoria de
documentos publicos accesibles.
================================================================================
PROMPT — COPIAR Y PEGAR EN EL CHAT (UN SOLO MENSAJE)
================================================================================
Hola. Necesito tu ayuda para construir un script de Python que descargue
archivos PDF reales desde un sitio publico del gobierno mexicano. Voy a darte
todo el contexto y al final te pedire que me entregues el codigo COMPLETO en
UN solo bloque, para copiar, pegar y ejecutar sin armar nada por mi cuenta.
CONTEXTO
Soy profesional de Recursos Humanos en Mexico y quiero descargar documentos
publicos de contratos colectivos de trabajo (CCT) que estan en el repositorio
del Centro Federal de Conciliacion y Registro Laboral. El sitio es publico, la
informacion es publica.
Las URLs reales y verificadas son:
Busqueda: https://repositorio.centrolaboral.gob.mx
Pagina contrato: https://repositorio.centrolaboral.gob.mx/contrato/{id}
Descarga PDF: https://registro.centrolaboral.gob.mx/documento-publico/download/...
EL FLUJO REAL ES ESTE (importantisimo, sigue exactamente este flujo):
PASO 1: Hacer GET a https://repositorio.centrolaboral.gob.mx con
estos query parameters:
search = numero del CCT (string)
tab = "contratos"
form_general = "1"
La respuesta es HTML que contiene una tabla. Cada fila relevante
tiene un enlace asi: ...
donde 12345 es un numero entero. Hay que extraer todos esos
numeros (puede haber 1, varios o ninguno).
PASO 2: Para cada numero N obtenido, hacer GET a
https://repositorio.centrolaboral.gob.mx/contrato/N
La respuesta es otro HTML. Hay que buscar TODOS los enlaces
cuyo href CONTENGA la cadena
"/documento-publico/download/". Esos son los archivos a bajar.
Si el href empieza con "/", convertirlo en
"https://registro.centrolaboral.gob.mx" + href.
PASO 3: Para cada URL de descarga, hacer GET con stream=True y guardar
el contenido en disco como PDF. Los nombres de archivo vienen
DENTRO de la URL, separados por barra vertical "|". Ejemplo:
.../download/2025|06|26|tramite-403862|contratos|miarchivo.pdf
El nombre real del archivo es lo que viene despues del ULTIMO "|".
PASO 4: Organizar las descargas en carpetas por tipo:
- Si la URL contiene "tabulador", "sueldos_pdf" o "sueldos_excel"
-> carpeta "tabuladores"
- Si contiene "acta" o "resultado" -> carpeta "actas_votacion"
- Si contiene "convocatoria" -> carpeta "convocatorias"
- Cualquier otro caso -> carpeta "contratos"
LO QUE NECESITO QUE HAGAS
1. Escribe un script de Python en UN solo archivo, en UN solo bloque de codigo,
que haga lo siguiente:
a) Use solamente: requests, beautifulsoup4 (de bs4 import BeautifulSoup),
pathlib, time, logging, re. Nada mas.
b) Tenga al inicio del archivo, faciles de cambiar:
CCTS = ["1234567", "2345678", "3456789"] # los 3 CCTs del facilitador
CARPETA_SALIDA = "descargas"
PAUSA_SEGUNDOS = 2.5
c) Use un User-Agent realista de Chrome de Windows
(ej. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") y header
"Accept-Language: es-MX,es;q=0.9".
d) Para cada CCT en CCTS:
- Loggea "Procesando CCT XXXXX".
- Busca los IDs de contrato (paso 1 del flujo).
- Para cada ID, entra a la pagina y extrae los enlaces de descarga
(paso 2 del flujo).
- Para cada enlace, clasifica el tipo y descarga (pasos 3 y 4).
- Espera PAUSA_SEGUNDOS (time.sleep) entre cada peticion al servidor.
e) Si un archivo ya existe en disco (mismo nombre y carpeta), saltalo.
Loggea como "ya existe".
f) Si una descarga falla (timeout, 4xx, 5xx), loggea warning con el
detalle y CONTINUA con el siguiente. No abortes todo el proceso.
g) Antes de escribir cada archivo a disco, valida que los primeros bytes
empiecen con la firma %PDF para PDFs (o que el Content-Type sea PDF/
xlsx/docx). Si no, descarta y loggea como "respuesta no es archivo".
h) Al final, imprime un resumen: cuantos archivos descargados, cuantos
ya existian, cuantos errores, y la ruta completa de la carpeta de
salida.
2. Despues del bloque de codigo, en texto normal y en espanol claro, dime:
- Como instalar las dependencias en una sola linea (pip install ...).
- Como ejecutar el script en mi computadora (Windows y macOS).
- Como ejecutarlo en Replit paso a paso (asume que nunca lo he usado).
- Que estructura de carpetas voy a tener al terminar.
3. Si el portal no responde o cambia su estructura HTML, dimelo claramente
y proponme una alternativa simple. NO me digas "instala Selenium" como
primera opcion.
REGLAS DE ENTREGA
- El codigo debe ser AUTOCONTENIDO. Nada de "completa esta funcion" ni
placeholders tipo "TODO" ni "tu_codigo_aqui".
- No intentes implementar manejo CSRF ni el flujo de "btn-generar-liga".
Si en el HTML de un contrato no hay enlaces directos /documento-publico/
download/, simplemente loggealo como "sin documentos directos" y sigue.
- Comentarios en espanol, breves, solo donde aporten claridad.
- Sin print() decorativos ni emojis (la consola Windows truena con
caracteres especiales).
- El script tiene que CORRER tal cual lo entregues, sin que yo tenga que
modificar nada mas alla de la lista CCTS.
Cuando termines, espera mi respuesta antes de hacer cambios. Voy a ejecutarlo
y volvere con la salida o con el error que aparezca.
================================================================================
SI ALGO SALE MAL — QUE PEGAR DE VUELTA EN EL CHAT
================================================================================
1. Aparece un error de Python (Traceback)
Copia las ultimas 15 lineas del Traceback y pega esto:
"Me salio este error al ejecutar el script. Corrige el codigo y entregame
el archivo COMPLETO otra vez en un solo bloque, no me des solo el parche."
2. El script corre pero no descargo nada
Pega esta instruccion:
"El script corrio sin error pero la carpeta descargas esta vacia. Modifica
el codigo para que ANTES de procesar, en el primer CCT, guarde el HTML de
busqueda en debug_busqueda.html y el HTML de la primera pagina de contrato
en debug_contrato.html. Tambien que imprima en consola cuantos enlaces
/contrato/ encontro y cuantos /documento-publico/download/ encontro.
Entregame el codigo completo otra vez."
Cuando lo corras, pega los conteos al chat.
3. Las descargas devuelven HTML en vez de PDF
Pega: "Las descargas devuelven contenido pero no son PDFs validos.
Modifica el codigo para imprimir Content-Type y los primeros 200
caracteres de la respuesta antes de guardar, solo para la primera
descarga. Entregame el codigo completo."
4. Replit/Colab da error de instalacion
Pega: "Estoy ejecutando esto en [Replit / Google Colab] y la instalacion
de dependencias falla con este mensaje: [pega el error]. Dame la version
adaptada para este entorno con la instruccion exacta de instalacion."
================================================================================
VARIANTES Y EXTENSIONES (mas alla del breakout)
================================================================================
A. Resumen ejecutivo de descargas
Despues de correr el script, sube al chat 1 o 2 PDFs descargados (los mas
pequenios) y pide:
"Lee este contrato colectivo y dame en una pagina: vigencia, sindicato
titular, numero de trabajadores estimado si lo menciona, y 5 prestaciones
extralegales destacadas. No inventes lo que no este en el texto."
B. Procesar lista grande de CCTs desde Excel
Pidele: "Modifica el script para que en vez de tener CCTS en codigo, lea
una columna llamada 'CCT' de un archivo Excel llamado empresas.xlsx (hoja
Sheet1). Mantengo todo lo demas igual."
C. Programar la descarga periodica
Pidele: "Dame el comando de Windows Task Scheduler (schtasks.exe) para
correr este script todos los lunes a las 8:00 AM, registrando la salida
en un archivo .log con la fecha del dia." Util para mantener un
repositorio local actualizado sin intervenir.
================================================================================
DISCLAIMER DE USO RESPONSABLE
================================================================================
El portal del CFCRL es un servicio publico. Mantente en PAUSA_SEGUNDOS de
minimo 2 segundos entre peticiones, no corras el script en bucles infinitos
ni en horarios pico, y descarga solo lo que necesites para tu analisis. La
informacion es publica pero su tratamiento posterior debe respetar la Ley
Federal de Proteccion de Datos Personales en Posesion de los Particulares
cuando incluya datos de personas fisicas identificables. Cita la fuente al
publicar analisis derivados.