Python 实战:Boss 直聘职位信息爬虫开发全解析​

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 版或代理集成,评论补充场景,我可以扩展代码! 😄

文章已创建 3738

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部