跳到主要内容

Sweepy 开发者参考

Sweepy 是一个小型 Python 项目,引擎结构扁平。本页把每个流水线阶段对应到执行它的模块,便于你确定改动位置。

读者对象​

如果你计划修改 Sweepy 代码或新增职位源,请阅读本页。评审者也可用它快速了解拉取请求。本页只涉及内部实现:模块、依赖和 Python 版本。

提示

若只想运行扫描,可跳过本页。请从安装开始。

流水线阶段与模块​

swee.py 按顺序执行五个阶段。终端以 [1/5] 至 [5/5] 打印各阶段。

阶段模块作用
1. 加载配置文件engine/config.py加载并校验 YAML 配置文件。同一模块中的向导负责写入配置文件。
2. 发现职位engine/discovery.py通过 python-jobspy 查询聚合职位源,并对各平台分类。
2. 发现职位engine/sources/从公开端点获取 Greenhouse、Ashby、Lever、Workable 和 Built In NYC 招聘网站。
2. 去重swee.py把聚合器与各源的结果合并为每个职位链接一张卡片。
3. 验证 URLengine/validator.py用 HTTP HEAD 请求并在必要时回退到 GET 检查每个链接,剔除失效职位。
4. 简历评分engine/scorer.py提取职位与简历词条,按任职要求和关键词计算重合度,并标记需要书面应答的职位。
5. 分配简历轨道engine/enrich.py选择词条重合度最高的轨道,并赋予对应的徽标颜色。
5. 丰富卡片engine/enrich.py生成卡片摘要、薪资行和定制建议文本。
5. 默认卡片 PDFengine/report.py渲染卡片版式,默认每页六张卡片,并返回页数。
5. 旧版表格 PDFengine/pdf_builder.py当配置文件设置 report.style: legacy 时渲染表格版式。
5. 数据导出engine/exporter.py写出 CSV 和 JSON 文件,并可按需栅格化 PNG 页面图片。
5. 求职跟踪engine/tracking.py添加跟踪列,并读取此前的导出文件,使你填写的内容得以延续。

engine/session.py 保存有状态模型上下文协议(MCP)流程的卡片存储。它用线程安全的映射保存卡片,索引为每个职位链接的稳定哈希。

改动位置​

你想改动从何处入手
某个职位源或其端点engine/sources/,以及在 data/sources/ 中的种子列表
匹配的评分方式engine/scorer.py
卡片显示的内容engine/enrich.py,然后是 engine/report.py
链接的检查方式engine/validator.py
某个命令行参数swee.py
某个 MCP 工具server.py
提示

server.py 导入的引擎模块与命令行工具相同。任何引擎改动后都要测试 MCP 路径,因为一处修复会影响两个入口。

模块参考​

入口​

模块用途
swee.py五阶段流水线的主编排器及 argparse 命令行入口。
server.py模型上下文协议(stdio)服务器,向 AI 助手提供引擎工具。

引擎模块​

模块用途
engine/config.py交互式向导以及 YAML 加载与校验。
engine/discovery.pypython-jobspy 与确定性源的抓取编排、申请人跟踪系统(ATS)识别以及去重。
engine/validator.py链接可用性检查,含 soft-404 检测。无法验证的链接保留在本轮运行中。
engine/scorer.py简历词条提取、百分比匹配、标记以及按轨道评分。
engine/enrich.py卡片丰富,包括摘要、薪资、轨道分配和定制建议。
engine/session.py线程安全的卡片存储,为有状态 MCP 流程提供稳定 ID。
engine/report.py默认卡片版式 PDF。
engine/pdf_builder.py用于 report.style: legacy 的旧版表格版式 PDF。
engine/exporter.pyCSV 与 JSON 导出,以及报告 PDF 的 PNG 栅格化。
engine/tracking.py跟踪列,以及此前导出文件的延续读取。
engine/docx.py用 python-docx 和 reportlab 将 DOCX 转换为 PDF,并含 Microsoft Word 回退。
engine/documents.py--convert 与 MCP 转换器的文档分派,涵盖 DOCX、DOC、文本、Markdown 和 PDF。
engine/logging.pylogs/ 下可选的调试日志。
engine/cache.py按查询和引擎集合索引的 SQLite 抓取缓存,生存时间为一小时。
engine/circuit_breaker.py统计连续源错误,并在冷却期内暂停调用。
engine/engine_defaults.py共享的默认网站列表与引擎设置,保持无导入以避免循环。
engine/engines.py可选 hirehunt、openroles、apify 和 jobdrop 引擎的适配器注册表与安装器。
engine/history.py已报告职位的持久记录。每日扫描只报告新职位。
engine/normalize.py将引擎原始行规范化为共享职位列。
engine/salary.py招聘网站未提供结构化薪资时,从职位文本提取薪资。
engine/sweep_config.py把共享引擎默认值应用到配置文件设置。
engine/updater.py针对代码检出目录的基于 Git 的更新检查与依赖重装。

确定性源​

模块用途
engine/sources/__init__.py抓取器导出以及从 data/sources/ 加载种子列表。
engine/sources/_common.pyHTTP 标头、标题预筛选和 HTML 转文本的共享辅助函数。
engine/sources/greenhouse.pyGreenhouse 招聘网站抓取器。
engine/sources/ashby.pyAshby 招聘网站抓取器。
engine/sources/lever.pyLever 职位抓取器。
engine/sources/workable.pyWorkable 组件 API 抓取器。
engine/sources/builtinnyc.pyBuilt In NYC 分类抓取器。

引擎适配器​

模块用途
engine/adapters/__init__.py把每个引擎名称映射到其适配器的注册表。
engine/adapters/base.pyScraperAdapter 基类、共享 User-Agent 标头以及结果结构辅助函数。
engine/adapters/jobspy_adapter.py面向 LinkedIn、Indeed、Glassdoor 和 ZipRecruiter 的 python-jobspy 聚合适配器。
engine/adapters/ats_adapter.py覆盖 engine/sources/ 中确定性 ATS 抓取器的适配器。
engine/adapters/hirehunt_adapter.py可选 hirehunt 引擎适配器。
engine/adapters/openroles_adapter.py可选 openroles 引擎适配器。
engine/adapters/apify_adapter.py可选 Apify actor 适配器。
engine/adapters/jobdrop_adapter.py可选 jobdrop 引擎适配器。

数据、脚本与测试​

路径用途
data/sources/*.txt招聘网站、公司、组织和分类的种子列表。
scripts/make_sample.py构建存放在 docs/ 中的示例报告。
tests/pytest 测试套件,每个领域一个文件:adapters、config、documents、docx、engines、enrich、history、logging 和 report。其余文件覆盖 salary、scorer、server、session、sources、swee、tracking、updater 和 validator。
备注

改动 discovery.py、exporter.py 或 pdf_builder.py 时,请新增专用测试文件,并放在 tests/ 中。

依赖​

运行时包来自 requirements.txt。下列版本与该文件一致。

包版本为 Sweepy 提供的功能
reportlab5.0.1生成带可点击链接的样式化 PDF 报告。
pymupdf1.28.2从简历 PDF 提取文本并栅格化 PNG 导出。
python-docx1.2.0读取 .docx 简历,并在没有 Word 的情况下把 DOCX 文本重建为 PDF。
requests2.32.5访问 ATS 端点并检查每个职位链接是否有响应。
beautifulsoup44.15.0解析 Greenhouse、Lever、Workable 和 Built In NYC 源的 HTML。
pyyaml6.0.3读写 YAML 配置文件。
questionary2.1.1驱动向导的交互式问题。
prompt-toolkit3.0.53驱动向导的交互式文本输入。
python-jobspy1.2.0无需 API 凭据抓取 LinkedIn、Indeed、Glassdoor 和 ZipRecruiter。
pandas2.2.3组织职位数据并生成 CSV 与 JSON 导出文件。
mcp1.30.0运行模型上下文协议服务器。
anyio4.12.1运行异步 MCP 传输。

requirements.txt 还列出一个可选包。需要由 Word 生成 PDF 时,取消对 docx2pdf 的注释。

  • docx2pdf(0.5.2,可选)在 Windows 上通过 Microsoft Word 将 DOCX 渲染为 PDF。只要机器上存在 Microsoft Word,Sweepy 就会调用它。
备注

mcp 有意保持在 1.x。2.x SDK 只服务 2026-07-28 协议时代。先探测 server/discover、随后回退到 initialize 握手的客户端会收到 -32022 错误。VS Code Copilot 会走这条回退路径。

提示

pandas 有意保持在 2.x。Pandas 3.x 需要 Python 3.11 或更高版本,而 CI 矩阵仍在测试 Python 3.10。

开发包(requirements-dev.txt)​

包版本作用
pytest9.1.1运行 tests/ 中的测试套件。
pytest-cov7.1.0报告 swee.py、server.py 和 engine/scorer.py 的覆盖率。
ruff0.17.0检查代码并排序导入。
tomli2.2.1为 Python 3.10 的测试运行提供 tomllib。
终端
pip install -r requirements.txt
pip install -r requirements-dev.txt
ruff check .
pytest -q

环境要求与受支持的 Python 版本​

项目说明
Python 下限Sweepy 需要 Python 3.10 或更高版本,所有模块都面向 3.10 语法。
测试范围.github/workflows/ci.yml 中的 CI 工作流在 Ubuntu 上运行 Python 3.10、3.11 和 3.12。
Lint 目标pyproject.toml 设置 ruff 的 target-version = "py310"。仅适用于更高版本的写法会导致 lint 作业失败。
行长度Ruff 强制 100 字符行宽上限,并忽略 E501。
CI 步骤该作业安装两个依赖文件,并在 pytest 之前运行 ruff check .。
备注

pyproject.toml 声明 requires-python = ">=3.10",因此 pip 在安装时拒绝更旧的解释器。CI 矩阵和 ruff 目标定义了测试范围。Python 3.13 实际可用,但仍在该范围之外。

Python 3.13

没有预编译 wheel 时,pymupdf 包可能从源码编译。安装依赖前,请先安装 Microsoft C++ Build Tools 并选择 “Desktop development with C++” 工作负载。

仓库结构​

仓库结构
swee.py CLI 入口点与扫描编排器
server.py 基于 stdio 的 MCP 服务器
engine/ 流水线模块
engine/sources/ 确定性的 ATS 抓取器
engine/adapters/ 聚合器与可选引擎适配器
data/sources/ 各抓取器的种子列表
profiles/ YAML 搜索配置文件
results/ 生成的 PDF、CSV、JSON 和 PNG 文件
logs/ 可选的调试日志
styles/ 文档的 Vale 样式规则
tests/ pytest 测试套件

在 server.py 中更改工具签名时,请在同一次提交中更新 MCP 工具参考。