合法获取招聘数据应优先使用官方API(如国家事业单位招聘网、拉勾开放平台),因智联等网站部署反爬机制(行为识别、动态渲染、滑块验证),requests+BeautifulSoup易失败且违法;拉勾API需授权,返回脱敏字段;技能分析需结合jieba分词、自定义词典及上下文规则提取,并分层统计避免偏差。

不能直接爬公开招聘网站——多数已反爬,且法律风险高;真实可行的方案是用官方API(如国家事业单位招聘网)或合规数据源(如拉勾、BOSS直聘的开放接口),配合关键词提取做技能分析。
为什么 requests + BeautifulSoup 爬智联、前程无忧大概率失败
这些网站普遍部署了行为识别(如 anti-bot 头检测)、动态渲染(岗位列表由 fetch 加载)、滑块验证(geetest 或 turnstile),甚至 IP 频控(403 Forbidden 或 503 Service Unavailable)。硬刷会触发封禁,且违反其 robots.txt 和用户协议。
- 真实返回的 HTML 常为空容器(如
<div id="job-list"></div>),实际数据藏在XHR请求的 JSON 里 - 登录态依赖
cookies+token+sign三重参数,每次请求需重算,无法静态复现 - 即使绕过,单 IP 每小时请求超 20 次就可能进
fail2ban黑名单
用拉勾网公开 API 抓取岗位数据(需合法授权)
拉勾提供企业端开放平台(https://open.lagou.com),注册后可申请 client_id 和 client_secret,调用 /api/v1/position/list 接口。注意:免费版限流严格(100 次/天),且仅返回脱敏字段(不包含完整 JD)。
- 必须带
Authorization请求头:Bearer {access_token},access_token有效期 2 小时,需先用/auth/token换取 - 关键词搜索要 URL 编码,例如 Python 岗位传
positionName=Python%E5%BC%80%E5%8F%91 - 响应中关键字段是
positionDetail(部分描述)、skillLables(平台提取的标签,非原始文本)
import requests
headers = {"Authorization": "Bearer abc123..."}
params = {"positionName": "Python%E5%BC%80%E5%8F%91", "pageNo": 1, "pageSize": 30}
r = requests.get("https://open.lagou.com/api/v1/position/list", headers=headers, params=params)
data = r.json()["data"]["positions"] # 注意嵌套层级从真实 JD 文本抽技能词(用 jieba + 自定义词典)
如果已有脱敏后的职位描述文本(如从学校就业网、政府公示文件批量下载的 PDF/TXT),可用 jieba 分词 + 规则过滤提取技能。难点在于“Python”是语言,“Python 开发”是岗位,“熟练 Python”才是技能表达——不能只靠词频。
立即学习“Python免费学习笔记(深入)”;
- 先加载行业词典:
jieba.load_userdict("skills_dict.txt"),内容如TensorFlow 5 n(5 是词频,n表示名词) - 过滤停用词后,保留长度 2–6 的名词性短语,且必须出现在
熟悉|掌握|精通|具备...能力等动词后 3 个词范围内 - 合并近义词:
["MySQL", "mysql", "Mysql"] → "MySQL",避免大小写和空格干扰统计
高频技能统计容易忽略的偏差点
直接对所有技能词做 Counter 排序会高估通用工具(如 Office)、低估复合要求(如 Spring Boot + Redis)。真实分析必须分层:
- 按岗位类型切片:后端岗的
Docker出现率 ≠ 运维岗的Docker权重 - 区分“要求”和“优先”:JD 中
“熟悉XX者优先”的词频应乘以系数0.3 - 时间衰减:近 3 个月数据权重设为
1.0,3–6 个月设为0.6,否则历史遗留技能(如Flash)仍会残留
真正卡住进度的,从来不是代码怎么写,而是数据来源是否合法、文本清洗逻辑是否贴合招聘方真实表述习惯——这两点没对齐,后面所有统计都是空中楼阁。


















