人事小姐姐也能看懂的教程:用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作为代码编辑器它界面友好且支持中文下载并安装VS Code安装Python扩展插件创建一个新文件夹作为项目目录在该文件夹中新建一个.py文件比如salary_report.py2. 编写第一个自动化脚本2.1 基础脚本框架让我们从一个最简单的脚本开始它会打开Boss直聘首页from playwright.sync_api import sync_playwright with sync_playwright() as p: browser p.chromium.launch(headlessFalse) # 显示浏览器窗口 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[namequery]).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_pages5): 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 data4. 数据存储与报表生成4.1 使用pandas整理数据将抓取到的数据转换为DataFrame格式import pandas as pd def save_to_excel(data, filenamesalary_report.xlsx): df pd.DataFrame(data, columns[公司名称, 职位名称, 薪资范围, 工作地点]) df.to_excel(filename, indexFalse) 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原始数据, indexFalse) 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_titleJava工程师, max_pages3): all_data [] with sync_playwright() as p: browser p.chromium.launch(headlessFalse) page browser.new_page() # 访问Boss直聘 page.goto(https://www.zhipin.com/) time.sleep(2) # 等待页面加载 # 搜索职位 page.locator(input[namequery]).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 installExcel文件损坏写入冲突确保文件未被其他程序打开6. 进阶技巧与扩展应用6.1 添加随机延迟避免被封网站通常会有反爬机制我们可以添加随机延迟来模拟人类操作import random def random_delay(min1, max3): time.sleep(random.uniform(min, max)) # 在关键操作间调用 random_delay()6.2 处理登录状态如果需要查看更多数据可能需要处理登录状态def login(page, phone, password): page.goto(https://www.zhipin.com/web/user/?kaheader-login) page.locator(input[namephone]).fill(phone) random_delay(0.5, 1.5) page.locator(input[namepassword]).fill(password) random_delay(0.5, 1.5) page.locator(button[typesubmit]).click() page.wait_for_selector(.user-name) # 等待登录成功6.3 扩展应用场景这套方法不仅适用于Boss直聘稍作修改也可用于其他招聘平台拉勾网修改URL和元素选择器智联招聘调整翻页逻辑猎聘网可能需要处理更多动态加载内容对于完全不懂编程的同事你可以将脚本打包成exe文件他们只需双击运行即可pip install pyinstaller pyinstaller --onefile salary_report.py7. 实际应用案例某中型互联网公司HR部门使用这套工具后薪资调研时间从原来的3天缩短到1小时。他们每周运行一次脚本自动收集市场数据生成以下报表各岗位薪资区间分布了解市场行情地区薪资差异为分公司招聘提供参考薪资变化趋势通过历史数据对比发现市场动向工具还帮助他们发现了几个有趣的现象某些新兴岗位的薪资增长远超预期二线城市与一线城市的薪资差距正在缩小部分大厂的薪资水平并非行业最高这些洞察为公司的薪酬策略调整提供了数据支持。