Skip to main content
Glama

JD-PULL · JD 爬取 · 分析 · MCP 工具

Python 3.10+ License: MIT MCP Tests

Ein Open-Source-Tool für JD-Crawling + Regelanalyse + Stellenprofile + MCP-Server. Jeder kann es lokal klonen, eigene Daten crawlen und analysieren und die Daten über MCP (Model Context Protocol) an jede MCP-fähige externe KI wie Claude / DeepSeek agent / Pi agent / Cursor usw. bereitstellen.

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

Die Crawl-Ergebnisse existieren nur in deinem lokalen data/-Verzeichnis oder in einem von dir selbst festgelegten Daten-Repository.

Funktionen

  • JD-Crawling: 51job (Playwright mit echtem Browser, standardmäßig systemeigenes Edge) mit niedriger Frequenz und höflichem Abruf; Boss直聘 / 拉勾 / 猎聘 reservierte Schnittstellen (Login/Signatur erforderlich, in dieser Version nicht implementiert);

  • Regelanalyse: Einordnung von JDs in Stellenkategorien anhand von Klassifikationswörterbüchern, Extraktion von häufigen Skill- und Verantwortungsbegriffen;

  • LLM-Feinanalyse (optional, Multi-Anbieter): Claude / OpenAI / Gemini / DeepSeek / Qwen / Ollama – sechs Anbieter, automatische Anpassung an die strukturierte Ausgabe der jeweiligen Anbieter über eine „Fähigkeitsleiter";

  • Stellenprofile: Generierung von Skill-/Gehalts-/Erfahrungs-/Bildungsverteilungen und Berichten zu häufigen Verantwortungsbegriffen pro Kategorie (JSON + Markdown);

  • MCP-Server: stdio- und streamable-http-Dualtransport, schreibgeschützte Abfragetools immer verfügbar, Schreib-Tools standardmäßig aktiviert (--no-write-tools deaktiviert), HTTP optional mit Bearer-Token-Authentifizierung;

  • Daten vollständig lokal: JD_DATA_DIR kann auf ein beliebiges Verzeichnis oder Git-Repository zeigen; wenn das Datenverzeichnis kein eigenständiges Git-Repository ist, wird sync automatisch übersprungen, um zu verhindern, dass Daten versehentlich committet werden.

Related MCP server: MCP Job Search Server

Technologie-Stack

Kategorie

Technologie

Sprache

Python ≥ 3.10

Crawling

httpx + BeautifulSoup4 (statisches Parsing); Playwright mit echtem Browser (51job SPA, standardmäßig systemeigenes Edge channel=msedge, kein Chromium-Download erforderlich)

Analyse

jieba-Tokenisierung + Regelwörterbuch-Klassifikation; LLM-Feinanalyse über anthropic SDK / httpx Multi-Anbieter-Adapter

Daten

Lokale JSON-Dateispeicherung; Fingerabdruck-Deduplizierung (dedup); Verzeichnisstruktur raw → classified → reports → site

Ausgabe

Statische HTML-Berichtsseite (Inline-CSS, keine Frontend-Framework-Abhängigkeit)

MCP

mcp>=1.26 (FastMCP) · stdio + streamable-http Dualtransport · Pydantic v2 Datenvalidierung

Konfiguration

YAML (PyYAML), Sites/Wörterbücher/LLM vollständig konfigurierbar ohne Codeänderung

Tests

pytest (51 Testfälle)

Sites

51job (aktuell aktiviert); Boss直聘 / 拉勾 / 猎聘 (reserviert, nicht implementiert)

Installation

Erfordert 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

Schnellstart (erst Daten haben)

Jobbörsen haben üblicherweise Anti-Crawling-Schutzmaßnahmen. Bitte halte die Frequenz niedrig, verwende einen echten Browser und crawle nur nach tatsächlichem Bedarf; stoppe, wenn du blockiert wirst, und versuche nicht, die Schutzmaßnahmen zu umgehen.

# 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

Daten werden standardmäßig im Repository-Stammverzeichnis data/ geschrieben (durch .gitignore ausgeschlossen, wird nicht ins Repository committet).

Verwendung als MCP-Server

Nach dem Start kann externe KI über MCP auf deine Daten zugreifen.

# 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

Bearbeite 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, command ausfüllen:

jd-mcp --transport stdio

MCP-Toolübersicht

Typ

Tool

Beschreibung

Schreibgeschützt

get_stats

Datenzusammenfassung (Gesamtzahl / Kategoriezählung)

Schreibgeschützt

list_categories

Stellenkategorien und deren Stichprobenanzahl auflisten

Schreibgeschützt

search_jobs

JDs nach Schlüsselwort / Kategorie / Stadt / Unternehmen durchsuchen (gibt Titel, Gehalt, Skills usw. zurück)

Schreibgeschützt

get_job

Einzelnen vollständigen JD-Datensatz per job_id abrufen

Schreibgeschützt

get_portrait

Profilbericht einer Kategorie (JSON)

Schreibgeschützt

get_portrait_markdown

Profilbericht einer Kategorie (Markdown)

Schreiben

crawl_jobs

Lokal JDs crawlen (erfordert Playwright / Browser); gibt strukturiertes Ergebnis {added, elapsed_s, per_site, warnings} zurück, Übergabe von _meta.progressToken ermöglicht Empfang von Fortschrittsbenachrichtigungen pro Aufgabe

Schreiben

run_analysis

Regelanalyse (optional mit LLM-Feinanalyse)

Schreiben

run_portrait

Profilberichte für alle Kategorien generieren

Schreiben

build_site

Statische HTML-Berichtsseite generieren

Schreiben

sync_data

Datenverzeichnis in dessen Git-Repository committen / pushen

Zusätzlich registrierte schreibgeschützte Resources: jd://stats, jd://portrait/{category}.

HTTP-Bereitstellung und Authentifizierung

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

Client verbindet sich mit http://127.0.0.1:8000/mcp, Request-Header mit Authorization: Bearer deinToken. Für die Produktion empfiehlt sich die Bereitstellung hinter einem Reverse-Proxy (Nginx / Caddy) mit aktiviertem TLS; den öffentlichen Klartext-Port nicht direkt freigeben.

Datenverzeichnis und Git-Synchronisierung

Das Datenwurzelverzeichnis wird über die Umgebungsvariable JD_DATA_DIR festgelegt, Standard: <Repository-Stamm>/data (gitignored):

Umgebungsvariable

Funktion

JD_DATA_DIR

Datenwurzelverzeichnis; kann ein normaler Ordner oder ein eigenständiges Git-Repository sein

JD_DATA_REPO

Überschreibt die Ziel-Repository-URL für sync/push (wenn nicht angegeben, wird origin des Daten-Repositories verwendet)

JD_GIT_TOKEN

HTTPS-eingebettetes Token, nur für diesen push verwendet (wird nicht in die Git-Konfiguration geschrieben)

Logik von sync_data / jdcollector sync:

  • Datenverzeichnis kein Git-Repository → nur lokal speichern, Git überspringen;

  • Datenverzeichnis in einem anderen Repository eingebettet (z. B. ./data im Tool-Repository selbst) → Git überspringen, um zu verhindern, dass Daten in ein öffentliches Repository committet werden;

  • Datenverzeichnis ist ein eigenständiges Git-Repository → add → commit → pull --rebase → push.

Beispiel: Daten in privatem GitHub-Repository

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

LLM-Multi-Anbieter-Feinanalyse

llm:-Abschnitt in config/settings.yaml:

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

Anbieter

provider

Umgebungsvariable

Standardmodell

Fähigkeitsstufe

Anthropic Claude

claude

ANTHROPIC_API_KEY

claude-sonnet-5

L3 Schema strikt

OpenAI

openai

OPENAI_API_KEY

gpt-4o

L3 Schema strikt

Google Gemini

gemini

GEMINI_API_KEY

gemini-2.5-flash

L3 Schema strikt

DeepSeek

deepseek

DEEPSEEK_API_KEY

deepseek-chat

L2 JSON-Modus

通义千问

qwen

DASHSCOPE_API_KEY

qwen-plus

L2 JSON-Modus

Ollama (lokal)

ollama

keine

qwen2.5:7b

L2 JSON-Modus

Fähigkeitsleiter: Einheitliche LlmClient-Abstraktion, automatische Auswahl der strukturierten Ausgabeform basierend auf den Fähigkeiten des Anbieters – L3 verwendet den nativen Schema-Strict-Modus des jeweiligen Anbieters (Claude output_config / OpenAI response_format.json_schema / Gemini response_schema), L2 verwendet den JSON-Modus (DeepSeek / Qwen response_format.json_object, Ollama format:"json"), L1 reiner Prompt als Fallback; bei Fehlschlag der aktuellen Stufe automatische Herabstufung. Die Ausgabe wird einheitlich über Pydantic validiert, bei fehlenden / ungültigen Werten wird mit Fehlerfeedback einmal wiederholt, bei erneutem Fehlschlag Rückfall auf Regel-Ergebnisse, ohne den Prozess zu unterbrechen.

Bei provider: claude überschreiben die Top-Level-model / api_key_env weiterhin abwärtskompatibel die Voreinstellungen; für andere Anbieter bitte unter llm.providers.<name> konfigurieren (Bedeutung der Felder siehe Kommentare in der Datei).

Projektstruktur

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 单元测试

Haftungsausschluss (Disclaimer)

⚠️ Bitte lies die folgenden Bedingungen vor der Verwendung dieses Projekts sorgfältig.

  1. Nutzungsbeschränkung: Dieses Projekt dient ausschließlich dem persönlichen Lernen, der Datenanalyse und dem technischen Austausch, stellt keine kommerzielle Nutzung dar und ist keine Grundlage für Bewerbungs- / Einstellungsentscheidungen.

  2. Daten werden vom Nutzer selbst bereitgestellt und verantwortet: Das Crawling erfolgt auf deinem eigenen Rechner, die volle Verantwortung für die Datenkonformität liegt beim Nutzer. Bitte beachte die Nutzungsbedingungen und robots.txt der Ziel-Websites sowie die lokalen Gesetze und Vorschriften (z. B. das chinesische Gesetz zum Schutz personenbezogener Informationen, das Datensicherheitsgesetz, das Gesetz gegen unlauteren Wettbewerb).

  3. Crawling-Grenzen: Es werden nur öffentliche Seiten gecrawlt; keine Login-pflichtigen, nicht-öffentlichen personenbezogenen Daten; keine Captchas umgehen, kein WAF / keine Sperren umgehen, keine Proxy-Pools oder massenhafte Erfassung verwenden, den normalen Betrieb der Ziel-Websites in keiner Weise stören. Bei Blockierung sofort stoppen, niemals die Gegenmaßnahmen eskalieren.

  4. Datengenauigkeit: JD-Inhalte sind öffentliche Informationen der Websites, können veraltet oder ungenau sein; der Autor garantiert nicht deren Richtigkeit, Vollständigkeit oder Verwendbarkeit; die integrierten seed-Beispieldaten dienen nur zur Verifizierung der gesamten Kette und stellen keine echten Stelleninformationen dar.

  5. KI-Ausgaben nur als Referenz: LLM-Feinanalyse / Profil-Schlussfolgerungen werden von Drittanbieter-Modellen generiert und können Abweichungen aufweisen; bitte nach manueller Prüfung verwenden.

  6. Risiko auf eigene Verantwortung: Dieses Projekt wird unter der MIT-Lizenz als Open Source bereitgestellt; der Autor übernimmt keine Haftung für direkte oder indirekte Verluste, Datenlecks oder rechtliche Risiken, die durch die Nutzung dieses Projekts entstehen.

License

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