news 2026/4/24 3:51:27

人事小姐姐也能看懂的教程:用Playwright Python自动收集Boss直聘薪资,生成Excel报表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
人事小姐姐也能看懂的教程:用Playwright Python自动收集Boss直聘薪资,生成Excel报表

零代码基础也能上手:用Playwright Python轻松抓取招聘数据生成薪资报告

每次招聘季来临,人事部门的同事总要花大量时间手动收集各平台薪资数据,不仅效率低下,还容易出错。有没有一种方法,能让非技术人员也能自动完成这项工作?今天我们就来介绍一个连Excel函数都不需要掌握的解决方案——用Playwright Python自动抓取Boss直聘的薪资数据,并一键生成可视化报表。

1. 准备工作:搭建你的自动化环境

1.1 安装必备工具

首先需要安装Python环境,推荐使用Python 3.8及以上版本。安装完成后,在命令行中执行以下命令安装必要库:

pip install playwright pandas openpyxl playwright install

这三个库的作用分别是:

  • playwright:实现浏览器自动化操作
  • pandas:数据处理和分析
  • openpyxl:生成Excel文件

提示:如果安装速度慢,可以尝试使用国内镜像源,如清华源或阿里云源。

1.2 配置开发环境

对于非技术人员,推荐使用VS Code作为代码编辑器,它界面友好且支持中文:

  1. 下载并安装VS Code
  2. 安装Python扩展插件
  3. 创建一个新文件夹作为项目目录
  4. 在该文件夹中新建一个.py文件,比如salary_report.py

2. 编写第一个自动化脚本

2.1 基础脚本框架

让我们从一个最简单的脚本开始,它会打开Boss直聘首页:

from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=False) # 显示浏览器窗口 page = browser.new_page() page.goto("https://www.zhipin.com/") input("按回车键关闭浏览器...") # 暂停脚本执行 browser.close()

运行这个脚本,你会看到浏览器自动打开并跳转到Boss直聘网站。这就是自动化最简单的应用场景。

2.2 实现搜索功能

接下来,我们让脚本自动搜索特定职位:

def search_job(page, job_title): # 等待搜索框出现并输入职位名称 page.locator("input[name='query']").fill(job_title) # 点击搜索按钮 page.locator("text='搜索'").click() # 等待结果加载完成 page.wait_for_selector(".job-list-box")

这个函数可以添加到前面的脚本中,实现自动搜索功能。调用时只需要传入页面对象和要搜索的职位名称即可。

3. 数据抓取与解析

3.1 定位薪资数据元素

在Boss直聘的搜索结果页,薪资数据通常显示在类似这样的元素中:

# 获取所有职位卡片 job_cards = page.query_selector_all(".job-card-wrapper") for card in job_cards: # 提取公司名称 company = card.query_selector(".company-name").inner_text() # 提取职位名称 title = card.query_selector(".job-name").inner_text() # 提取薪资范围 salary = card.query_selector(".salary").inner_text() # 提取工作地点 location = card.query_selector(".job-area").inner_text() print(f"{company} | {title} | {salary} | {location}")

3.2 处理分页数据

大多数情况下,我们需要抓取多页数据:

def get_all_pages_data(page, max_pages=5): data = [] current_page = 1 while current_page <= max_pages: print(f"正在抓取第 {current_page} 页数据...") # 获取当前页数据 data.extend(get_current_page_data(page)) # 尝试点击下一页按钮 next_button = page.query_selector(".ui-icon-arrow-right") if next_button: next_button.click() page.wait_for_selector(".job-list-box") # 等待新页面加载 current_page += 1 else: break return data

4. 数据存储与报表生成

4.1 使用pandas整理数据

将抓取到的数据转换为DataFrame格式:

import pandas as pd def save_to_excel(data, filename="salary_report.xlsx"): df = pd.DataFrame(data, columns=["公司名称", "职位名称", "薪资范围", "工作地点"]) df.to_excel(filename, index=False) print(f"数据已保存到 {filename}")

4.2 生成可视化报表

我们可以进一步丰富报表内容,添加数据分析:

def generate_report(data): df = pd.DataFrame(data) # 薪资分析 df["最低薪资"] = df["薪资范围"].str.extract(r'(\d+)k-')[0].astype(float) df["最高薪资"] = df["薪资范围"].str.extract(r'-(\d+)k')[0].astype(float) df["平均薪资"] = (df["最低薪资"] + df["最高薪资"]) / 2 # 按地区分组统计 location_stats = df.groupby("工作地点")["平均薪资"].agg(["mean", "count"]) # 保存到Excel的不同sheet with pd.ExcelWriter("detailed_salary_report.xlsx") as writer: df.to_excel(writer, sheet_name="原始数据", index=False) location_stats.to_excel(writer, sheet_name="地区统计") print("详细报表已生成")

5. 完整脚本与优化建议

5.1 完整脚本示例

将前面的代码片段组合起来,就形成了一个完整的薪资数据抓取工具:

from playwright.sync_api import sync_playwright import pandas as pd import time def main(job_title="Java工程师", max_pages=3): all_data = [] with sync_playwright() as p: browser = p.chromium.launch(headless=False) page = browser.new_page() # 访问Boss直聘 page.goto("https://www.zhipin.com/") time.sleep(2) # 等待页面加载 # 搜索职位 page.locator("input[name='query']").fill(job_title) page.locator("text='搜索'").click() page.wait_for_selector(".job-list-box") # 抓取多页数据 current_page = 1 while current_page <= max_pages: print(f"正在处理第 {current_page} 页...") # 获取当前页数据 job_cards = page.query_selector_all(".job-card-wrapper") for card in job_cards: try: company = card.query_selector(".company-name").inner_text() title = card.query_selector(".job-name").inner_text() salary = card.query_selector(".salary").inner_text() location = card.query_selector(".job-area").inner_text() all_data.append([company, title, salary, location]) except: continue # 翻页 next_button = page.query_selector(".ui-icon-arrow-right") if next_button: next_button.click() page.wait_for_selector(".job-list-box") current_page += 1 time.sleep(1) # 防止操作过快 else: break browser.close() # 生成报表 generate_report(all_data) if __name__ == "__main__": main()

5.2 常见问题与解决方案

在实际使用中可能会遇到以下问题及解决方法:

问题现象可能原因解决方案
无法找到搜索框页面结构变化更新选择器或添加等待时间
数据抓取不全防爬机制触发降低抓取速度,添加随机延迟
浏览器无法启动环境配置问题重新运行playwright install
Excel文件损坏写入冲突确保文件未被其他程序打开

6. 进阶技巧与扩展应用

6.1 添加随机延迟避免被封

网站通常会有反爬机制,我们可以添加随机延迟来模拟人类操作:

import random def random_delay(min=1, max=3): time.sleep(random.uniform(min, max)) # 在关键操作间调用 random_delay()

6.2 处理登录状态

如果需要查看更多数据,可能需要处理登录状态:

def login(page, phone, password): page.goto("https://www.zhipin.com/web/user/?ka=header-login") page.locator("input[name='phone']").fill(phone) random_delay(0.5, 1.5) page.locator("input[name='password']").fill(password) random_delay(0.5, 1.5) page.locator("button[type='submit']").click() page.wait_for_selector(".user-name") # 等待登录成功

6.3 扩展应用场景

这套方法不仅适用于Boss直聘,稍作修改也可用于其他招聘平台:

  1. 拉勾网:修改URL和元素选择器
  2. 智联招聘:调整翻页逻辑
  3. 猎聘网:可能需要处理更多动态加载内容

对于完全不懂编程的同事,你可以将脚本打包成exe文件,他们只需双击运行即可:

pip install pyinstaller pyinstaller --onefile salary_report.py

7. 实际应用案例

某中型互联网公司HR部门使用这套工具后,薪资调研时间从原来的3天缩短到1小时。他们每周运行一次脚本,自动收集市场数据,生成以下报表:

  1. 各岗位薪资区间分布:了解市场行情
  2. 地区薪资差异:为分公司招聘提供参考
  3. 薪资变化趋势:通过历史数据对比发现市场动向

工具还帮助他们发现了几个有趣的现象:

  • 某些新兴岗位的薪资增长远超预期
  • 二线城市与一线城市的薪资差距正在缩小
  • 部分大厂的薪资水平并非行业最高

这些洞察为公司的薪酬策略调整提供了数据支持。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 3:46:40

结构化输出与函数调用的核心差异与应用场景

1. 结构化输出与函数调用的本质差异在构建基于语言模型的智能代理系统时&#xff0c;开发者常面临一个关键架构决策&#xff1a;何时使用结构化输出&#xff08;Structured Outputs&#xff09;&#xff0c;何时采用函数调用&#xff08;Function Calling&#xff09;。这两种机…

作者头像 李华
网站建设 2026/4/24 3:42:20

AI工程师的上下文管理术:让长对话不失忆的工程实践

LLM最大的局限之一&#xff0c;是有限的上下文窗口。GPT-4o有128K token&#xff0c;Gemini 1.5 Pro有100万token——听起来很大&#xff0c;但实际生产中&#xff0c;长对话积累、知识库检索内容、工具调用结果……很快就能填满。更根本的问题是&#xff1a;不是塞满上下文就好…

作者头像 李华
网站建设 2026/4/24 3:42:19

AI 入门 30 天挑战 - Day 18 费曼学习法版 - 图像分割基础

&#x1f31f; 完整项目和代码 本教程是 AI 入门 30 天挑战 系列的一部分&#xff01; &#x1f4bb; GitHub 仓库: https://github.com/Lee985-cmd/AI-30-Day-Challenge&#x1f4d6; CSDN 专栏: https://blog.csdn.net/m0_67081842?typeblog⭐ 欢迎 Star 支持&#xff01;…

作者头像 李华
网站建设 2026/4/24 3:42:18

AI应用的可观测性工程:用Tracing和Logging看清LLM黑盒

“我的RAG系统回答了一个错误答案&#xff0c;但我不知道为什么。” “Agent跑了2分钟什么都没完成&#xff0c;我不知道它在做什么。” “用了新版本Prompt&#xff0c;感觉质量变了&#xff0c;但我说不清楚哪里变了。” 这些是AI工程师最常见的困境&#xff0c;根本原因是缺…

作者头像 李华
网站建设 2026/4/24 3:41:34

终极指南:ESP-IDF项目中NVS分区加密日志的优化实践

终极指南&#xff1a;ESP-IDF项目中NVS分区加密日志的优化实践 【免费下载链接】esp-idf Espressif IoT Development Framework. Official development framework for Espressif SoCs. 项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf ESP-IDF&#xff08;Es…

作者头像 李华