构建 Extraction Node:分析 400 多条 HN 工作列表(Python vs Node.js)
Source: Dev.to

职场效率低下
现代技术岗位求职遵循信息不对称模型。求职者在不同平台上手动处理非结构化文本,而企业则使用自动化的申请人跟踪系统(ATS)将其筛除。逻辑上的对策是构建一个程序化的抽取流水线,以识别真实的市场信号。
为了绕过主流企业网络上饱和且常常误导的招聘信息,数据源必须是原始且面向开发者的。本系统使用 Hacker News 的 “Who is Hiring” 线程作为主要抽取目标。
下面是构建抽取节点的架构拆解,旨在解析、分类并合成 400 多条非结构化职位信息为结构化数据集。
1. 提取管道
论坛中的非结构化文本带来了解析难题。传统的正则表达式在人工格式不一致时会失效。该管道必须分两个阶段运行:检索和合成。
阶段 1:检索
标准的 HTML 解析足以完成初始提取。
import requests
from bs4 import BeautifulSoup
import json
def fetch_hn_thread(item_id: str) -> list:
"""Retrieves all top-level comments from an HN Who is Hiring thread."""
url = f"https://hacker-news.firebaseio.com/v0/item/{item_id}.json"
response = requests.get(url).json()
comments = []
if 'kids' in response:
for child_id in response['kids']:
child_url = f"https://hacker-news.firebaseio.com/v0/item/{child_id}.json"
child_data = requests.get(child_url).json()
if child_data and 'text' in child_data:
comments.append(child_data['text'])
return comments
阶段 2:LLM 合成
在检索到原始 HTML 字符串后,需要使用 LLM 接口(例如 Llama 3 或结构化输出 API)对非结构化文本强制执行 JSON 模式。这可以将特定变量隔离出来:角色、技术栈、薪资、远程状态和签证赞助。
# System prompt engineering for deterministic output
schema_prompt = """
Extract the following fields from the job posting.
Return ONLY valid JSON.
{
"company": "string",
"role": "string",
"stack": ["string"],
"remote": "Global" | "US Only" | "None",
"visa_sponsorship": boolean,
"salary_min": number | null,
"salary_max": number | null
}
"""
2. 数据合成
对2026年2月的数据运行此管道,得到400多个离散技术岗位。实证数据与若干流行的市场叙事相矛盾。
远程分布
- 全球远程: 37%
- 仅美国远程: 22%
- 现场 / 混合: 41%
结论: 远程工作并未消亡,但受到地理限制。对岗位进行申请而未核实地理约束,会导致国际候选人有22%的基线失败率。
签证赞助指标
- 仅 14% 的提取列表明确提供签证赞助。
- 其中 80% 的赞助集中在 AI 基础设施和金融科技领域。
技术栈溢价
- 在本数据集中,Python 后端岗位相较于等价的 Node.js 岗位拥有 15% 的薪资溢价。
- 市场正显示出从通用 JavaScript 环境向专用、计算密集型基础设施语言(Python、Go、Rust)转变的信号。
3. 执行与部署
上述详细的架构足以让任何工程师在本地重建此流水线。维护用于数据提取的本地脚本可在市场洞察方面带来叠加优势。
对于那些不想配置流水线或承担大型语言模型推理成本、但需要即时输出的用户,已编译的 CSV 数据集——包含 400 多个已解析的职位、技术栈以及已验证的全球远程标签——可在此获取: