【免费下载链接】freehirefreehire — the open-source search engine for job seekers项目地址https://gitcode.com/GitHub_Trending/fr/freehire点击查看免费下载freehire 是一个开源的求职搜索引擎open-source search engine for job seekers它把散落在各处的招聘信息聚合成一个可按地区、工作形式、技能、资历筛选的统一索引目前聚合了330 万 条在招职位、来自29.4 万 家公司数据来自225 个活跃来源——其中包括92 个 ATSApplicant Tracking System招聘管理系统平台、100 个聚合招聘站和 30 个企业官网直连源。这篇文章带你走一遍 freehire 的爬取管线数据从哪里来、如何被抓取、去重、写入数据库再到进入搜索索引最后讲清这 92 个 ATS 适配器是怎么工作的。先看家底225 个来源是怎么划分的freehire 把每个数据来源归为三类来源类型不是配置项而是适配器 Go 类型自带的属性见 README.md 的 Sources 章节来源类型数量公司数在招职位典型例子ATS 平台92 个157,3992,644,796Workday、Greenhouse、Lever、iCIMS聚合站 / 招聘板100 个172,884629,571Adzuna、trudvsem、Telegram 频道企业官网直连30 个5926,222Amazon、Apple、Google、YandexATS 平台是绝对主力绝大多数科技公司不会自己写招聘系统而是托管在 Greenhouse、Lever 这类 SaaS 上。因此 freehire 的每个 ATS 适配器一次就能覆盖成百上千家公司——这是 92 个适配器撑起 264 万条职位的原因。爬取管线总览四个组件分工协作整条管线源码在 internal/ingest/由四个核心部分组成来源适配器注册表internal/ingest/sources/registry.go——225 个来源的总名单一次性爬取 workercmd/ingest/main.go——每次运行只处理一个来源跑完即退出入库管线 Runnerinternal/ingest/pipeline/pipeline.go——抓取 → 归一化 → 去重 → upsert增量索引出队器cmd/search-drain/main.go——把新职位推进 Meilisearch 搜索引擎来源注册表一个来源一行代码每个适配器实现统一的Source接口把一个 ATS 平台的 API/页面翻译成归一化的Job结构含标题、公司、地点、描述、远程标志等字段。internal/ingest/sources/source.go 中定义了接口与Job结构注册表sources.All(client)负责把 225 个 provider 键映射到各自适配器。新增一个平台的成本 一个新的.go适配器文件 注册表里的一行注册。几个值得注意的设计默认无需 API 密钥绝大多数 ATS 的公开 JSON API 免费开放只有usajobs、reed、whatjobs等少数来源需要环境变量凭证。分页容错规则第一页失败 整个 board 失败后续页失败 带着已抓到的链接结束翻页部分数据照样保留。限流保护收到 429 时按住的是整个站点主机而不是单个请求按Retry-After或指数退避1s 翻倍至 60s 封顶防止 8 个并发 worker 一起撞墙。调度谁决定该爬了freehire 没有常驻爬虫进程而是run-once-and-exit 的 cron 模式每个 provider 一条独立调度互不干扰。调度决策存在数据库里internal/ingest/ingestsched/迁移文件 migrations/0132_ingest_schedule.sqlroster 就是boards表——只要某个 provider 在boards表里有pending/active状态的 board它就会被调度ingest_schedule表只是覆盖项自定义频率、禁用原因等。cmd/ingest provider加载该 provider 的 board爬完退出。大型 provider如 Workday 有上百万条职位用--shardi/n分片摊到多个错峰运行。Board 健康与指数退避失败不撞墙每个 board 的运行状态记录在board_health表migrations/0006_board_health.sql连续失败次数、冷却截止时间、最后错误。退避策略写得很克制连续失败少于 3 次不冷却避免偶发抖动误伤之后按6h × 2^(f-3)退避封顶 24h——永远只是慢一点一次成功即自愈这样设计的好处是单个 board 挂了只会慢下来不会打断其余 board 的爬取。从入库到可搜search_outbox 增量索引职位写入时cmd/ingest会把新增或内容有变化的职位 ID 原子地写入search_outbox队列表和 upsert 在同一事务里随后 cmd/search-drain/ 按自己的节奏把积压的职位批量构建成 Meilisearch 文档推送。为什么不直接在爬取时推搜索引擎因为独立 worker 有上百个若每个都直推Meilisearch 每次推送都要全量合并倒排索引——生产环境实测单次推送 50~90 秒。改走队列后多次小规模索引合并被折叠成少数几次大批量操作新职位大约一个出队周期内就可搜到。去重则是两级写入级jobs表对(source, external_id)建唯一约束upsert 天然幂等重复运行安全角色级同一家公司在多个城市发同一个职位按role_fingerprint不含地点的指纹折叠只保留规范行职位下线软关闭与 48 小时清扫职位消失了怎么办freehire 的答案是软关闭职位只在closed_at IS NULL时算在招生命周期从不硬删除完整机制见 docs/agents/job-lifecycle.md。每次爬取都会给见到的职位刷新last_seen_at爬完后的清扫任务把48 小时没再见到的职位关闭职位重新出现时 upsert 自动复活它。配套的保护很多例如某次爬取整站瘫痪时清扫不会误杀整个目录一条职位只是这次读不到超时、403和平台明确说它没了404/410会被严格区分前者只打Unreadable标记而不关闭。这套证据优先的机制是爬取管线的核心工程哲学。92 个 ATS 适配器细节里的工程适配器目录 internal/ingest/sources/ 里一个平台一个.go文件配套的_test.go用testdata/里的真实响应快照做回归测试。几个代表性案例展示了适配器的多样性Greenhouse / Lever / Ashby / Workday标准多租户 ATSboard ID 就是子域名JSON API 直接可爬SEEK / JobStreet / JobsDB共享同一套 GraphQL 基建详情页走统一的令牌桶限速约 2 req/s且把HTTP 200 里夹带的 RATE_LIMITED 错误也识别为拒绝MokaHR列表接口AES 加密返回适配器用响应里附带的密钥解密Naukri只有伪装成 Android 客户端的 API 才放行且只能通过代理出口访问当普通 HTTP 客户端打不开时freehire 还有两层逃生舱internal/ingest/sources/browsertier.go浏览器层无头浏览器 代理处理 JS 挑战类站点托管抓取层按页计费的第三方抓取只留给前面两层都被拒绝的来源如bayt、gulftalent新 board 怎么被发现和加入除了人工提交freehire 有一整套自动发现工具链ATS 识别internal/ingest/atsdetect/atsdetect.go扫描公司招聘页的 HTML用 URL 形态正则认出这页跑在 Greenhouse 还是 Lever 上并解析出 board slug——贴一个招聘页 URL 就能定位其底层 ATSboard 收割cmd/harvest-boards/main.go针对各平台批量探测候选 board用 Common Crawl 索引找白标租户正式入库cmd/add-board/main.gocmd/add-board --provider… --board… --company… --apply写入boards表migrations/0123_boards.sql默认只报告不落库加--apply才真正写入小结freehire 的爬取管线可以用一句话概括225 个来源、284 个适配器文件、一条抓取 → 归一化 → 幂等去重 → 增量索引 → 证据驱动的生命周期流水线。它的价值不在于某个炫技的单点而在于每个环节都回答了错误数据如何不污染索引——这正是开源招聘数据项目最难的 80%。如果你想深入了解某一类机制可以从这些入口开始internal/ingest/AGENTS.md数据入口总览、internal/ingest/sources/AGENTS.md适配器约定与踩坑实录、docs/agents/job-lifecycle.md职位生命周期全文。赞分享【免费下载链接】freehirefreehire — the open-source search engine for job seekers项目地址https://gitcode.com/GitHub_Trending/fr/freehire点击查看免费下载相关推荐freehire 数据全景225 个来源、92 个 ATS 平台、29.4 万家公司的数据版图是怎么搭起来的freehire 数据全景225 个来源、92 个 ATS 平台、29.4 万家公司的数据版图是怎么搭起来的 freehire 是一个开源的 招聘搜索引擎 爬 Telegram 招聘频道freehire 从帖子预过滤到 LLM 职位抽取的两段式管线爬 Telegram 招聘频道freehire 从帖子预过滤到 LLM 职位抽取的两段式管线 freehire 是一个开源职位搜索引擎它用 两段式管线 从开源职位搜索引擎 freehire 深度解析330万条在招职位直连企业 ATS没有招聘中介、没有重发、没有死链开源职位搜索引擎 freehire 深度解析330万条在招职位直连企业 ATS没有招聘中介、没有重发、没有死链 freehire 是一个 开源职位搜索引擎上一篇又有高校开始教『AI 协作开发』了斯坦福这份爆火作业集或成国内课程改革的新模板下一篇本地语音工具落地最容易栽的坑从模型加载到设备兼容创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?