Skip to main content
Glama

JD-PULL · 爬取 de JD · Análisis · Herramienta MCP

Python 3.10+ License: MIT MCP Tests

Una herramienta de código abierto de 爬取 de JD de empleo + análisis por reglas + retrato de puestos + servidor MCP. Cualquiera puede clonarla localmente, 爬取 y analizar sus propios datos, y exponerlos a Claude / DeepSeek agent / Pi agent / Cursor o cualquier IA externa compatible con MCP a través de MCP(Model Context Protocol).

┌──────────────────────────┐      ┌──────────────────────────┐
│  外部 AI(任何 MCP 客户端) │ ───► │  本机 jd-mcp 服务器        │
│  Claude / DeepSeek / Pi  │  MCP  │  ┌────────────────────┐  │
│  / Cursor …              │       │  │ 只读查询 · 写操作     │  │
└──────────────────────────┘       │  └────────┬───────────┘  │
                                    └──────────┼───────────────┘
                                               │ 读写
                                    ┌──────────▼───────────────┐
                                    │  你的数据目录(JD_DATA_DIR)│
                                    │  本地文件夹 或 私有 git 仓库 │
                                    └──────────────────────────┘

Los resultados de la 爬取 solo existen en tu directorio local data/ o en el repositorio de datos que tú mismo especifiques.

Características

  • 爬取 de JD:51job(Playwright con navegador real, Edge del sistema por defecto)爬取 cortés de baja frecuencia; interfaces reservadas para Boss直聘 / 拉勾 / 猎聘(requieren inicio de sesión/firma, no implementadas en esta versión);

  • Análisis por reglas:clasifica los JD en categorías de puestos según diccionarios de clasificación, extrae palabras de alta frecuencia de habilidades y responsabilidades;

  • Análisis fino con LLM(opcional, multi-proveedor):seis proveedores — Claude / OpenAI / Gemini / DeepSeek / Qwen / Ollama — con adaptación automática a la salida estructurada de cada uno mediante la «escalera de capacidades»;

  • Retrato de puestos:genera informes de distribución de habilidades / salario / experiencia / formación y palabras de alta frecuencia de responsabilidades por categoría(JSON + Markdown);

  • Servidor MCP:doble transporte stdio y streamable-http, herramientas de solo lectura siempre disponibles, herramientas de escritura habilitadas por defecto(desactivables con --no-write-tools), autenticación opcional por Bearer token en HTTP;

  • Datos completamente locales:JD_DATA_DIR puede apuntar a cualquier directorio o repositorio git; si el directorio de datos no es un repositorio git independiente, sync se omite automáticamente para proteger los datos de confirmaciones accidentales.

Related MCP server: MCP Job Search Server

Stack tecnológico

Categoría

Tecnología

Lenguaje

Python ≥ 3.10

爬取

httpx + BeautifulSoup4(análisis estático); Playwright con navegador real(SPA de 51job, Edge del sistema por defecto channel=msedge, sin descargar chromium)

Análisis

Segmentación jieba + clasificación por diccionario de reglas; análisis fino con LLM vía SDK de anthropic / adaptación multi-proveedor con httpx

Datos

Almacenamiento local en archivos JSON; deduplicación por huella(dedup); estructura de directorios raw → classified → reports → site

Salida

Sitio de informes HTML estático(CSS en línea, sin dependencias de frameworks frontend)

MCP

mcp>=1.26(FastMCP)· doble transporte stdio + streamable-http · validación de datos con Pydantic v2

Configuración

YAML(PyYAML), sitios/diccionarios/LLM totalmente configurables sin modificar código

Pruebas

pytest(51 casos)

Sitios

51job(actualmente habilitado); Boss直聘 / 拉勾 / 猎聘(reservados, no implementados)

Instalación

Requiere Python ≥ 3.10.

git clone https://github.com/NaoYUN77/JD-PULL.git
cd JD-PULL
python -m venv .venv && .venv\Scripts\activate      # Windows;macOS/Linux 用 source .venv/bin/activate
pip install -e .[dev]
# 51job 爬取走真实浏览器(默认系统 Edge,无需额外下载 chromium)
# 若想用捆绑 chromium:删除 config/settings.yaml 中 crawl.browser.channel 一行后
#   playwright install chromium

Inicio rápido(primero tener datos)

Los sitios de empleo suelen tener controles anti-爬取. Mantén una frecuencia baja, usa un navegador real y 爬取 solo lo que necesites; si te bloquean, detente y no intentes evadirlo.

# 1) 生成样本 JD(验证全链路;51job 被 WAF 拦截时用)
jdcollector seed

# 2) 真实爬取(按 config/sites.yaml 的关键词/城市;51job 需本机有 Edge 且有头窗口)
jdcollector crawl

# 3) 规则分析(可选加 LLM 精分,见下文「LLM 多供应商精分」)
jdcollector analyze

# 4) 岗位群像报告
jdcollector portrait

# 5) 静态 HTML 报告站(输出到数据目录 site/)
jdcollector view

Los datos se escriben por defecto en data/ en la raíz del repositorio(ignorado por .gitignore, no se confirma en el repositorio).

Uso como servidor MCP

Una vez iniciado, las IAs externas pueden acceder a tus datos a través de MCP.

# stdio(默认,给本地桌面客户端用)
jd-mcp

# 只读模式(只暴露查询,不暴露爬取/分析等写工具)
jd-mcp --no-write-tools

# HTTP(streamable-http,给远程客户端 / 其它进程用,可带 Bearer token)
jd-mcp --transport http --host 0.0.0.0 --port 8000 --token 你的token

Claude Desktop

Edita claude_desktop_config.json:

{
  "mcpServers": {
    "jdcollector": {
      "command": "jd-mcp",
      "args": ["--transport", "stdio"]
    }
  }
}

Claude Code

claude mcp add jdcollector -- jd-mcp --transport stdio
claude mcp list   # 验证已连接

Cursor

Settings → MCP → + Add global MCP server, y en command escribe:

jd-mcp --transport stdio

Resumen de herramientas MCP

Tipo

Herramienta

Descripción

Solo lectura

get_stats

Estadísticas resumidas de datos(total / recuento por categoría)

Solo lectura

list_categories

Lista las categorías de puestos y su número de muestras

Solo lectura

search_jobs

Busca JD por palabra clave / categoría / ciudad / empresa(devuelve título, salario, habilidades, etc.)

Solo lectura

get_job

Obtiene el registro completo de un JD por job_id

Solo lectura

get_portrait

Informe de retrato de una categoría(JSON)

Solo lectura

get_portrait_markdown

Informe de retrato de una categoría(Markdown)

Escritura

crawl_jobs

爬取 local de JD(requiere Playwright / navegador); devuelve resultado estructurado {added, elapsed_s, per_site, warnings}, acepta _meta.progressToken para recibir notificaciones de progreso por tarea

Escritura

run_analysis

Análisis por reglas(análisis fino con LLM opcional)

Escritura

run_portrait

Genera informes de retrato por categoría

Escritura

build_site

Genera sitio de informes HTML estático

Escritura

sync_data

Confirma / envía el directorio de datos a su repositorio git

También se registran resources de solo lectura: jd://stats、jd://portrait/{category}.

Despliegue HTTP y autenticación

jd-mcp --transport http --host 0.0.0.0 --port 8000 --token 你的token
# 环境变量亦可:JD_MCP_TRANSPORT / JD_MCP_HOST / JD_MCP_PORT / JD_MCP_TOKEN

El cliente se conecta a http://127.0.0.1:8000/mcp con el encabezado Authorization: Bearer 你的token. En producción se recomienda colocarlo detrás de un proxy inverso(Nginx / Caddy)con TLS habilitado; no expongas puertos en texto plano a Internet.

Directorio de datos y sincronización git

El directorio raíz de datos se especifica con la variable de entorno JD_DATA_DIR, por defecto <raíz del repositorio>/data(ignorado por git):

Variable de entorno

Función

JD_DATA_DIR

Directorio raíz de datos; puede ser una carpeta normal o un repositorio git independiente

JD_DATA_REPO

Sobrescribe la URL del repositorio destino para sync/push(si no se indica, usa el origin del repositorio de datos)

JD_GIT_TOKEN

Token incrustado en HTTPS, solo para este push(no se escribe en la configuración de git)

Lógica de decisión de sync_data / jdcollector sync:

  • El directorio de datos no es un repositorio git → solo guardado local, se omite git;

  • El directorio de datos está dentro de otro repositorio(por ejemplo, el ./data del propio repositorio de la herramienta)→ se omite git, para evitar que los datos se confirmen en un repositorio público;

  • El directorio de datos es un repositorio git independiente → add → commit → pull --rebase → push.

Ejemplo: datos en un repositorio privado de GitHub

set JD_DATA_DIR=D:\jd-data
cd D:\jd-data && git init && git remote add origin git@github.com:you/jd-data.git
# 推送时可用
set JD_GIT_TOKEN=ghp_xxx

Análisis fino multi-proveedor con LLM

Sección llm: de config/settings.yaml:

llm:
  enabled: true        # 关闭即纯规则分析
  provider: deepseek   # 选供应商

Proveedor

provider

Variable de entorno

Modelo por defecto

Nivel de capacidad

Anthropic Claude

claude

ANTHROPIC_API_KEY

claude-sonnet-5

L3 schema estricto

OpenAI

openai

OPENAI_API_KEY

gpt-4o

L3 schema estricto

Google Gemini

gemini

GEMINI_API_KEY

gemini-2.5-flash

L3 schema estricto

DeepSeek

deepseek

DEEPSEEK_API_KEY

deepseek-chat

L2 modo JSON

通义千问

qwen

DASHSCOPE_API_KEY

qwen-plus

L2 modo JSON

Ollama(local)

ollama

Ninguna

qwen2.5:7b

L2 modo JSON

Escalera de capacidades:abstracción unificada LlmClient que selecciona automáticamente la forma de salida estructurada según la capacidad del proveedor — L3 usa el modo de schema estricto nativo de cada uno(Claude output_config / OpenAI response_format.json_schema / Gemini response_schema), L2 usa modo JSON(response_format.json_object de DeepSeek / Qwen, format:"json" de Ollama), L1 solo prompt como respaldo; si el nivel actual falla, degrada automáticamente. La salida se valida uniformemente con Pydantic; si faltan campos o son inválidos, reintenta una vez con retroalimentación de error, y si aún falla, vuelve al resultado de reglas sin interrumpir el flujo.

Con provider: claude, los model / api_key_env de nivel superior siguen siendo compatibles hacia atrás y sobrescriben los valores predefinidos; para otros proveedores, configura bajo llm.providers.<name>(el significado de cada campo está en los comentarios del archivo).

Estructura del proyecto

config/            # YAML 配置:settings / sites / categories / skills
src/jdcollector/
  crawler/         # 各站点爬虫
  analysis/        # 规则分类 + llm_client 能力梯子 + llm 精分
  portrait/        # 岗位群像报告
  view/            # 静态 HTML 报告站
  mcp_server.py    # MCP 服务器(工具注册 + CLI 入口)
  sync_github.py   # 数据目录 git 同步(独立仓库保护)
tests/             # pytest 单元测试

⚠️ Por favor, lee atentamente los siguientes términos antes de usar este proyecto.

  1. Restricción de uso:Este proyecto es solo para aprendizaje personal, análisis de datos e intercambio técnico; no constituye uso comercial ni base para decisiones de búsqueda de empleo / contratación.

  2. Los datos son responsabilidad del usuario:La 爬取 ocurre en tu propia máquina, y toda la responsabilidad de cumplimiento normativo de los datos recae en el usuario. Respeta los términos de servicio y robots.txt de los sitios objetivo, así como las leyes y regulaciones locales(como la Ley de Protección de Información Personal, la Ley de Seguridad de Datos y la Ley contra la Competencia Desleal).

  3. Límites de la 爬取:Solo se 爬取 páginas públicas; no se 爬取 información personal que requiera inicio de sesión o no sea pública; no se descifran captchas, no se evaden WAF / bloqueos, no se usan pools de proxies ni recolección a escala, y no se interfiere de ninguna manera con el servicio normal de los sitios objetivo. Si te bloquean, detente y nunca escales las medidas de confrontación.

  4. Precisión de los datos:El contenido de los JD es información pública del sitio y puede estar desactualizado o ser inexacto; el autor no garantiza su veracidad, integridad o disponibilidad; los datos de muestra seed integrados solo sirven para verificar el flujo completo y no representan información real de empleo.

  5. La salida de IA es solo de referencia:El análisis fino con LLM / las conclusiones de retrato son generadas por modelos de terceros y pueden contener sesgos; verifica manualmente antes de usar.

  6. Riesgo asumido por el usuario:Este proyecto se ofrece bajo licencia MIT; el autor no se hace responsable de pérdidas directas o indirectas, filtraciones de datos o riesgos legales derivados del uso de este proyecto.

Licencia

MIT © 2026 NaoYun777

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables searching over 1 million enriched job listings from 20,000+ companies directly from MCP-compatible AI tools. Provides tools for job search, company profiles, and AI-powered similar job recommendations with real-time data updates.
    4
    76 npm
    2
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to scrape job offers and filter them based on user-defined criteria, using MCP resources, prompts, and tools.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server for job search and application tracking, enabling AI agents to search jobs, get details, manage applications, and find contacts across 128K+ jobs and 1,900+ companies.
    849 npm
    3
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI clients to serve as a personal career analyst by searching, matching, and explaining job recommendations, managing job applications, and syncing public job boards through standardized MCP tools.
    MIT