Cómo raspar tableros de empleo con las herramientas de agente de OpenAI
TL;DR
El agente "Operator" de OpenAI para consumidores se apagó el 31 de agosto de 2025, y su sucesor, el agente ChatGPT, fue retirado en favor de ChatGPT Work en julio de 2026 — ninguno es una herramienta de scraping y ninguno expone una API pública que puedas llamar desde tu propio código.
La ruta real construible para "raspar tableros de empleo con un agente de OpenAI" es la herramienta computer_use_preview en el modelo computer-use-preview, llamada a través de la API de Respuestas — controla un navegador real a través de capturas de pantalla y acciones de clic/escribir/desplazar en lugar de leer el código fuente de la página.
Antes de recurrir a la automatización del navegador, verifica si el tablero de destino funciona en un sistema de seguimiento de candidatos (Greenhouse, Lever, Ashby) con un feed de trabajo JSON público, gratuito y no autenticado — devuelve datos estructurados directamente y omite completamente el bucle del agente.
Un agente de uso de computadora es la herramienta adecuada solo cuando un tablero no tiene un feed público y no hay datos estructurados de JobPosting accesibles en el HTML de la página, ya que es más lento, más caro por página y más frágil que una solicitud HTTP directa.
Raspar listados de trabajos públicamente accesibles se ha sostenido bajo la Ley de Fraude y Abuso Informático en los tribunales de EE. UU., pero los propios Términos de Servicio de un tablero aún pueden crear exposición por incumplimiento de contrato, y eludir la detección de bots o los límites de tasa plantea un riesgo legal distinto bajo la ley anti-elusión.
Dirige el tráfico de salida del navegador del agente a través de un grupo de proxies residenciales rotativos para evitar bloqueos de IP de centros de datos, y normaliza la salida de cada tablero en un esquema compartido (título, ubicación, URL, fecha de publicación, descripción) antes de almacenarlo.
Introducción
"OpenAI Operator" ya no se refiere a un producto en funcionamiento. OpenAI lanzó Operator como un agente de navegador en vista previa de investigación el 23 de enero de 2025, restringido en su lanzamiento a suscriptores de ChatGPT Pro, y lo apagó el 31 de agosto de 2025 después de fusionar sus capacidades en un modo más amplio de "agente ChatGPT". El propio agente ChatGPT tampoco duró: el centro de ayuda de OpenAI ahora afirma claramente que "el agente ChatGPT ya no está disponible. Usa ChatGPT Work para tareas más largas y de múltiples pasos y entregables terminados," según , que se lanzó en julio de 2026 como la superficie actual del agente para consumidores.
Ninguno de esos tres productos — Operator, agente ChatGPT, o ChatGPT Work — ofrece una API pública. Son características de interfaz de chat que controlas escribiendo una solicitud, no algo que puedas conectar a un trabajo programado que extraiga publicaciones de empleo en una base de datos cada mañana. Si deseas construir un pipeline repetible, la pieza relevante del conjunto de OpenAI es la herramienta de uso de computadora en la API de Respuestas — una capacidad dirigida a desarrolladores que cumple el mismo papel que Operator (mirar una captura de pantalla, decidir dónde hacer clic o escribir, y repetir), pero como una API que llamas desde tu propio código. Este tutorial construye un raspador de tableros de empleo sobre esa herramienta y es explícito en todo momento sobre cuándo un agente de navegador completo es la herramienta incorrecta para la tarea.
Por qué raspar tableros de empleo
Los equipos de reclutamiento e investigación de mercado extraen datos de trabajo estructurados por una variedad de razones recurrentes: rastrear la velocidad de contratación de un competidor por departamento, comparar la compensación y la inflación de títulos en un sector, alimentar una herramienta de búsqueda de talento con nuevas requisiciones, o construir un producto de búsqueda de empleo vertical que agregue listados que un motor de búsqueda general no muestra bien. Todos estos necesitan al menos los mismos tres campos — título, ubicación y un enlace estable de vuelta a la fuente — más lo que la situación requiera (fecha de publicación, antigüedad, elegibilidad para trabajo remoto, rango salarial cuando se divulga).
Un agente de navegador de IA justifica su costo específicamente en tableros que muestran listados detrás de JavaScript del lado del cliente pesado, bloquean la paginación detrás de una interacción de desplazamiento infinito, o utilizan nombres de clase CSS que rotan en cada implementación, ya que el agente razona sobre lo que ve en pantalla en lugar de un selector fijo. Es la herramienta incorrecta para un tablero que ya responde con JSON estructurado a solicitud — ese caso se cubrirá en la siguiente sección, y es tanto más rápido como más barato que controlar un navegador en absoluto.
Elegir el enfoque de extracción correcto
Antes de escribir un bucle de agente, pasa cinco minutos verificando si el tablero objetivo hace esto innecesario. La mayoría de las páginas de carreras se basan en uno de un puñado de sistemas de seguimiento de candidatos (ATS), y varios de los más grandes — Greenhouse, Lever, Ashby — exponen un punto final JSON gratuito y no autenticado que devuelve cada listado abierto para una empresa dada. La API pública del Job Board de Greenhouse, por ejemplo, sirve GET https://boards-api.greenhouse.io/v1/boards/{board_token}/jobs sin necesidad de clave API, devolviendo id, title, location, absolute_url y updated_at para cada publicación, con un parámetro opcional content=true que añade la descripción completa del trabajo. Si la página de carreras de una empresa está alojada por Greenhouse, ese punto final es tanto más confiable como dramáticamente más barato que cualquier agente.
Un segundo recurso se encuentra en un nivel inferior: muchas páginas de publicación de empleos — incluidas aquellas que no utilizan un ATS conocido — incrustan un bloque schema.org/JobPosting como JSON-LD directamente en el HTML de la página, específicamente porque los tablones de empleo quieren que sus listados sean correctamente capturados por la función de búsqueda de empleos de Google. Ese JSON-LD es legible por máquinas sin necesidad de renderización del navegador; una simple solicitud HTTP GET y un analizador HTML lo recuperan. Recurre al agente de uso informático solo después de confirmar que ni un feed público de ATS ni datos estructurados incrustados existen — ese es el escenario en el que la página es genuinamente interactiva (resultados renderizados por el cliente, paginación activada por desplazamiento, o un formulario de búsqueda que debe completarse antes de que aparezcan los resultados) y un script que solo solicita la URL no obtiene nada útil a cambio.
Echa un vistazo rápido
Cuando un tablero no tiene un feed público pero tampoco necesita una automatización interactiva completa, Nstproxy Crawl puede renderizar el JavaScript de la página y devolver Markdown limpio o JSON de una sola llamada a la API en lugar de programar un agente de navegador.
Una cuenta de OpenAI con acceso a la API de Respuestas y el modelo computer-use-preview — esta es una capacidad de desarrollador separada de los planes para consumidores de ChatGPT y se factura por token ($3.00 por 1M de tokens de entrada, $12.00 por 1M de tokens de salida en el momento de escribir esto) más una tarifa por llamada a la herramienta; verifica los precios actuales en la propia página de precios de OpenAI antes de presupuestar una ejecución en producción.
Python 3.9+ con requests instalado, o un cliente HTTP equivalente en el lenguaje de tu elección.
Una forma de renderizar y capturar una página de navegador y traducir las acciones del modelo de vuelta en eventos de entrada reales — la guía de OpenAI señala a Playwright como la implementación de referencia; los ejemplos de código de este tutorial asumen un navegador impulsado por Playwright.
Un grupo de proxies rotativos para cualquier ejecución que toque más de un puñado de páginas, ya que una sola IP de scraping que realiza solicitudes automatizadas repetidas es exactamente el patrón que la detección de bots de tablones de empleo está construida para atrapar.
Cinco minutos con los Términos de Servicio y robots.txt del tablero objetivo — consulta Observaciones y límites a continuación antes de dirigir esto a un sitio específico.
Paso 1: Confirma que no hay un feed público para usar en su lugar
Comienza por verificar la página de carreras de la empresa objetivo en busca de un patrón de ATS conocido. Si la URL de la página de carreras contiene greenhouse.io, lever.co, o redirige a través de uno de esos dominios, prueba directamente el punto final de trabajos públicos del tablero:
Si eso devuelve un array jobs, has terminado con la extracción — salta al Paso 4 y normaliza esa respuesta en lugar de construir un agente. El board_token suele ser el slug de la empresa tal como aparece en la URL de carreras. Si el punto final devuelve un 404, la empresa no está en Greenhouse o utiliza un token diferente al de su nombre de marca público, y vale la pena una rápida verificación manual de las solicitudes de red salientes de la página (a través de las herramientas de desarrollo del navegador) para buscar una llamada a la API JSON antes de concluir que realmente necesitas un agente.
Paso 2: Configura el bucle del agente de uso informático
Si no existe un feed, inicializa una llamada a la API de Respuestas con la herramienta computer_use_preview. La herramienta necesita un display_width y display_height fijos que coincidan con el viewport que tu navegador Playwright realmente renderiza, y un environment de "browser":
from openai import OpenAI
client = OpenAI()# lee OPENAI_API_KEY del entornoresponse = client.responses.create( model="computer-use-preview", tools=[{"type":"computer_use_preview",```json
"display_width":1024,"display_height":768,"environment":"browser",}],input=[{"role":"user","content":[{"type":"input_text","text":("Abre la página de carreras y enumera cada título de trabajo, ""ubicación y URL de publicación visible sin desplazarte."),}],}], truncation="auto",)
El modelo no ejecuta nada por sí mismo; devuelve un computer_call que describe una acción (un click en una coordenada, un type con texto literal, un scroll, etc.). Tu código es responsable de realizar realmente esa acción en un navegador real a través de Playwright, capturando una captura de pantalla nueva y enviándola de vuelta como un computer_call_output para que el modelo pueda decidir el siguiente paso:
call = response.output[0]# el objeto computer_callaction = call.action # e.g. {"type": "click", "x": 512, "y": 384}run_action_in_playwright(action)# ejecutar la acción, luego capturar una nueva captura de pantallanext_response = client.responses.create( model="computer-use-preview", previous_response_id=response.id, tools=[{"type":"computer_use_preview","display_width":1024,"display_height":768,"environment":"browser",}],input=[{"call_id": call.call_id,"type":"computer_call_output","output":{"type":"input_image","image_url":f"data:image/png;base64,{screenshot_base64}",},}], truncation="auto",)
Este intercambio se repite: actuar, captura de pantalla, enviar, leer la siguiente acción, hasta que una respuesta regresa sin un computer_call, lo que indica que el modelo cree que la tarea está finalizada. Esta forma de solicitud/respuesta ilustra el esquema documentado en lugar de una ejecución capturada contra una cuenta OpenAI en vivo en este entorno; trata los nombres de variables y el orden exacto de campos como sujetos a la referencia actual de la API antes de enviarlo, ya que computer-use-preview sigue siendo un modelo etiquetado como vista previa.
Paso 3: Paginación y mantenimiento del estado a lo largo de la ejecución
Los tableros de trabajos paginan de tres maneras comunes, y cada una necesita una condición de bucle diferente: páginas numeradas con un control de "siguiente" (haz clic, captura de pantalla, repite, detén cuando el control desaparezca), desplazamiento infinito (envía una acción de scroll, captura de pantalla y detén una vez que dos capturas de pantalla consecutivas no produzcan nuevas listas), o un botón de "cargar más" (haz clic, espera a que se renderice el nuevo DOM, captura de pantalla). Debido a que el agente solo ve píxeles, haz el seguimiento de la desduplicación tú mismo fuera del modelo: hash cada par de título-URL extraído y omite cualquier cosa que ya hayas registrado, ya que un agente que vuelve a leer una página desplazada parcialmente volverá a informar publicaciones que ya listó.
Limita cada ejecución con un límite de página rígido y un tiempo de espera en tiempo real. Un bucle de uso de computadora no tiene un sentido incorporado de "este sitio tiene 40 páginas y eso es demasiado"; ese límite es responsabilidad de tu código, no del modelo.
Paso 4: Normalizar en un esquema de salida estable
Ya sea que los datos provengan de un feed JSON de ATS, un bloque JSON-LD o una transcripción de agente, colócalos en la misma forma antes de almacenarlos:
{"id":"8077887","title":"Ingeniero de Plataforma de Datos","location":"Remoto - EE. UU.","url":"https://boards.example.com/jobs/8077887","updated_at":"2026-08-06T12:10:17-04:00","summary":"Construir y mantener tuberías de datos...","source":"greenhouse-api",# o "jsonld" / "computer-use-agent"}
Aquí está esa normalización ejecutándose contra un extremo JSON en vivo que devuelve este diseño exacto de campo, utilizando un fixture local que representa un verdadero host de ATS, ya que el acceso de red saliente de este entorno no llega directamente a dominios externos arbitrarios (el esquema en sí se confirmó en vivo contra la API pública de Greenhouse):
Salida: [{'id': 8077887, 'title': 'Ingeniero de Plataforma de Datos', 'location': 'Remoto - EE. UU.', ...}, {'id': 8077888, 'title': 'Ingeniero Backend Senior, Búsqueda', 'location': 'Nueva York, NY', ...}]
Este se ejecutó con éxito contra la instalación local con dos listados de muestra, confirmando la lógica de análisis contra los nombres de campo reales de Greenhouse (id, title, location.name, absolute_url, updated_at, content) antes de apuntarlo a un tablero en vivo.
Paso 5: Enrutar solicitudes a través de un grupo de proxy rotativo
Una única IP emitiendo docenas de solicitudes automatizadas al mismo tablero en un corto período es la firma exacta que los sistemas de detección de bots están ajustados para señalar, ya sea que esas solicitudes provengan de un bucle de requests.get() plano o del navegador que un agente de uso de computadora está controlando. Para un enfoque de alimentación ATS, esto significa enrutar su cliente HTTP a través de un grupo rotativo; para un agente de uso de computadora, significa lanzar Playwright con un proxy configurado en el contexto del navegador mismo para que cada carga de página — no solo las llamadas a la API — provenga de una IP residencial que cambia entre sesiones.
Nstproxy Residential Prime Proxies encajan en ese papel directamente: enrutan el tráfico a través de IPs residenciales reales en un gran grupo de países, lo que se presenta al sistema de control de riesgos de un tablero de trabajo como tráfico de búsqueda ordinario en lugar de solicitudes concentradas de un centro de datos. Para los equipos cuyo verdadero cuello de botella es el paso de extracción en sí, en lugar de las IPs de proxy — páginas que necesitan renderización de JavaScript, reintentos y una salida estructurada limpia sin mantener un bucle de Playwright / uso de computadora en absoluto — Nstproxy Crawl merece ser evaluado como un reemplazo completo para los Pasos 2 y 3 en tableros que no requieren estrictamente automatización interactiva. Crawl:
Renderiza JavaScript y devuelve una salida limpia — una única llamada a la API obtiene Markdown, HTML limpio, o una captura de pantalla, sin que usted tenga que iniciar un proceso del navegador usted mismo.
Funciona respaldado por proxy por defecto — cada recuperación pasa por la propia infraestructura de proxy de Nstproxy con manejo de huellas digitales del navegador, cubriendo el problema de diversidad de IPs del que trata esta sección.
Cobra por recuperación exitosa, no por intento — una solicitud que obtiene una respuesta real (incluyendo un 404 o 403) se cobra una vez; solo un fallo del lado del sistema para recuperar algo queda sin cobrar, lo que hace que el costo sea predecible en un lote de páginas de carrera.
Crawl actualmente no realiza extracción de campos en lenguaje natural de la manera en que lo hacen algunos competidores — usted aún debe escribir la normalización del Paso 4 por su cuenta contra el Markdown o HTML devuelto — pero elimina la carga de orquestación del navegador para cualquier tablero donde un agente de uso de computadora sería un exceso. La referencia de la API de Crawl cubre la forma exacta de solicitud y respuesta para tanto rastreos de una sola página como a nivel de sitio, y la tarificación actual de suscripción de Crawl cobra por recuperación exitosa en lugar de por intento, lo que vale la pena verificar contra su volumen de páginas esperado antes de comprometerse con ello sobre un bucle de navegador auto-alojado. El anuncio de lanzamiento de Crawl de Nstproxy cubre el conjunto de características más completo, incluyendo rastreo a nivel de sitio y salida multi-formato, si este caso de uso específico se expande más allá de las páginas de carrera individuales.
Observaciones y límites
Un agente de uso de computadora es lento y costoso en comparación con una solicitud directa: cada acción cuesta un viaje redondo del modelo más una carga de captura de pantalla a plena resolución, por lo que una página de 40 listados con varias acciones de desplazamiento puede requerir docenas de llamadas a la API antes de tener todos sus datos. Presupueste en consecuencia y prefiera el camino de alimentación ATS o JSON-LD siempre que cualquiera esté disponible — reserve el agente para tableros que realmente requieran navegación interactiva.
Legalmente, el terreno aquí está más asentado de lo que podría parecer. En hiQ Labs v. LinkedIn, el Noveno Circuito sostuvo — dos veces, en apelación y en devolución — que raspar datos que un sitio ha hecho accesibles públicamente no viola la Ley de Fraude y Abuso de Computadoras, porque la CFAA apunta al acceso no autorizado a sistemas no públicos, no a la recolección automatizada de lo que cualquiera ya puede ver en un navegador. Eso no hace que raspar sea libre de riesgos: los propios Términos de Servicio de un tablero pueden independientemente prohibir la recolección automatizada, y violar ese acuerdo crea exposición por incumplimiento de contrato incluso donde no existe reclamación bajo la CFAA. Un riesgo más nuevo y, argumentablemente, más agudo se encuentra en la ley anti-elusión — la demanda de Reddit de 2025 contra Perplexity se centra en reclamaciones de la DMCA § 1201 sobre la elusión de límites de tasa, CAPTCHAs y sistemas de detección de bots específicamente, que es una teoría legal diferente a "¿estaban los datos públicos?". Lea los Términos de Servicio de un tablero objetivo antes de ejecutar cualquier raspador contra él, y trate "el sitio puso un CAPTCHA" como una señal para detenerse en lugar de un rompecabezas por resolver.
Las ofertas de trabajo también pueden llevar datos personales — un correo electrónico directo o número de teléfono de un reclutador nombrado incrustado en una publicación, por ejemplo — lo que desencadena obligaciones ordinarias de protección de datos (GDPR entre ellas) independientemente de si la página misma es pública. Almacenar los datos de contacto del gerente de contratación a gran escala sin una base legal para ese uso específico es una actividad materialmente diferente a almacenar el título del trabajo y la ubicación, y este flujo de trabajo no debería cruzar casualmente esa línea capturando más del contenido de una publicación de lo que realmente necesita un caso de uso.
El marcado y la estructura de la página en cualquier tablón dado cambiarán sin aviso, y un enfoque basado en agentes tolera eso mejor que un script frágil de selector CSS — pero ambos enfoques se degradan si un tablón cambia de proveedores de ATS o rediseña su página de carreras, así que presupuesta la nueva verificación periódica en lugar de un pipeline de "configúralo y olvídalo".
Conclusión
"Scraping with OpenAI Operator" describe un producto que ya no existe; el equivalente real y construible hoy es la herramienta computer_use_preview en el modelo computer-use-preview de OpenAI, llamada a través de la API de Respuestas y emparejada con tu propia automatización de navegador. Utilízala solo después de descartar un feed público de ATS o datos estructurados JobPosting incrustados, ya que ambos son más rápidos, baratos y estables que operar un navegador. Independientemente del método de extracción que utilices, normaliza la salida en un esquema, establece una paginación explícitamente, enruta el tráfico a través de un grupo de proxies residenciales o una API de renderizado como Nstproxy Crawl para evitar bloqueos basados en IP, y lee los Términos de Servicio del tablón objetivo antes de dirigir cualquier cosa automatizada hacia él.
FAQ
Q: ¿Está OpenAI Operator todavía disponible para scrapear tablones de trabajo?
No. Operator cerró el 31 de agosto de 2025. Su sucesor, el agente ChatGPT, también fue retirado — el centro de ayuda de OpenAI ahora dirige a los usuarios a ChatGPT Work en su lugar. Ni Operator, ni el agente ChatGPT, ni ChatGPT Work exponen una API pública; el equivalente construible para un pipeline personalizado es la herramienta computer_use_preview en el modelo computer-use-preview en la API de Respuestas.
Q: ¿Necesito un agente de uso de computadora para cada tablón de trabajo?
No. Verifica primero si el tablón funciona con un ATS que tenga un feed JSON público (Greenhouse, Lever y Ashby ofrecen uno) o si incrusta datos estructurados schema.org/JobPosting directamente en el HTML de la página. Ambos son más rápidos, baratos y estables que operar un navegador, y un agente de uso de computadora vale el costo adicional y la latencia solo cuando ninguno de los dos existe.
Q: ¿Es legal scrapear ofertas de trabajo públicamente visibles?
Los tribunales de EE. UU. han mantenido, en hiQ Labs v. LinkedIn, que scrapear datos que un sitio hace accesibles públicamente no viola por sí mismo la Ley de Fraude y Abuso Informático. Eso no elimina todos los riesgos legales: los Términos de Servicio de un tablón pueden prohibir por separado la recolección automatizada como cuestión de contrato, y sortear los límites de tasa o la detección de bots plantea una exposición distinta a la elusión. Lee los Términos de Servicio específicos del tablón antes de scrapearlo, y trata eso como una decisión por sitio en lugar de un hecho legal general.
Q: ¿Qué pasa si un tablón de trabajo cambia el diseño de su página?
Un agente de uso de computadora tolera los cambios de diseño y marcado mejor que un script de selector CSS fijo, ya que razona sobre lo que está visualmente en pantalla en lugar de un camino DOM específico. No tolera una migración de ATS o un rediseño completo del sitio de forma elegante — presupuesta una re-verificación periódica de tu lógica de extracción independientemente del método que utilices.
Q: ¿Cuántas páginas u ofertas puede manejar esto a la vez?
Establece un conteo de páginas explícito y un tiempo de espera en reloj en tu propio código; ni el enfoque de feed de ATS ni el bucle de uso de computadora imponen un punto de detención razonable por sí solos. Para un bucle de agente específicamente, también deduplica las ofertas extraídas por título y URL, ya que volver a desplazarse por una página parcialmente leída puede causar que el modelo vuelva a reportar entradas que ya encontró.
Q: ¿Este flujo de trabajo requiere un proxy para funcionar?
No — el código en este tutorial se ejecuta sin uno. Un grupo de proxies se vuelve necesario una vez que haces solicitudes automatizadas repetidas al mismo tablón en un corto período, que es el patrón al que la mayoría de las detecciones de bots en tablones de trabajo están ajustadas para señalar independientemente de si esas solicitudes provienen de un cliente HTTP simple o de un navegador que un agente de uso de computadora está manejando.
Q: ¿Este mismo enfoque puede extraer información salarial y de contacto de las ofertas?
Técnicamente, sí, si esos datos aparecen en la página. Trátalo con cuidado: el correo electrónico del reclutador de una publicación o el número de teléfono son datos personales sujetos a reglas ordinarias de protección de datos (incluido el GDPR) incluso si la página misma es pública, así que solo captura y almacena campos que tu caso de uso real necesite.
Cómo Crear un Constructor de Flujo de Trabajo Visual de Código Abierto para Agentes de IA en 2026
Construya un verdadero generador de flujos visuales de código abierto para agentes de IA: un lienzo de React Flow emparejado con un motor de ejecución de orden topológico verificado, probado de extremo a extremo con salida capturada real.
Ivy Lin
Aug. 24th 2026
110M+ IP reales con 99.9% de acceso exitoso
Respuesta media ultrarrapida ~0.5s para tareas de alta concurrencia
Desde solo $0.1/GB
Acceso inmediato a pools premium de proxies residenciales, datacenter, IPv6 e ISP.