Cómo construir un scraper de We Work Remotely para datos públicos de trabajo
TL;DR
Inicie un scraper de We Work Remotely con el feed RSS público oficial cuando las listas de trabajo recientes sean suficientes.
Preserve la URL original del trabajo y atribuya enlaces a We Work Remotely, como lo solicita su página de feed.
Mantenga la restricción de ubicación de una lista separada del hecho de que el rol es remoto.
Utilice un flujo de trabajo de página de detalles autorizado y limitado solo cuando el feed no proporcione un campo requerido.
Valide los registros antes de publicarlos en un tablón de empleo o suministrarlos a un asistente de IA.
Nstdata Crawl es una API de rastreo web para datos listos para LLM que puede manejar la capa de colección de páginas; la identidad del trabajo y las reglas de elegibilidad siguen siendo responsabilidad de su aplicación.
¿Para Qué Se Usa un Scraper de We Work Remotely?
Un scraper de We Work Remotely convierte listas de trabajo permitidas en registros que un tablero de contratación, un canal de investigación o un asistente de búsqueda de empleo pueden procesar. Un registro útil conecta una restricción de título y ubicación con la lista original, el tiempo de colección y la fuente. Descargar una descripción sin esos campos dificulta identificar roles expirados o explicar por qué un asistente recomendó un trabajo.
La implementación más simple comienza con el feed publicado de la plataforma. Las instrucciones RSS de We Work Remotely oficiales proporcionan un feed general y feeds por categoría, y solicitan atribución de regreso a la fuente. Este es un punto de partida materialmente diferente de adivinar selectores en una página de categoría.
Utilice Nstdata Crawl cuando su flujo de trabajo autorizado también necesite páginas de detalles renderizadas o contenido de otras fuentes permitidas. Mantenga la ingestión del feed y el enriquecimiento de la página como etapas separadas para que un fallo en la renderización no descarte registros de feed de otro modo válidos.
¿Qué Necesita Antes de Recopilar Datos de Trabajo?
Descubre Nstproxy Crawl - Empieza Tu Prueba Gratuita Hoy
Necesita Python, un uso aprobado para los datos, la URL del feed oficial, una ubicación de almacenamiento y una lista explícita de campos requeridos. El ejemplo de feed a continuación utiliza la biblioteca estándar de Python y no requiere una cuenta de WWR ni una suscripción de scraping de terceros. Verifique que su redistribución prevista se ajuste a los requisitos de la fuente antes de convertir el feed en un producto público.
Campo
Significado
Regla de aceptación
source_url
URL original de los detalles del trabajo
Presente, HTTPS, host de origen esperado
source_id
GUID o URL del feed
Estable dentro de esta fuente
title
Título del feed
No vacío; preserve la redacción original
published_at
Marca de tiempo del editor
Mantenga el valor original junto con el tiempo analizado
observed_at
Su marca de tiempo de colección
Marca de tiempo UTC generada durante la ingestión
region
Restricción de contratación declarada
Preserve los valores faltantes en lugar de adivinar
description_html
Descripción del feed
Tratar como contenido de fuente no confiable
No infiera el rango salarial de un empleador, la política de visas o la elegibilidad mundial a partir de la palabra “remoto”. Una descripción puede contener restricciones que el título omite. Mantenga estos campos como anulables hasta que la fuente proporcione texto de apoyo.
¿Cómo Difere el Descubrimiento de Feeds del Scraping de Páginas?
El descubrimiento de feeds obtiene entradas recientes de un documento XML controlado por el editor; el scraping de páginas lee el HTML o documento renderizado de un sitio web. Ambos pueden producir registros de trabajo, pero sus costos de cobertura y mantenimiento difieren. El feed puede ser una fuente de descubrimiento conveniente sin representar un archivo histórico completo.
Durante la investigación de este artículo, el feed general de WWR devolvió elementos RSS con campos que incluyen title, link, guid, pubDate y description. Campos adicionales estaban presentes en la respuesta observada, pero un cliente debería tolerar su ausencia. Una respuesta de feed posterior puede contener un número diferente de entradas, así que nunca codifique de forma rígida el conteo de muestras como una garantía de completitud.
Utilice validación de datos estructurados al mapear campos de origen en su esquema de trabajo. Para un sistema más amplio, distinga recopilación del mercado laboral de clasificación de elegibilidad. La primera proporciona evidencia. La segunda interpreta evidencia y debe retener una razón trazable para cada etiqueta derivada.
¿Cómo Construye el Scraper Paso a Paso?
Construya el scraper obteniendo el feed oficial, normalizando un pequeño conjunto de campos y guardando registros con sus identificadores de origen. Los siguientes métodos representan diferentes necesidades de recolección; son alternativas o etapas secuenciales en lugar de tres formas de forzar el acceso a la misma página.
Método 1: Usar RSS para listados recientes
Paso 1: Guardar el lector del feed
Guarde lo siguiente como wwr_feed.py. El lector limita el tamaño de la respuesta descargada, deduplica IDs y verifica el host de destino antes de aceptar un registro. No asume que el título se puede dividir de manera confiable en campos de empresa y rol.
import json
import urllib.request
import xml.etree.ElementTree as ET
from datetime import datetime, timezone
from urllib.parse import urlsplit
url ="https://weworkremotely.com/remote-jobs.rss"request = urllib.request.Request(url, headers={"User-Agent":"JobFeedReader/1.0"})with urllib.request.urlopen(request, timeout=30)as response: payload = response.read(5_000_001)iflen(payload)>5_000_000:raise RuntimeError("Feed exceeds this reader's size limit")root = ET.fromstring(payload)observed = datetime.now(timezone.utc).isoformat()records, seen =[],set()for item in root.findall("./channel/item"): link =(item.findtext("link")or"").strip() parts = urlsplit(link)if parts.scheme !="https"or parts.hostname !="weworkremotely.com":continue identity =(item.findtext("guid")or link).strip() title =(item.findtext("title")or"").strip()ifnot title or identity in seen:continue seen.add(identity) records.append({"source_id": identity,"source_url": link,"title": title,"published_at": item.findtext("pubDate"),"observed_at": observed,"region": item.findtext("region"),"description_html": item.findtext("description")})ifnot records:raise RuntimeError("No accepted feed records; inspect the response")withopen("wwr-jobs.json","w", encoding="utf-8")as output: json.dump(records, output, ensure_ascii=False, indent=2)print("accepted records:",len(records))
Paso 2: Ejecute el lector
Ejecuta python wwr_feed.py en tu directorio de trabajo. El mismo analizador se utilizó contra la respuesta RSS en vivo durante la preparación de este artículo. Una ejecución exitosa crea un arreglo JSON e informa una cantidad positiva de registros aceptados; el número exacto cambia a medida que el editor actualiza su feed.
Paso 3: Inspeccionar un registro aceptado
Abre wwr-jobs.json y compara el título, la URL y la región de un registro con su listado original. Preserva el enlace de origen original donde sea que muestres un resultado. Si el feed es incompleto para tu propósito, documenta el campo faltante antes de agregar otra etapa de recopilación.
Método 2: Agregar enriquecimiento de página de detalles autorizado
Paso 1: Seleccionar el campo faltante
Elige un campo que el feed realmente carezca, como un tipo de empleo estructurado. Verifica si la página proporciona propiedades JobPosting legibles por máquina antes de escribir un selector visual. Un vocabulario de esquema documenta el significado del campo; no establece que WWR emita cada propiedad en cada página.
Paso 2: Inspeccionar una página de detalles aprobada
Utiliza Developer Tools → Elements para comparar el contenido visible de la página con cualquier script JSON-LD. Registra la ruta de origen del campo y preserva el texto utilizado para derivarlo. No publiques un selector copiado de un antiguo tutorial sin verificar el marcado de hoy.
[Captura de pantalla: Una página de detalles de trabajo aprobada mostrando el texto de la región de contratación y el campo correspondiente del DOM o datos estructurados.]
Paso 3: Almacenar el enriquecimiento por separado
Une el resultado de detalles al registro del feed a través de la URL de origen. Incluye enrichment_status, enriched_at, y una referencia de evidencia a nivel de campo. Un enriquecimiento fallido debe dejar intacto un registro de feed válido y marcar solo el campo adicional como no disponible.
Método 3: Agregar Nstdata Crawl al flujo de trabajo de recopilación
Paso 1: Obtener una configuración de solicitud actual
Abre el Nstdata Crawl Playground desde la página del producto Crawl, ingresa una URL de detalles aprobada, elige Markdown para el procesamiento de texto, e inspecciona la solicitud generada. Configura el renderizado solo cuando el contenido requerido necesite JavaScript. Usa un límite de página y un límite de profundidad para el descubrimiento en lugar de raspar automáticamente toda la bolsa de trabajo.
Paso 2: Conectar el cliente API
Instala nstdata-ai-crawl y configura NSTDATA_API_TOKEN en tu entorno local. El ejemplo administrado incluido a continuación requiere tu propio token y autorización para APPROVED_PAGE_URL; no se ejecutó contra WWR con una credencial de cliente. Los nombres del SDK se verifican contra el paquete oficial actual.
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: Aceptar solo contenido utilizable
Confirma que la tarea se completó, verifica el resultado de la página y compara el texto devuelto con el listado objetivo. Rechaza páginas de desafío, descripciones vacías y salida truncada antes de pasar el contenido a un modelo. Registra un ID de tarea para diagnóstico sin registrar el token de API.
¿Dónde ayuda Nstdata Crawl con los datos de trabajo?
Nstdata Crawl ayuda cuando una tubería de datos de trabajo aprobada necesita recuperación constante de páginas y texto listo para LLM más allá de un feed. Es una API de rastreo web para datos listos para LLM, posicionada entre una lista de URL y tu código de normalización. El descubrimiento de sitios y el rastreo recursivo pueden expandir una semilla permitida dentro de límites explícitos. El renderizado de JavaScript puede recopilar contenido que falta del HTML inicial. El servicio no decide si un candidato cumple con los requisitos de un rol o otorga permiso para republicar una descripción de trabajo.
Elección de salida: Markdown admite resúmenes fundamentados, HTML admite análisis consciente de la fuente, y los enlaces admiten el descubrimiento. JSON, PDF y artefactos visuales sirven a diferentes necesidades de revisión posteriores; solicitar un formato no valida un esquema de trabajo.
Acceso a proxy administrado: La opción de proxy integrada de Nstdata evita un host de proxy, puerto, nombre de usuario y contraseña separados para una solicitud administrada estándar. El tráfico de proxy aún puede afectar el costo; revisa la facturación de Crawl actual.
Operación limitada: Envía primero un trabajo pequeño, preserva IDs y resultados de tareas, y vuelve a intentar solo fallos recuperables. Tu aplicación aún es responsable de la deduplicación, expiración y almacenamiento.
¿Por qué los feeds de trabajo se vuelven obsoletos o producen duplicados?
Los feeds de trabajo se vuelven obsoletos cuando los clientes tratan una ventana de descubrimiento en curso como un inventario completo o confunden observaciones repetidas con nuevas publicaciones. Una entrada de feed que desaparece no prueba que el empleador cerró el rol. Mantén first_seen, last_seen, y un estado de disponibilidad separado para que la incertidumbre siga siendo visible.
Síntoma
Causa probable
Reparación
El mismo rol aparece repetidamente
Cada sondeo crea una nueva fila
Actualiza por GUID de feed o URL de origen canónico
Las recomendaciones “mundiales” están incorrectas
El estado remoto se sustituyó por restricciones de ubicación
Preserva evidencia de región y requiere reglas de elegibilidad explícitas
No hay registros después de una respuesta HTTP exitosa
Documento inesperado, feed cambiado o fallo del analizador
Inspeccionar el tipo de contenido y el elemento raíz; retener el último conjunto de datos válido
Los resúmenes incluyen navegación o instrucciones
El texto fuente fue aceptado sin validación
Restringir la entrada a la descripción del trabajo y aislar contenido no confiable
Utilice la interfaz XML de ElementTree para el análisis de feeds demostrado, pero mantenga un límite de tamaño de respuesta y evite aceptar XML arbitrario enviado por el usuario. Exporte solo los campos que su caso de uso necesita y aplique una política de retención a las descripciones almacenadas.
¿Cómo debería lanzar el pipeline de datos del trabajo?
Lance el pipeline con un pequeño conjunto de datos RSS atribuido, un contrato de campo verificado y una política de actualización explícita. Compare los registros aceptados con el publicador antes de agregar enriquecimiento y mida la tasa de duplicados, la tasa de campos faltantes y la antigüedad del registro. Una descarga exitosa es solo el comienzo de un feed de trabajo confiable.
Para una recolección más amplia, utilice crawling por lotes acotados para separar el descubrimiento de URL del procesamiento de páginas de detalles. Las salidas HTML y visuales de Nstdata pueden apoyar la revisión posterior de fallos de extracción.
P: ¿Puedo colectar trabajos de WWR sin automatización del navegador?
Sí. El feed RSS público oficial puede proporcionar entradas de trabajo recientes sin un navegador sin cabeza. Verifique los requisitos de cobertura y atribución antes de utilizarlo en un producto.
P: ¿Contiene el feed RSS todos los trabajos históricos?
El feed debe tratarse como una ventana de descubrimiento reciente a menos que el publicador documente explícitamente la completitud histórica. Almacene las observaciones permitidas prospectivamente si necesita una serie temporal.
P: ¿Puede Nstdata Crawl garantizar el acceso a cada página de trabajo?
No. Un servicio de recuperación administrado sigue estando sujeto a la disponibilidad del objetivo, restricciones de acceso, comportamiento de renderizado y su autorización.
P: ¿Deben los campos salariales faltantes convertirse en cero?
No. La compensación faltante debe permanecer nula o explícitamente desconocida. Cero sugiere incorrectamente un valor conocido y distorsiona el análisis.
P: ¿Qué prueba que el scraper funciona?
Un scraper en funcionamiento produce registros válidos vinculados a la fuente que concuerdan con una muestra verificada manualmente, preserva el estado de actualización y reporta fallos sin sobrescribir el último conjunto de datos aceptado.
Lena Zhou
Nov. 9th 2026
Rastrea sitios web completos con una sola solicitud API
99,8% de éxito con renderizado JavaScript
Obtén datos limpios, listos para LLM, en múltiples formatos
Convierte cualquier sitio web en Markdown, HTML, JSON, enlaces, PDF y más, sin gestionar infraestructura de rastreo.