使用Python爬取BOSS直聘职位数据并保存到Excel
在数据分析和挖掘中,爬取招聘网站数据是一项常见的任务。本文将详细介绍如何使用Python爬取BOSS直聘上与“测试工程师”相关的职位数据,并将其保存到Excel文件中。通过逐步分解代码和添加详细注释,我们将深入了解整个实现过程。
项目概述
本项目的功能是爬取BOSS直聘指定条件的职位数据,并将数据保存到Excel文件。以下是主要步骤:
- 配置浏览器驱动:使用Selenium模拟用户操作。
- 加载网页:动态加载职位列表。
- 解析职位信息:提取职位的名称、薪资、技能要求等。
- 保存数据:数据持久化到Excel文件,并为列标题添加注释,便于理解。
环境准备
安装依赖库
请确保已安装以下库:
pip install selenium pandas openpyxl
下载ChromeDriver
根据你的Chrome浏览器版本,下载对应的ChromeDriver,并将其路径配置到代码中。
我这里是用的chrome浏览器:
先查看浏览器版本
详细代码解析
1. 配置Selenium WebDriver
目标:通过Selenium启动浏览器,模拟用户访问BOSS直聘。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
def setup_driver():
"""
配置并启动Selenium WebDriver,用于模拟浏览器操作。
:return: 返回配置完成的Chrome浏览器驱动对象。
"""
options = webdriver.ChromeOptions()
# 添加可选的启动参数
# options.add_argument('--headless') # 无头模式,隐藏浏览器界面
# options.add_argument('--disable-gpu') # 禁用GPU,优化性能
# options.add_argument('--no-sandbox') # 禁用沙箱模式
# options.add_argument('--start-maximized') # 最大化窗口
# 创建浏览器驱动服务
service = Service('D:\\tool\\chromedriver-win64\\chromedriver.exe')
# 初始化WebDriver
driver = webdriver.Chrome(service=service, options=options)
return driver
- 重点:
webdriver.ChromeOptions
可以设置浏览器的启动参数,如无头模式(headless)。 - 路径配置:
Service
指定了ChromeDriver的路径。
2. 加载网页并滚动加载
目标:加载指定页面,并模拟滚动加载更多内容。
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
def scrape_jobs(driver, url):
"""
爬取BOSS直聘的职位数据。
:param driver: 已配置的Selenium WebDriver实例。
:param url: BOSS直聘的目标页面URL。
:return: 返回包含职位信息的列表。
"""
driver.get(url) # 打开指定页面
time.sleep(15) # 等待页面完全加载
# 模拟滚动操作,加载更多职位信息
for _ in range(5): # 假设需要滚动5次加载更多内容
driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.END)
time.sleep(2) # 等待页面加载完成
# 定位职位列表
jobs = driver.find_elements(By.CSS_SELECTOR, '.job-list-box > li') # 找到所有职位块
job_data = [] # 用于存储职位数据
- 页面滚动:通过发送
Keys.END
键模拟用户滚动操作。 - 延迟加载:
time.sleep
确保页面元素完全加载。
3. 提取职位数据
目标:解析页面中每个职位的数据。
for job in jobs:
try:
# 获取职位信息
job_link_element = job.find_element(By.CSS_SELECTOR, '.job-card-left') # 职位链接所在的元素
job_link = job_link_element.get_attribute('href') # 获取链接
job_name = job.find_element(By.CSS_SELECTOR, '.job-name').text # 职位名称
salary_desc = job.find_element(By.CSS_SELECTOR, '.salary').text # 薪资描述
city_area = job.find_element(By.CSS_SELECTOR, '.job-area').text.split('·') # 城市和区域
city_name = city_area[0] # 城市名称
area_district = city_area[1] if len(city_area) > 1 else "" # 区域名称
# 获取技能标签
skills = [skill.text for skill in job.find_elements(By.CSS_SELECTOR, '.job-card-footer .tag-list li')]
# 获取经验和学历要求
tags = job.find_elements(By.CSS_SELECTOR, '.job-info .tag-list li')
job_experience = tags[0].text if len(tags) > 0 else "" # 工作年限要求