如何用 career-ops 的 scan:full 反向遍历 ATS 公司目录,发现 portals.yml 之外的新职位
【免费下载链接】career-opsOpen-source AI job search: scan job portals, evaluate listings into a structured A-H report with a global 1-5 score, tailor your CV, track applications — runs locally in your AI coding CLI (Claude Code, Codex, OpenCode, Antigravity…)项目地址: https://gitcode.com/GitHub_Trending/ca/career-ops
career-ops 的日常扫描入口npm run scan只查你在portals.yml里手工维护的公司列表。如果某家公司从未被你加进这个列表,它的职位就永远不会出现。scan:full(对应 scan-ats-full.mjs)把方向反过来:它遍历 Greenhouse、Lever、Ashby、Workday 的公开 ATS 公司目录,把其中符合你portals.yml里title_filter/location_filter的新鲜职位直接送进流水线,不需要任何手工挑选公司。适合的场景是:你想定期捕获跟踪列表之外、你根本不知道名字的公司的新职位。
前提条件(来自 docs/SCRIPTS.md 的doctor一节):Node.js >= 18、依赖已安装,以及项目所需的cv.md、config/profile.yml、portals.yml三个文件就位。先用npm run doctor验证,退出码0表示检查全部通过。
配置 portals.yml 的过滤条件
scan:full对目录里的每一家公司应用同一个全局title_filter,所以过滤条件配置得是否合理,直接决定反向扫描的信噪比。templates/portals.example.yml 说明了字段含义,首次使用时按注释把它复制成根目录下的portals.yml并修改title_filter.positive为你自己的目标职位关键词。
过滤语义与npm run scan相同:
title_filter:至少 1 个positive命中且negative全部不命中才算通过;location_filter(可选块):作用于标题过滤之后、去重之前;整个块缺省时所有地点都通过;- 黑名单:如果存在
data/blacklist.md,被列出的公司默认跳过并在运行摘要中报告,不会静默丢弃。
反向扫描还有一个专用字段title_filter_overrides(仅scan-ats-full.mjs读取):给个别公司单独放宽标题匹配面。条目按显式 slug 列表匹配(例如 Workday 租户uwaterloo.wd3.myworkdayjobs.com的 slug 就是uwaterloo),其positive_extra关键词是追加到全局positive之上的,全局negative仍然生效;不在列表里的公司完全不受影响。
title_filter_overrides: - companies: ["uwaterloo", "ubc", "fanshawec"] positive_extra: - "Administrator" - "Coordinator" - "Program Administrator"(以上为例,slug 与关键词来自模板注释中的示例,替换为你自己的公司和职位词。)
先预览,再正式运行
所有公司目录数据来自公开的 job-board-aggregator 数据集,缓存在data/cache/中,24 小时过期。没有可用发布日期的职位会被直接跳过——反向扫描只对新发布的职位有意义。
先用--dry-run预览而不写任何文件,确认命中的公司和你预期一致:
node scan-ats-full.mjs --dry-run确认无误后正式运行。默认行为是扫描全部 ATS 目录、取最近 3 天的职位:
npm run scan:full常用参数(来自 docs/SCRIPTS.md):
node scan-ats-full.mjs --since 7 # 扩大时间窗口到最近 7 天 node scan-ats-full.mjs --ats greenhouse,workday # 只扫指定 ATS 源 node scan-ats-full.mjs --limit 200 # 每个 ATS 最多扫 200 家公司 node scan-ats-full.mjs --liveness # 命中项先用 Playwright 验证仍在招聘 node scan-ats-full.mjs --include-blacklisted # 审计黑名单公司而非跳过 node scan-ats-full.mjs --md-out notes/scans # 额外写一份带日期的 markdown 摘要其余可选标志:--verbose、--json、--include-undated(不再跳过无日期职位)、--shuffle。
验证结果
判断一次运行是否成功,看三处:
- 退出码:
0表示扫描完成;1表示配置错误(找不到portals.yml、传了未知的--ats源)或致命扫描错误。 - 输出落盘:新命中的职位会以与
scan.mjs相同的格式追加到data/pipeline.md和data/scan-history.tsv。这两个文件就是"发现了新职位"的直接证据;重复职位由扫描历史去重,不会反复出现。 - 运行摘要:黑名单命中的公司会以
N skipped (blacklist)形式报告,不会静默丢弃。若用了--md-out notes/scans,还会额外生成一份带日期的 markdown 摘要,方便留档对比每次运行发现了什么。
如果某条命中的职位看起来和已有流水线里的职位高度雷同(同一家职位被雇主和招聘代理各发一次),运行会打印 cross-listing 警告(基于 JD 文本的 64 位 SimHash 指纹,相似且 90 天内出现的不同公司配对)。这是只警告不丢弃:确认其中一方是代理后,只通过一个渠道投递,避免双向重复申请。
可选分支:用 VC 投资组合做起点
seeds/README.md 提供了另一条高信号路径:不从 ATS 目录遍历,而是拉取 Y Combinator / a16z 的公开投资组合公司列表,逐家探测其 ATS:
npm run scan:seeds # 等价于 --seeds yc,a16z npm run scan:yc # 仅 YC node scan-ats-full.mjs --seeds yc --since 7 node scan-ats-full.mjs --seeds yc --ats greenhouse,lever --since 5 # 种子 + 常规目录组合种子公司与目录遍历走同一套title_filter/location_filter/ 去重流程,结果同样进data/pipeline.md。
限制与排障
DNS 限速:完整扫一遍 Workday + iCIMS 要解析 13,889 个不同的租户主机名,文档给出这个遍历大约需要 35 分钟(DNS 受限)。未缓存的解析默认限速 400 次/分钟。如果你的本机解析器(如 Pi-hole)预算更充足,可以提高上限;反过来,如果某个 ATS 段落批量出现
fetch failed,先怀疑解析器的限速而不是各公司职位板本身:CAREER_OPS_DNS_LOOKUPS_PER_MIN=800 npm run scan:full # 提高上限 CAREER_OPS_DNS_LOOKUPS_PER_MIN=0 npm run scan:full # 关闭限速 CAREER_OPS_NO_DNS_CACHE=1 npm run scan:full # 同时禁用 DNS 缓存与限速数据集是缓存的:公司目录在
data/cache/中缓存 24 小时,同一天内多次运行看到的是同一份公司清单。--liveness需要浏览器:它会用 Playwright 真实加载页面验证职位仍然有效;若报错,文档要求先执行npx playwright install chromium。
运行结束后,把data/pipeline.md里新出现的行逐条走后续的评估流程即可;如果发现某家公司值得长期跟踪,把它加入portals.yml,之后日常npm run scan就会覆盖它。
【免费下载链接】career-opsOpen-source AI job search: scan job portals, evaluate listings into a structured A-H report with a global 1-5 score, tailor your CV, track applications — runs locally in your AI coding CLI (Claude Code, Codex, OpenCode, Antigravity…)项目地址: https://gitcode.com/GitHub_Trending/ca/career-ops
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考