================================================================================ 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.