Job Scraper — 本地运行的职位搜寻技能
在你的机器上自动搜索多个招聘门户网站的新职位,去重后按匹配度排序呈现,让职位搜寻不再靠手动刷站。
权限清单明确限定(bun 运行已安装 CLI、job_key.py、WebFetch/WebSearch),健康检查只能编辑 enabled 开关且需用户确认,Step 4.5 明确禁止抓取 LinkedIn 人员页,危险请求有边界;SECURITY.md 与 CI security-guards 支持最小权限与数据边界声明。扣分:指令级防御非沙箱(文档自认),代理会向多个海外门户发起网络请求,写入 seen_jobs./tracker 无显式回滚机制,发布者未经验证。未达满分。
指令高度自洽:bun 不可用有 WebSearch 降级、CLI 失败记录后继续、客户端日期兜底过滤、URL 有效性规则、closed-at-source 检测等失败路径详尽;配套 CLI 有 fixture 测试。扣分:SKILL.md 编排本身为静态阅读未经执行复现,依赖 search-queries.md 中大量占位符需用户正确配置,多代理并行与跨文件状态一致性无法在静态下验证。
触发词、可选参数(focus/broad/health)明确,场景清晰,模板化支持本地化门户。扣分:核心搜索依赖 LinkedIn/Google/WebSearch 等海外服务,对中国大陆网络可达性差;语言范围由 CLAUDE.md 配置但仓库本身无中文支持声明;边界(非职位搜索输入)未显式声明。
文档分层清晰(SKILL.md + search-queries.md),MIT 许可、CI 版本守卫(check_framework_version)、上游更新工具与安全报告渠道齐全,已知限制披露充分。扣分:skill 本身无独立版本号/变更日志,依赖外部约定(CLAUDE.md、/rank 等)的关系需跨文件推断,维护责任高度依赖单一作者。
去重、状态持久化、健康检查、质量兜底等设计显著高于手写 grep 的边际价值,输出格式明确。扣分:静态评审无法验证实际抓取成功率;大量初始配置(profile、queries、门户 CLI 安装)意味着开箱价值有限,README 的个人成效属作者自述。
有 CI 工作流、CLI fixture/mock 测试、SECURITY.md 与引用的具体案例(如 freehire 过期职位事件),可审计材料充分。扣分:skill 编排关键路径(搜索→去重→呈现)无已提交的针对性测试,无第三方独立复现证据,静态评审上限即为 5,扣至 4。
- 本评分为静态源码评审,未执行任何代码;实际抓取成功率与跨门户行为未经验证。
- 核心搜索依赖 LinkedIn、Google/WebSearch 等海外服务,在中国大陆网络环境下可能不可达或需代理。
- 使用前必须完成 search-queries.md 与个人 profile 的占位符配置,否则查询会按模板字面量执行。
- 防御为指令级而非沙箱:对不信任的职位板,发送任何内容前请检查代理抓取与写入的文件。
- 发布者未经过 FollowSkills 企业注册表验证;仓库含 9 个 SKILL.md,本次仅评审 job-scraper 这一个。
这个 Skill 能做什么,适合哪些场景?
Job Scraper 是 ai-job-search 框架中负责职位搜寻的技能(.claude/skills/job-scraper)。它通过已安装的各招聘门户网站命令行工具(CLI)搜索与你个人档案匹配的新职位,Portal 没有对应 CLI 时回退到网络搜索;跨运行去重(对照已见职位文件和申请追踪表),并对每条新职位给出高/中/低的快速匹配评估。运行结束后生成按匹配度排序的职位表格,并为高、中匹配职位生成 LinkedIn 推荐联系人搜索链接。该框架由一位地球物理学家在求职过程中构建并自用验证(作者自称凭此获得 AI 工程师职位),整体面向个人求职者。注意:仓库自带六个门户 CLI,其中四个针对丹麦市场,其他国家用户需要用仓库提供的 /add-portal 命令生成自己的门户技能。
读取 search-queries.md 中的搜索策略和 seen_jobs. / job_search_tracker.csv 的历史状态;优先调用 .agents/skills/ 下各门户 CLI(用 Bun 运行,结果限定最近 14 天、每次约 20 条,多门户并行),CLI 不可用时回退到 WebSearch/WebFetch;对值得深入的结果调用门户的 detail 命令提取关键要求、申请截止日期和描述摘要,检测已下架职位并标记为 expired;合并同一公司的跨城市批量发帖(mass-posting)为一条并标注;按高/中/低给出快速匹配评估,并叠加语言门槛覆盖规则;用 tools/job_key.py 生成规范去重键,把所有抓取到的职位写入 seen_jobs.(含 portal、source、posted_date 等字段);为高、中匹配职位生成两类 LinkedIn 人员搜索链接(招聘官路径和团队同侪路径),只生成链接、不抓取人脉页面;执行有限的门户健康检查(每门户最多一次探测、一次重试),输出 degraded/broken/inconclusive 结论;最后以表格呈现新职位、标出禁用门户与回退门户。
- 每周想主动搜新职位的求职者,替代逐个打开 Jobindex、Jobnet、LinkedIn 等网站手动搜索
- 已在使用 ai-job-search 框架的用户,希望把抓到的新职位自动去重并直接接入 /rank 和 /apply 流程
- 针对特定方向定向搜寻的用户,例如输入 '/scrape data science' 或 '/scrape broad' 调整搜索范围
- 需要了解某次搜索是否命中职位但担心数据陈旧的用户,可用 /scrape health 单独探测各门户 CLI 是否已失效
- 希望给自己找内推机会的申请者,使用技能生成的 LinkedIn 招聘官/同侪搜索链接主动建立联系
这个 Skill 有哪些优点和局限?
- 纯本地运行,框架本身免费开源(MIT 许可),无订阅或 API 费用
- 跨运行持久去重(seen_jobs. + 申请追踪表 + 规范化去重键),避免重复推销同一职位
- 健壮的工程设计:门户启停开关、CLI 失败自动回退 WebSearch、有界的健康检查能发现静默失效的解析器
- 对数据诚实:禁止捏造职位、记录 posted_date 和 source 以便事后审计幽灵职位、批量发帖只提示不指控
- 内推链接步骤刻意零依赖——只生成 LinkedIn 搜索链接,不抓取、不需要凭据
- 内置的四个丹麦门户 CLI(Jobbank、Jobdanmark、Jobindex、Jobnet)只覆盖丹麦市场,其他地区必须自行用 /add-portal 生成并维护门户技能
- 门户 CLI 依赖目标网站结构,网站改版会导致解析器静默失效,需要健康检查和手动修复
- linkedin-search 基于非官方公开端点,自动化访问违反 LinkedIn 服务条款,只能个人低频使用,存在被封锁的风险
- 深度依赖 Claude Code 生态:allowed-tools、Agent、AskUserQuestion、/add-portal 等 Claude Code 机制,迁移到其他代理工具需要适配
- 快速匹配评估只是粗略信号,完整评估依赖框架中另一个技能(/rank 和 04-job-evaluation.md),单独使用本技能判断力有限
如何安装这个 Skill?
该技能是 MadsLorentzen/ai-job-search 仓库(MIT 许可)的一部分,随整个框架安装:1) 用 gh repo fork MadsLorentzen/ai-job-search --clone fork 并克隆仓库;2) 在 .agents/skills/ 下的各门户 CLI 目录运行 bun install(jobbank-search、jobdanmark-search、jobindex-search、jobnet-search、linkedin-search、freehire-search;linkedin-search 和 freehire-search 无运行时依赖,可跳过);3) 前置条件:Claude Code CLI、Python 3.10+、Bun;4) 运行 /setup 填写个人档案。技能本身位于 .claude/skills/job-scraper/,无需单独安装。
如何使用这个 Skill?
在 Claude Code 中运行 /scrape,或说 'Find new jobs'、'Any new positions?'。可选参数:'/scrape data science'(聚焦某类查询)、'/scrape broad'(运行所有搜索类别)、'/scrape health'(只做门户健康检查,如 /scrape health jobnet 探测单个门户)。搜索完成后技能会以表格呈现按匹配度排序的新职位;选择某个编号可进入 job-application-assistant 技能做完整评估(/apply);新职位较多(约 8 条以上)时建议改用 /rank 批量评分。
这个 Skill 与同类方案有什么区别?
README 中将整个框架与'大多数 LaTeX 简历模板'对比,指出后者缺乏 PDF 编译检查,但这是针对 /apply 的说法。就职位搜寻本身而言,常见替代方案是手动浏览各招聘网站或使用 LinkedIn 内置的职位提醒——本技能的差异点在于多门户并行搜索、本地去重和与后续申请流程的衔接,但覆盖面取决于你所在市场是否有可用的门户 CLI。