起因
最近在看机会,天天刷 BOSS直聘。刷多了就想:这些职位数据能不能批量拉下来分析一下?比如哪些技能出现频率最高、不同城市的薪资分布、哪些公司在招 AI Agent 方向的人。
但 BOSS直聘有个很烦的东西:字体反爬。
薪资数字在前端显示的不是正常文字,而是用一套自定义字体渲染的。你抓下来看到的是方块或者乱码。很多爬虫教程告诉你去解析 woff 字体文件做映射,但 BOSS直聘的字体是动态生成的,每次访问都不一样,这条路基本走不通。
后来我发现了一个更简单的办法。
核心思路:绕过前端,直接调 API
BOSS直聘的前端页面用了字体反爬,但它自己的前端代码也要拿到薪资数据来渲染。怎么拿的?通过一个内部 API:
/wapi/zpgeek/search/joblist.json
这个接口返回的 JSON 里有 salaryDesc 字段——明文薪资,比如 30-60K·15薪。字体反爬只是前端渲染时加的一层,API 层面根本没有。
所以思路就简单了:不要去解析 HTML、不要去破解字体,直接调这个 API 就行。
但问题是这个 API 有 cookie 校验,你得在已登录的 BOSS直聘页面上下文里才能调通。这就引出了技术方案:Chrome CDP。
技术方案:Chrome DevTools Protocol
CDP(Chrome DevTools Protocol)就是 Chrome 浏览器的远程调试协议。你平时按 F12 打开的 DevTools 就是通过这个协议和 Chrome 通信的。
用 CDP 可以做到:
- 连接到一个正在运行的 Chrome 实例
- 在任意页面里执行 JavaScript
- 读取页面数据、模拟用户操作
我们的做法是:
- 启动一个开了 CDP 端口的 Chrome(用你自己的 profile,保持登录状态)
- 通过 WebSocket 连接 CDP
- 在 BOSS直聘页面里注入 JS,用
XMLHttpRequest同步调用那个搜索 API - 拿到 JSON 结果,提取明文薪资和其他字段
整个过程就像你在浏览器控制台里手动敲代码一样,只不过自动化了。
软链接方案
这里有个坑。Chrome 不允许多个进程同时访问同一个用户 profile。如果你平时已经开着 Chrome,再用 CDP 模式启动一个指向同一个 profile 目录的 Chrome 实例,会报锁冲突。
解决方法是创建一个软链接:
ln -s ~/Library/Application\ Support/Google/Chrome /tmp/chrome-cdp-profile
然后用软链接路径启动 Chrome。Chrome 会认为这是一个新的 profile 目录,不会和原来的实例冲突,但底层数据(cookie、登录态)还是同一份。
一行命令抓取
安装好后,抓取就一行命令:
python3 boss_cdp_raw.py --keyword "AI Agent" --city 上海 --pages 3 --format csv
输出:
✓ AI Agent运行环境工程师 | 30-60K·15薪 | 上海 | 字节跳动 | 10000人以上
✓ AI Agent 开发实习生 | 300-600元/天 | 上海 | 阿里巴巴集团 | 10000人以上
✓ AI Agent工程师-Java | 35-55K | 上海 | 滴滴 | 1000-9999人
...
支持的功能
搜索和筛选
- 按关键词、城市搜索
- 按公司规模、薪资范围、工作经验、学历筛选
- 支持分页(每页 30 条,最多 10 页)
输出格式
- JSON:结构化数据,方便程序处理
- CSV:UTF-8 BOM 编码,Excel 直接打开不乱码
详情页抓取
- 加
--detail可以抓每个岗位的完整 JD - 自动提取技能标签
增量写入
- 每页抓完立即保存,Ctrl+C 中断不丢数据
- 按 job_id 去重,重复运行不会产生重复数据
合并多次抓取
# 先抓上海的
python3 boss_cdp_raw.py --keyword "AI Agent" --city 上海 --pages 3 -o jobs.json
# 再抓北京的,合并到同一个文件
python3 boss_cdp_raw.py --keyword "AI Agent" --city 北京 --pages 3 --merge jobs.json -o jobs.json
环境检查
python3 boss_cdp_raw.py --check
一键检测 Chrome CDP 是否可用、Python 依赖是否齐全、BOSS直聘是否已登录。
一键启动 Chrome
python3 boss_cdp_raw.py --setup-chrome
自动创建软链接、启动 Chrome CDP。你只需要手动登录 zhipin.com 就行。
反爬策略
BOSS直聘的反爬不弱,做了几件事来降低被封的风险:
- 翻页间隔 12-22 秒随机延迟(模拟真人浏览节奏)
- 单次最多 10 页(300 条),上限保护
- 用真实 Chrome profile 的 cookie,不是无头浏览器
- API 请求从页面内发起,和正常浏览行为一致
作为 Hermes Agent Skill 使用
这个工具也打包成了 Hermes Agent Skill。装上之后,你直接跟 AI 说"帮我搜一下上海 AI Agent 岗位",它会自动检查环境、启动 Chrome、运行抓取、返回结果。
安装方式:
# curl 一键安装
mkdir -p ~/.hermes/skills/data-science/boss-zhipin-scraper/scripts && \
curl -sL https://raw.githubusercontent.com/eatmoreduck/boss-zhipin-scraper/master/SKILL.md \
-o ~/.hermes/skills/data-science/boss-zhipin-scraper/SKILL.md && \
curl -sL https://raw.githubusercontent.com/eatmoreduck/boss-zhipin-scraper/master/scripts/boss_cdp_raw.py \
-o ~/.hermes/skills/data-science/boss-zhipin-scraper/scripts/boss_cdp_raw.py
安装和使用
# 克隆仓库
git clone https://github.com/eatmoreduck/boss-zhipin-scraper.git
cd boss-zhipin-scraper
# 安装依赖
pip install -r requirements.txt
# 启动 Chrome(首次使用)
python3 scripts/boss_cdp_raw.py --setup-chrome
# 检查环境
python3 scripts/boss_cdp_raw.py --check
# 开始抓取
python3 scripts/boss_cdp_raw.py --keyword "AI Agent" --city 上海 --pages 3 --format csv
数据安全
说几个需要注意的点:
--setup-chrome创建的软链接指向你的完整 Chrome profile。CDP 连接理论上可以访问 Chrome 里的所有数据(cookie、密码、历史记录)。用完建议删掉软链接:rm /tmp/chrome-cdp-profile- 这个工具仅用于个人求职研究,不要拿去大规模爬取
- 尊重 robots.txt 和网站使用条款
仓库地址
https://github.com/eatmoreduck/boss-zhipin-scraper
觉得有用的话给个 star。

