Python 实战:Boss 直聘职位信息爬虫开发全解析
Boss 直聘(zhipin.com)是一个热门的招聘平台,包含海量职位信息。通过 Python 爬虫,我们可以自动化采集职位数据,用于市场分析、求职指导或个人项目。到 2026 年,Boss 直聘的反爬机制已较为成熟(如动态加载、登录验证、IP 封禁),因此本教程强调合规爬取:仅用于学习,遵守 robots.txt,避免高频请求,模拟人类行为。滥用可能导致账号封禁或法律风险。
本教程基于 Python 3.12+,使用 Requests 库访问 API(网站数据主要通过 JSON API 加载),结合 BeautifulSoup 处理详情页。完整流程包括网站分析、代码实现、数据存储和优化。示例采集“Python 开发”职位在北京的信息。
1. 准备工作
安装依赖库
使用 pip 安装:
pip install requests beautifulsoup4 pandas fake-useragent
- requests:发送 HTTP 请求。
- beautifulsoup4:解析 HTML(用于详情页)。
- pandas:数据处理和存储 CSV/Excel。
- fake-useragent:随机生成 User-Agent,模拟浏览器。
伦理与法律提醒
- 检查 https://www.zhipin.com/robots.txt(允许 /wapi/ 但需谨慎)。
- 加入随机延迟(1-5 秒),限制请求频率(<10 次/分钟)。
- 如果需要登录,使用 Selenium,但本教程用无登录模式(公开数据)。
- 数据仅用于个人分析,不得商业化或传播。
2. 网站分析
Boss 直聘职位列表通过 API 加载:
- API 端点:
https://www.zhipin.com/wapi/zpgeek/search/joblist.json - 参数(GET):
query:搜索关键词,如 “Python”。city:城市代码,北京=101010100(从网站获取)。page:页码,从 1 开始。pageSize:每页数量,默认 30。- 其他:
experience(经验)、salary(薪资)、jobType(类型)等。 - 响应:JSON 格式,包含职位列表(jobName、salaryDesc、companyName、areaDistrict、jobId 等)。
- 详情页:
https://www.zhipin.com/job_detail/{lid}.html(lid 来自 API 的 lid),需解析 HTML 获取描述。 - 反爬措施:
- 需要 Headers:User-Agent、Referer、Cookie(可从浏览器复制)。
- JavaScript 渲染:列表 API 直接可用,但详情页可能需 Selenium 处理动态内容。
- IP 限制:使用代理池或低频请求。
从浏览器开发者工具(F12 → Network)观察请求,复制 Headers。
3. 代码实现
3.1 采集列表页(API 请求)
import requests
from fake_useragent import UserAgent
import time
import random
import json
import pandas as pd
# 随机 User-Agent
ua = UserAgent()
def fetch_job_list(keyword, city_code, page=1, page_size=30):
url = "https://www.zhipin.com/wapi/zpgeek/search/joblist.json"
params = {
"query": keyword,
"city": city_code,
"page": page,
"pageSize": page_size,
"ka": "search.1", # 固定参数
"sort": "recommend" # 推荐排序
}
headers = {
"User-Agent": ua.random,
"Referer": "https://www.zhipin.com/",
"Accept": "application/json, text/plain, */*",
# 添加 Cookie 如果需要(从浏览器复制,非必须)
# "Cookie": "your_cookie_here"
}
try:
response = requests.get(url, params=params, headers=headers)
response.raise_for_status()
data = response.json()
if data.get("code") == 0:
return data["zpData"]["jobList"]
else:
print(f"API 错误: {data.get('message')}")
return []
except Exception as e:
print(f"请求失败: {e}")
return []
# 示例:采集北京 Python 职位,前 3 页
jobs = []
for p in range(1, 4):
job_list = fetch_job_list("Python", "101010100", page=p)
jobs.extend(job_list)
time.sleep(random.uniform(2, 5)) # 随机延迟,避免封禁
# 转为 DataFrame
df = pd.DataFrame(jobs)
df = df[["jobName", "salaryDesc", "brandName", "areaDistrict", "lid"]] # 选关键字段
print(df.head())
3.2 采集详情页(解析职位描述)
from bs4 import BeautifulSoup
def fetch_job_detail(lid):
url = f"https://www.zhipin.com/job_detail/{lid}.html"
headers = {
"User-Agent": ua.random,
"Referer": "https://www.zhipin.com/",
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
# 提取职位描述(class 根据网站结构调整,2026 年可能变)
desc_div = soup.find("div", class_="job-description")
if desc_div:
description = desc_div.get_text(strip=True)
else:
description = "未找到描述"
return description
except Exception as e:
print(f"详情页失败: {e}")
return ""
# 添加描述到 DataFrame
df["description"] = df["lid"].apply(fetch_job_detail)
time.sleep(random.uniform(2, 5)) # 每请求延迟
3.3 数据存储与简单分析
# 存储到 CSV
df.to_csv("boss_jobs.csv", index=False, encoding="utf-8-sig")
# 简单分析:薪资分布
df["salary_min"] = df["salaryDesc"].str.extract(r"(\d+)K").astype(float) # 提取最低薪资
print(df["salary_min"].describe()) # 统计信息
4. 性能优化与反爬处理
- 代理 IP:高频时用免费/付费代理池(如 IPidea),修改 requests 添加 proxies。
proxies = {"http": "http://your_proxy:port", "https": "https://your_proxy:port"}
response = requests.get(url, proxies=proxies, ...)
- 登录模拟:如果 API 需要登录,用 Selenium 自动化浏览器获取 Cookie。
- 安装:
pip install selenium - 示例:用 ChromeDriver 登录,提取 Cookie 传入 Headers。
- 多线程:用 concurrent.futures 加速详情页采集,但控制并发(<5)。
- 异常处理:添加重试机制(retrying 库)。
- 数据清洗:用 Pandas 处理空值、重复。
5. 完整运行与扩展
- 运行:将以上代码组合成脚本,执行采集 100+ 职位。
- 扩展:
- 多城市/关键词:循环 city_codes(如上海=101020100)。
- 可视化:用 Matplotlib 画薪资分布图。
- 存储数据库:用 SQLAlchemy 存 MySQL。
- 潜在问题:
- API 变化:定期检查网站更新。
- 封禁:如果 IP 被禁,用 VPN 或暂停。
- 法律:仅采集公开数据,避免敏感信息。
通过这个爬虫,您可以快速分析职位市场(如 Python 岗位平均薪资 20-30K)。如果需要 Selenium 版或代理集成,评论补充场景,我可以扩展代码! 😄