Cómo crear un scraper de ofertas de empleo de Working Nomads
TL;DR
Comienza un scraper de trabajos de Working Nomads con la API vinculada desde la propia página de trabajos de la plataforma.
Trata el array devuelto como un feed observado, sin asumir completitud histórica o paginación no documentada.
Preserva url, title, company_name, location y pub_date antes de derivar etiquetas adicionales.
Normaliza el salario, la habilidad y la evidencia de la región de contratación por separado de los campos fuente en bruto.
Usa renderizado de navegador o un rastreo gestionado solo para contenido autorizado que el endpoint publicado no proporciona.
Nstdata Crawl proporciona una API de Web Crawling para datos listos para LLM; no reemplaza tu lógica de validación de trabajos y frescura.
¿Cuál es el mejor punto de partida para un scraper de trabajos de Working Nomads?
El mejor punto de partida es la API pública vinculada desde Working Nomads, porque una respuesta estructurada proporcionada por el editor puede eliminar la automatización innecesaria del navegador. La página de trabajos de Working Nomads vincula a su API junto a otros recursos del producto. Durante la preparación de esta guía, el endpoint vinculado devolvió un array JSON que contenía URLs de trabajos, títulos, descripciones, nombres de empresas, categorías, etiquetas, ubicaciones y fechas de publicación.
Esa observación no establece un catálogo exhaustivo, un acuerdo de nivel de servicio, ni permiso para cada reutilización comercial. Verifica los términos actuales de la plataforma y contacta al editor cuando tu volumen de distribución o colección intencionado requiera aclaración. Una respuesta visible de la API es una entrada útil de ingeniería, no un sustituto de un acuerdo.
Para un pipeline de datos de trabajos más amplio permitido, puede recolectar páginas de detalles aprobadas y devolver contenido listo para LLM. Comienza con la fuente verificada más simple antes de añadir esa infraestructura.
¿Por qué importa más la selección de fuentes que la sintaxis del selector?
La selección de fuentes importa porque un feed estructurado de un editor, una página de listado renderizada y un endpoint de aplicación privada tienen diferentes estabilidad y límites de permiso. Un tutorial que demuestre una solicitud de búsqueda interna puede funcionar en un momento mientras depende de un detalle de implementación no documentado. El enlace de la API pública de la página oficial te da una opción más directa para evaluar.
Mantén un registro de fuentes que contenga la URL de entrada, propósito, propietario, campos observados, uso permitido, política de actualización y última validación exitosa. Vuelve a verificar la fuente cuando su esquema cambie en lugar de añadir silenciosamente retrocesos del navegador. Esto hace que un fallo sea explicable y evita que el pipeline se desplace a un método de acceso diferente sin revisión.
Si estás construyendo un pipeline de datos web de producción, la selección de fuentes debería ser una decisión de configuración. Evita incrustar una URL de feed, un endpoint oculto y un selector de navegador en una función que toma su propia decisión no documentada.
¿Qué necesitas antes de ejecutar el ejemplo?
Necesitas Python, acceso al endpoint vinculado por el editor, un uso aprobado para los datos devueltos y un directorio para archivos de salida. El ejemplo de la biblioteca estándar no necesita instalación de paquetes separados. Lee deliberadamente una sola respuesta en lugar de inventar parámetros de paginación.
Input o field
Propósito
Manejo requerido
URL de API
Fuente de descubrimiento vinculada por el editor
Verifica el enlace en la página de trabajos actual
url
Identidad del registro de la fuente
Mantén la URL original y valida su host
title
Título original del trabajo
Requiere una cadena no vacía
company_name
Etiqueta de la empresa suministrada por el editor
Preserva la ortografía; no asumas unicidad global
location
Información de ubicación declarada
Mantén el texto en bruto junto a las regiones derivadas
pub_date
Valor de publicación de la fuente
Preserva el valor original antes de analizar
observed_at
Hora de recolección
Genera un timestamp UTC localmente
Decide si necesitas una instantánea de investigación o un servicio de recomendación de trabajos en vivo. Una instantánea puede ser útil con una etiqueta de fecha clara. Un producto de recomendación necesita una política de expiración y una forma de evitar presentar listados obsoletos como oportunidades actuales.
¿Cómo funciona el flujo de recolección y normalización?
El flujo de recolección obtiene una respuesta de la fuente, valida su forma, normaliza campos soportados y actualiza empleos aceptados por identidad de fuente. Debe retener suficiente evidencia en bruto para explicar una transformación sin exponer datos innecesarios.
Mantenga las reglas de reintentos limitadas separadas de la aceptación de trabajos para que un fallo temporal de red no pueda convertirse en un valor de campo de origen. No sustituya un campo derivado por el valor bruto de origen. Por ejemplo, preserve location_raw incluso si añade hiring_region_normalized. Un futuro analizador puede reparar errores de clasificación sin volver a recuperar cada página. Mantenga la versión del extractor con el registro cuando los cambios afecten la elegibilidad o coincidencia aguas abajo.
¿Cómo recolectar trabajos de Working Nomads paso a paso?
Recolecte trabajos validando primero la respuesta oficial, luego añada solo las etapas de enriquecimiento que su contrato de campo requiera. Estos métodos están destinados a necesidades diferentes en lugar de ser técnicas intercambiables para la recolección masiva sin restricciones.
Método 1: Leer el feed JSON vinculado por el editor
Paso 1: Guardar el colector de respuesta única
Guarde este código como working_nomads.py. Los nombres de los campos fueron inspeccionados en la respuesta en vivo durante la preparación del artículo. El conteo de respuestas no es parte del contrato intencionalmente.
import json
import urllib.request
from datetime import datetime, timezone
from urllib.parse import urlsplit
url ="https://www.workingnomads.com/api/exposed_jobs/"with urllib.request.urlopen(url, timeout=30)as response: payload = response.read(5_000_001)iflen(payload)>5_000_000:raise RuntimeError("Response exceeds local size limit")items = json.loads(payload)ifnotisinstance(items,list):raise TypeError("Expected a list; inspect the current API response")observed = datetime.now(timezone.utc).isoformat()records, seen =[],set()for item in items:ifnotisinstance(item,dict):continue link =str(item.get("url")or"").strip() title =str(item.get("title")or"").strip() parts = urlsplit(link)if parts.scheme !="https"or parts.hostname notin{"workingnomads.com","www.workingnomads.com"}:continueifnot title or link in seen:continue seen.add(link) records.append({"source_url": link,"title": title,"company_name": item.get("company_name"),"location_raw": item.get("location"),"category": item.get("category_name"),"tags_raw": item.get("tags"),"published_at": item.get("pub_date"),"description_html": item.get("description"),"observed_at": observed
})ifnot records:raise RuntimeError("No accepted jobs; retain the last good snapshot")withopen("working-nomads-jobs.json","w", encoding="utf-8")as output: json.dump(records, output, ensure_ascii=False, indent=2)print("accepted jobs:",len(records))
Paso 2: Ejecutar el colector
Ejecute python working_nomads.py. Confirme que el archivo de salida contiene registros vinculados a la fuente con valores de publicación originales. El analizador fue ejercido contra la respuesta actual vinculada por el editor, pero su ejecución puede devolver un número diferente de trabajos o un esquema diferente.
Paso 3: Revisar la fuente actual contra la salida
Compare una pequeña muestra con las páginas de listado visibles. Verifique las etiquetas de las compañías y las restricciones de ubicación explícitamente. Si falta un campo, almacene null y registre la ausencia; no pida a un modelo que inferencie un hecho simplemente para que el registro parezca completo.
Método 2: Enriquecer una página de detalle aprobada
Paso 1: Identificar un campo de enriquecimiento justificado
Elija un campo cuya ausencia cambie la utilidad del producto, como una etiqueta de tipo de empleo. El vocabulario de JobPosting puede ayudar a definir el esquema interno, pero no demuestra que la página de destino publique la misma estructura.
Paso 2: Inspeccionar el comportamiento de carga de la página autorizada
Utilice Developer Tools → Network → Fetch/XHR para ver si el campo se carga por separado, y Elements para inspeccionar su evidencia renderizada. Mantenga la inspección observacional a menos que su acuerdo permita el método de recolección específico. Evite copiar un punto final de búsqueda interno de un tutorial de terceros como una interfaz de editor soportada.
[Captura de pantalla: El enlace de la API oficial de Working Nomads y una página de detalle aprobada con el campo de enriquecimiento visible.]
Paso 3: Registrar el resultado del enriquecimiento
Almacene una URL de fuente, texto de evidencia, hora de extracción y estado para el campo adicional. Mantenga un campo ausente distinto de una solicitud fallida. Esto evita que un problema temporal del navegador elimine información obtenida de una lectura de feed exitosa.
Método 3: Añadir recolección administrada con Nstdata Crawl
Paso 1: Configurar una muestra permitida
Abra el Crawl Playground, elija una URL de página aprobada y compare Markdown con la salida HTML. Añada renderizado de JavaScript cuando el contenido necesario falte en el documento inicial. Comience con una sola página antes de habilitar la recolección recursiva.
Paso 2: Conectar el cliente documentado
Instale nstdata-ai-crawl, luego configure NSTDATA_API_TOKEN y APPROVED_PAGE_URL en su entorno local. El ejemplo requiere su propio token y derechos de acceso; es una configuración documentada, no evidencia de una extracción autenticada de Working Nomads durante la preparación de este artículo.
import os
from pathlib import Path
from nstdata_ai_crawl import NstDataClient, ScrapeRequestDto
token = os.environ["NSTDATA_API_TOKEN"]url = os.environ["APPROVED_PAGE_URL"]with NstDataClient(token)as client: result = client.submit_scrape_task_sync(ScrapeRequestDto( url=url, formats=["markdown"], onlyMainContent=True, timeout=60000))if result.success isnotTrueor result.status !="completed":raise RuntimeError("Page retrieval was not completed successfully")if result.data isNoneor result.data.truncated isTrue:raise RuntimeError("Missing or partial content requires review") text = result.data.get_markdown()ifnot text ornot text.strip():raise RuntimeError("No usable Markdown returned") Path("page.md").write_text(text, encoding="utf-8")print("Saved page.md; validate its content before downstream use")
Paso 3: Aplicar las mismas reglas de aceptación de trabajos
Requiera un resultado de página completado y contenido no vacío, luego valide la identidad del trabajo y los campos requeridos. Una página renderizada aún puede ser un mensaje de inicio de sesión o un listado expirado. Mantenga su estado de recuperación separado de si un registro de trabajo fue aceptado.
¿Dónde encaja Nstdata Crawl en un pipeline de trabajos de múltiples fuentes?
Nstdata Crawl encaja donde un pipeline aprobado necesita recuperación de páginas y limpieza a través de fuentes con diferentes capas de presentación. Es una API de rastreo web para datos listos para LLM que suministra la etapa de recolección antes de su esquema de trabajo. El descubrimiento y el rastreo recursivo pueden seguir enlaces permitidos dentro de los límites de página y profundidad. El renderizado de JavaScript y la conversión de salida reducen la necesidad de mantener esos componentes por separado. El producto no resuelve empleadores duplicados, determina la autorización de trabajo o concede derechos de redistribución.
Formatos para diferentes consumidores: Use Markdown para resúmenes de trabajos fundamentados, HTML para inspección de analizadores y enlaces para descubrimiento. JSON, PDF y artefactos visuales pueden apoyar otros requisitos de revisión y archivo.
Opción de proxy integrada: Las solicitudes gestionadas estándar pueden heredar la infraestructura de proxy de Nstdata sin configuración separada de host proxy, puerto, nombre de usuario y contraseña. Tenga en cuenta el uso del proxy bajo el modelo de facturación actual.
Colección controlada: Mantenga un límite pequeño de páginas y una lista de rutas aprobadas, preserve los IDs de tareas y diagnostique errores antes de volver a enviar. Un rastreo más grande debería seguir una tasa de aceptación medida en lugar de un objetivo de concurrencia arbitrario.
¿Por qué cambian inesperadamente los conteos de trabajos o ubicaciones?
Los conteos de trabajos y las etiquetas de ubicación cambian cuando el editor actualiza su feed, se mueve la ventana de origen o cambia una regla de normalización. Realice un seguimiento de estas posibilidades por separado antes de concluir que el mercado laboral cambió.
Síntoma
Causa probable
Respuesta
El conteo de trabajos disminuye drásticamente
Se cambió la ventana de feed o el comportamiento de acceso
Compare la forma de la respuesta y mantenga la última instantánea aceptada
Aparecen trabajos duplicados
Variantes de URL o importaciones repetidas
Use la identidad específica de la fuente y una operación de upsert
Los roles remotos se clasifican como globales
Se descartó el texto de ubicación
Preserve las restricciones en bruto y revise el clasificador
Las etiquetas se convierten en una cadena larga
Cambió la suposición del tipo de entrada
Valide el tipo de fuente y normalice deliberadamente
La descripción está en blanco después de renderizar
Campo faltante o página inesperada
Inspeccione el HTML y el estado de la página antes de volver a intentarlo
Utilice la interfaz JSON de Python para analizar la respuesta y agregue verificaciones explícitas de aplicación para tipos de objetos esperados. La decodificación exitosa de JSON por sí sola no dice nada sobre si el documento contiene trabajos.
¿Cómo debería mantener el conjunto de datos a lo largo del tiempo?
Mantenga el conjunto de datos con claves de fuente estables, observaciones con marca de tiempo y estados de frescura explícitos. Evite marcar un rol como cerrado simplemente porque desaparece de una respuesta de feed. Si su producto requiere confirmación, defina una política de re-chequeo permitida y mantenga registros inciertos fuera de las recomendaciones de “actualmente contratando”.
Comience con el endpoint público y una pequeña muestra revisada manualmente, luego agregue solo el enriquecimiento necesario. Utilice controles de paginación y descubrimiento cuando su alcance aprobado crezca. La salida HTML alternativa de Nstdata puede ayudar a diagnosticar desajustes de contenido antes de que afecten las recomendaciones de trabajos.
P: ¿Working Nomads expone un endpoint de datos público?
Su página de trabajos actualmente enlaza a un endpoint de API que devolvió un array JSON durante la investigación. Revise el enlace de origen, los términos y la forma de respuesta antes de confiar en él.
P: ¿La respuesta prueba una cobertura completa de trabajos?
No. La respuesta observada no establece la completitud histórica o un contrato de paginación documentado. Describa la cobertura de acuerdo a lo que realmente recopila.
P: ¿Necesito un navegador para el colector demostrado?
No. El ejemplo de respuesta única utiliza la biblioteca estándar de Python. El renderizado en navegador es relevante solo para contenido adicional de página aprobado.
P: ¿Puede un modelo de IA llenar las regiones de contratación faltantes?
Un modelo de IA no debería inventar hechos de elegibilidad faltantes. Mantenga el campo desconocido a menos que tenga evidencia de la fuente y una derivación revisable.
P: ¿Qué debería monitorear después del despliegue?
Monitoree trabajos aceptados, campos faltantes, IDs duplicados, cambios en el esquema de respuesta, errores de recolección y la edad del registro. Estos revelan diferentes modos de falla que una métrica de éxito de solicitud oculta.
Lena Zhou
Nov. 9th 2026
Descubre Nstproxy Crawl - Empieza Tu Prueba Gratuita Hoy
Rastrea sitios web completos con una sola solicitud API
Convierte cualquier sitio web en Markdown, HTML, JSON, enlaces, PDF y más, sin gestionar infraestructura de rastreo.
99,8% de éxito con renderizado JavaScript
Obtén datos limpios, listos para LLM, en múltiples formatos