起因

最近在看机会,天天刷 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 可以做到:

  1. 连接到一个正在运行的 Chrome 实例
  2. 在任意页面里执行 JavaScript
  3. 读取页面数据、模拟用户操作

我们的做法是:

  1. 启动一个开了 CDP 端口的 Chrome(用你自己的 profile,保持登录状态)
  2. 通过 WebSocket 连接 CDP
  3. 在 BOSS直聘页面里注入 JS,用 XMLHttpRequest 同步调用那个搜索 API
  4. 拿到 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。