招聘信息抓取:标题、重复发布与关闭判断
构建跨招聘站点的入库记录:同时保留原始与规范化字段,区分重复发布,并把缺失视为观察结果,而不是关闭。
BotBrowser Team
当多个招聘站点发布同一职位时,招聘信息抓取首先是一个数据模型问题。相同标题不能确定是同一职位,新 URL 不能证明是新空缺,记录不再出现也不能证明雇主已关闭该职位。BotBrowser 为获准观察提供有文档说明的配置文件浏览器参数;它不提供招聘数据、不代为登录,也不授予招聘站点访问权限。选择获准来源,在规范化值旁保留原始字段,并明确记录每条发布实例和观察结果。
摘要
- 在规范化值旁保留标题、雇主和地点的原始字符串,并记录规则版本。
- 以来源中的发布实例作为记录键。重复发布在替换旧实例前,必须有来源提供的连续性证据。
- 将
datePosted、validThrough和观察时间视为含义不同的独立事实。 - 刷新失败是采集事件。有限列表中的缺席只是缺席,不能证明职位已关闭。
- 有官方数据源或获准导出时优先使用。词汇表和结构化数据资格不等于采集授权。
目录
分开三类规范化问题
跨站点招聘数据需要三种不同决策。把它们合并成一次清洗,会丢失以后核对所需的证据。
标题。 “Senior Engineer”“Sr. Engineer, Platform”和“Engineer III”可能表示相近资历,也可能表示不同范围。为已声明的用途建立独立字段,例如粗粒度职位族,同时保留来源标题。不要用规范化标签覆盖原标题。
地点。 “Remote”“Remote, US”“New York, NY (Hybrid)”以及自由文本中的城市名回答不同问题。保留原始地点文本,再记录来源实际提供的字段:国家、地区、城市、远程范围和办公方式。国家缺失时,不能根据浏览器语言或代理地区推断。
雇主。 品牌、法律实体、招聘机构和站点自定义雇主标签并不等价。保留来源标签及任何来源提供的组织引用。相似名称可能属于不同实体,一个雇主也可能通过多个渠道发布。
将三项映射决策记录为独立字段,例如 title_family、location_parts 和 employer_ref,各自带规则版本。单一的 cleaned_title 或 city 会隐藏哪些部分来自来源、哪些是推断。把原始字符串保存在这些字段旁,并在来源没有回答时保留明确的未知状态。这样后续比较无需重建原始响应也能复核。
招聘字段合同规定单个站点如何提供字段与观察。本流程从该来源合同之后开始,增加一条跨站点记录,并明确显示做了哪些映射。
保留原始字段与规则版本
规范化是应用决策,因此记录必须同时显示输入和转换规则。schema.org JobPosting 词汇表描述招聘职位的公告,并把 datePosted 定义为在线公告的发布日期。它提供可比较的含义,不是每个站点的通用解析器。
| 记录字段 | 保留内容 | 边界 |
|---|---|---|
| 来源 | 站点或数据源身份及数据集范围 | 不同来源的相同值不自动代表同一发布 |
| 发布键 | 实际提供的提供方标识符 | URL 或标题不自动是稳定发布键 |
| 原始标题 | 许可保留范围内的精确来源字符串 | 不要用规范化标签替换 |
| 原始地点 | 精确文本及提供的结构化部分 | 不根据区域设置或代理推断缺失国家 |
| 雇主标签 | 来源提供的雇主或组织文本 | 未经证据,品牌、法律实体与机构保持区分 |
| 规范化字段 | 值、规则标识和映射版本 | 规则变化产生新解释,不是静默重写 |
| 发布与到期 | 来源提供的 datePosted 和 validThrough | 二者都不能确定实际填补日期或已确认关闭 |
| 观察 | 采集时间、来源状态和接受结果 | 采集时间不是发布时间、到期时间或交易时间 |
Google JobPosting 文档描述可让职位公告进入招聘搜索体验的结构化数据,并给出 identifier、datePosted、validThrough、employmentType、hiringOrganization 和 jobLocation 等示例字段。获得资格不保证准确、访问许可或各站点标记一致。用词汇表命名字段,只映射获准来源实际返回的内容。
为映射规则保留版本。如果“Senior”从一个职位族移到另一个,旧记录不应看起来一直使用新规则。规范化序列可以从原始值和已记录规则重建;覆盖原始字段会破坏这种能力。只在来源协议允许范围内保留,并与规范化记录遵守同一保留边界。
当两个站点用不同格式描述同一职位时,这一点尤其重要。一个可能提供结构化城市和国家,另一个把二者放在同一文本字段,第三个可能省略国家而只写都市区。规范化比较仍然有用,但规则必须说明哪些是推断、哪些是来源提供。为每个映射值记录来源字段路径或响应位置,使审核者能看出国家来自提供方字段还是应用猜测。来源没有国家而映射又需要国家时,规范化值应保持未知。不要用浏览器区域设置、代理地区或界面语言替代,它们描述观察环境,而不是职位。
雇主规范化也需要同样轨迹。站点可能用展示名、法律名称或招聘机构标注同一组织。来源提供的组织标识符强于名称匹配,但仍只在该来源内有效。记录标签、标识符和连接两条记录的规则。低置信关系应保持可见,不要合并成一行雇主。这样既能按来源比较数量,也能在新证据表明是两个组织时撤回匹配。
映射不能确定时,规范化字段还应带有置信度或解决状态。职位族可以是 mapped,地点可以是 partial,雇主可以是 unresolved。这些状态比空字符串更有用,因为它们区分“来源未提供”和“尚未解释”。导出和报告中保留相同状态,避免下游分析把未解决值当成干净值。
判断重复发布是否为新实例
站点可能用新 URL、新内部标识符或修改后的标题重新发布职位。任何单一变化都不能证明新空缺,也不能证明连续性。除非获准来源建立关系,否则保留独立实例。
| 构造的观察 | 来源证据 | 接受的关系 |
|---|---|---|
| 相同键,标题修订 | 发布键未变;来源提供更新 | 同一实例的字段修订 |
| 新 URL,可见雇主和标题相同 | URL 改变;无来源连续性字段 | 关系未解决;在有证据前保留为独立实例 |
| 新键,来源标明替换 | 来源明确把新公告与旧公告关联 | 关联实例;保留两个键和关系 |
| 另一站点上相同标题与城市 | 不同来源且无共享键 | 不同来源实例;不能按标题和地点合并 |
该表是构造示例,不是实测站点行为。房产公告模型采用同一原则:公告实例、实体房产和报价彼此不同。招聘中,来源发布实例、雇主职位和候选人申请也同样不同。
来源提供作用域键时使用它,并记录匹配被接受或保持未解决的原因。按标题、雇主和地点做模糊匹配可以提出候选对,但候选不是连续性证明。保留两个来源键和关系标签。去重步骤合并记录时,记录规则和证据,使后续审计能区分两条恰好同名的真实不同空缺。
关系标签需要能经受后续刷新。记录 same_occurrence、related_occurrence 或 unknown,并保存证据:共享来源键、明确替换字段或来源提供的规范引用。不要只根据当前规范化标题推导标签。标题可能在一条发布内变化,而相同标题也可能对应全新空缺。关系描述的是来源连续性,不是文本相似度。
当站点同时提供发布标识符和职位标识符时,分别保存。重复发布可能改变前者而后者稳定,也可能相反,取决于来源模型。只记录一个会丢失去重所需的区别。两者都没有时,把 URL 和观察时间作为证据保留,但把实例标记为暂定。暂定记录可用于有限分析;没有额外证据时,不能合并为永久规范职位。
来源引用应与实例键并存,而不是替换它。URL 可能因跟踪参数、语言前缀或站点迁移而变化,旧 URL 之后也可能重定向。分别保存实际观察到的引用和用于比较的规范化形式。重定向可以提示值得调查的关系,但不能单独证明目标就是同一发布。把它作为向来源提出的问题,而不是 URL 字符串规则。
检测关闭但不虚构关闭
Google 到期指南说明不再接受申请的公告必须到期,并列出方式:把 validThrough 填为过去时间、用 404 或 410 移除页面,或移除 JobPosting 结构化数据。这描述的是发布方对搜索体验的义务。采集方看到卡片缺失或响应变化,并不等于观察到了其中任一事件。
| 基线后的构造事件 | 观察 | 接受解释 |
|---|---|---|
| 接受字段更新 | 相同来源键;来源提供修订后的标题或地点 | 观察到的修订;不声称新雇主或新空缺 |
| 新 URL 的重复发布 | 新引用;无连续性证据 | 独立实例,关系未解决 |
| 刷新失败 | 没有接受的来源记录 | 采集事件;不删除此前接受值 |
| 有限列表中卡片缺失 | 列表窗口有效;未观察到目标 | 有限缺席;关闭仍未确立 |
datePosted 描述在线公告发布时间,validThrough 描述有效期边界,观察时间记录应用查看的时刻。已知来源含义时,已过期的 validThrough 可以支持到期标签,但不能说明职位何时填补。缺失行只能支持“本窗口未观察到”,不能支持“已关闭”。挑战页、超时或解析拒绝是事件,不是成功的空结果。
自有夹具可以在不采集真实站点的情况下重放四行。要求得到一次接受修订、一个独立重复发布实例、一次刷新事件和一次有限缺席。拒绝把四者都转成关闭的输出。这检查应用的分类逻辑,不测量具体站点的更新频率,也不证明空缺仍然开放。
关闭检测还需要时间边界。公告可能因查询窗口移动、列表截断或排序变化而从结果中消失。记录查询或数据源范围、请求的页面范围与观察时间。只查看第一页时,该页缺席不等于站点缺席。列表顺序变化时,缺失条目可能是分页伪影。将这些结果与来源提供的到期状态分开。
来源自身状态优先于应用推断。获准来源返回明确关闭或到期状态时,连同字段名和观察时间记录。返回移除响应时,与成功的空列表分别记录。因挑战、超时或畸形响应而没有可用内容时,记录事件。应用的生命周期视图可以说“来源确认到期”“本窗口未观察到”或“未知”,而不是把所有消失都归为一个关闭标签。
历史记录应保留当时可用的证据。后续来源合同可能增加状态字段,但不会把旧缺席追溯变成关闭。观察结果与来源结构版本一起保存。结构变化时,开始新的解释序列,或明确协调旧记录。这与规范化字段遵循同一原则:规则变化不应看起来像世界变化。
使用最小入库结构
小型记录让决策可复核:
source_namespace, source_posting_key, raw_title, raw_location,
raw_employer_label, employer_ref, normalized_title, normalized_location,
normalization_rule_version, date_posted, valid_through,
query_scope, page_range, source_schema_version,
observed_at, observation_outcome, relation_to_prior_occurrence
该结构是应用记录,不是站点强制格式。缺失字段保持空值或未知,不填入猜测值。来源响应结果与解释后的生命周期分开保存。两个观察共享实例键时,可以比较字段修订;不共享时,关系在来源提供证据前保持未解决。
招聘站点访问边界区分公开列表页与需要认证的候选人数据。入库结构不会改变这一边界。候选人资料、申请和消息不在采集范围内,即使浏览器会话能够访问。优先使用官方数据源或获准导出,在缺少许可或必要证据时停止。
先选获准来源,再谈浏览器路径
RFC 9309明确指出,robots 规则不是访问授权。允许抓取的公开页面,不一定允许建立市场数据集或再分发招聘信息。站点适用条款与真实数据协议决定可以采集和保留什么。浏览器成功响应不是许可。
BotBrowser 时区、区域与语言文档描述浏览器语言、时区和区域设置,支持自动检测与手动覆盖。这些设置能让获准观察环境保持明确,手动覆盖需要 ENT Tier1 许可,但不能确定职位地点、雇主国家或站点地点文本的含义。
配置文件参考记录可配置且要求主版本一致的配置文件包、配置优先级和字段可用性。配置文件能让声明的浏览器输入可复现;它不能登录、授予数据许可或保证不同运行返回相同公告。将配置文件和观察条件与已接受记录一起保存,并以来源协议作为访问和保留的依据。
常见问题
两个站点标题相同,可以合并为一个职位吗?
只有在来源证明它们描述同一发布或职位时才能合并。相同文本只是待审核候选,不是证明。保留各来源实例和明确的未解决关系,直到确立连续性。
公告从列表中消失,说明职位已关闭吗?
不能。有限列表可能因多种原因遗漏公告,刷新失败也不是空结果。记录缺席,并在赋予关闭状态前要求来源证据,例如到期状态或移除响应。
可以把 datePosted 当作采集时间吗?
不能。它是在线公告的发布日期。将采集方的观察时间与来源的 datePosted、validThrough 分别保存,并保留各自含义。
BotBrowser 提供招聘数据或采集许可吗?
不提供。它提供有文档说明的浏览器配置输入,不提供招聘数据、不登录、不授予访问,也不确定站点条款;请使用获准来源,并只保留协议允许的内容。
来源
实践结论
围绕来源作用域内的发布实例构建获准招聘记录。原始值与规范化值一起保存并带映射版本,在来源确认连续性前保留重复发布为独立实例,把发布时间、到期时间和观察时间当作不同事实。分类刷新失败与有限缺席,不虚构关闭。浏览器参数可以让获准观察可复现;获准来源及协议决定可用数据、含义与可保留历史。
本文属于指南: 浏览器部署与发布:运维决策地图