前言在大数据时代招聘数据已成为职场分析、行业趋势研判、求职规划的核心依据。手动收集招聘网站的岗位信息效率低下、数据零散而 Python 爬虫技术能够实现自动化、批量、精准的岗位数据采集快速整合薪资、岗位要求、工作地点、企业规模等关键信息为个人求职、企业调研、行业分析提供强有力的数据支撑。本文将以主流招聘网站为实战目标从零到一实现招聘岗位数据的采集、清洗、存储与汇总分析全程采用可落地的实战代码深度解析爬虫核心原理覆盖环境配置、请求发送、数据解析、反爬应对、数据持久化等全流程知识点。无论你是爬虫初学者还是需要实战项目经验的开发者都能通过本文掌握招聘数据爬虫的完整开发逻辑。本文涉及的核心依赖库及官方文档链接如下读者可直接点击访问获取详细配置说明Requests 库HTTP 网络请求BeautifulSoup4 库HTML 数据解析PyMySQL 库MySQL 数据存储Python 官方文档OpenPyXL 库Excel 数据汇总一、项目需求与技术选型1.1 项目核心需求本项目的核心目标是通过 Python 爬虫实现招聘网站岗位数据的自动化采集具体需求如下批量采集岗位名称、公司名称、薪资范围、工作地点、工作经验、学历要求、岗位描述、发布时间、企业规模、所属行业等核心字段应对招聘网站基础反爬机制保证爬虫稳定运行避免请求被拦截对采集到的原始数据进行清洗去除空值、重复数据、无效字符将清洗后的数据存储到 MySQL 数据库同时导出为 Excel 文件完成数据汇总实现分页爬取支持多页数据的连续采集提升数据获取量。1.2 核心技术选型结合招聘网站的页面结构与爬虫开发的易用性、稳定性本项目选用以下技术栈表格技术 / 库名称核心作用选型原因Python 3.8开发基础语言语法简洁第三方爬虫库生态完善Requests发送 HTTP 请求获取网页源码支持 GET/POST 请求自带请求头配置上手简单BeautifulSoup4解析 HTML 页面提取目标数据无需复杂语法支持标签定位、属性筛选适配静态网页PyMySQL连接 MySQL 数据库实现数据存储轻量级数据库连接库支持增删改查操作OpenPyXL数据导出为 Excel 文件支持 xlsx 格式读写适合中小型数据汇总Time控制请求间隔应对反爬原生 Python 库无需额外安装实现延时请求二、开发环境配置2.1 Python 环境安装本项目基于 Python 3.8 及以上版本开发读者可前往 Python 官方网站下载对应操作系统的安装包安装时务必勾选Add Python to PATH选项完成环境变量配置。安装完成后打开命令提示符CMD输入以下命令验证安装结果bash运行python --version若输出 Python 版本号说明环境配置成功。2.2 第三方依赖库安装本文所有依赖库均可通过pip命令一键安装打开 CMD 依次执行以下命令bash运行# 安装HTTP请求库 pip install requests # 安装HTML解析库 pip install beautifulsoup4 # 安装MySQL连接库 pip install pymysql # 安装Excel操作库 pip install openpyxl安装完成后可通过pip list命令查看已安装的库确认无缺失后即可进入开发阶段。2.3 MySQL 数据库配置为了持久化存储招聘数据需要提前安装并配置 MySQL 数据库下载并安装 MySQL 社区版安装过程中设置 root 用户密码打开 MySQL 客户端创建专用数据库与数据表执行以下 SQL 语句sql-- 创建招聘数据数据库 CREATE DATABASE IF NOT EXISTS recruitment_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 使用数据库 USE recruitment_db; -- 创建岗位信息数据表 CREATE TABLE IF NOT EXISTS job_info ( id INT PRIMARY KEY AUTO_INCREMENT, job_name VARCHAR(255) NOT NULL COMMENT 岗位名称, company_name VARCHAR(255) NOT NULL COMMENT 公司名称, salary VARCHAR(100) COMMENT 薪资范围, work_address VARCHAR(255) COMMENT 工作地点, experience VARCHAR(50) COMMENT 经验要求, education VARCHAR(50) COMMENT 学历要求, job_desc TEXT COMMENT 岗位描述, publish_time VARCHAR(100) COMMENT 发布时间, company_scale VARCHAR(100) COMMENT 企业规模, industry VARCHAR(255) COMMENT 所属行业, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 数据采集时间 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT 招聘岗位信息表;数据表设计覆盖所有核心采集字段utf8mb4编码支持特殊字符存储避免数据乱码。三、爬虫核心原理剖析在编写代码前需深度理解招聘网站爬虫的核心运行原理分为网页请求、数据解析、数据处理、数据存储四大核心环节所有爬虫均遵循该底层逻辑3.1 网页请求原理招聘网站的页面分为静态页面和动态页面本项目针对静态页面开发爬虫通过 Requests 库构造 HTTP 请求模拟浏览器向招聘网站服务器发送请求请求中携带请求头User-Agent、Cookie 等伪装成正常浏览器访问绕过基础反爬服务器接收到合法请求后返回包含岗位数据的 HTML 网页源码若请求失败403、404 状态码代表请求被服务器拦截需要优化请求参数。核心原理HTTP 协议是客户端与服务器通信的基础爬虫的本质是模拟浏览器完成 HTTP 请求获取服务器返回的网页数据。3.2 数据解析原理服务器返回的 HTML 源码是结构化的标签文本需要通过解析库提取目标数据BeautifulSoup4 将 HTML 源码转换为可操作的文档对象通过标签名、class 属性、id 属性、层级关系定位包含岗位数据的标签调用get_text()方法提取标签内的文本数据调用get()方法提取标签属性数据过滤无效标签、空白字符得到标准化的岗位数据。核心原理HTML 是结构化标记语言解析库通过 DOM 树遍历技术精准定位目标数据节点完成数据提取。3.3 反爬应对原理主流招聘网站均设置反爬机制核心应对原理请求头伪装设置 User-Agent 标识浏览器身份避免被识别为爬虫延时请求通过time.sleep()设置请求间隔模拟人工浏览速度避免高频请求触发限流状态码判断仅当响应状态码为 200 时才进行数据解析避免无效数据处理异常捕获捕获网络异常、解析异常保证爬虫不会因单次错误中断运行。核心原理反爬机制的核心是识别非人工访问爬虫通过模拟人工行为降低被识别的概率。3.4 数据存储原理采集到的数据需要持久化存储分为数据库存储和文件存储数据库存储通过 PyMySQL 建立与 MySQL 的连接将结构化数据插入数据表支持后续数据查询、分析文件存储通过 OpenPyXL 将数据写入 Excel 表格方便非技术人员查看、汇总、筛选。核心原理数据持久化是将内存中的临时数据写入磁盘保证数据可长期保存和重复使用。四、招聘网站爬虫实战代码实现4.1 全局配置模块该模块用于定义爬虫全局参数包括请求头、数据库配置、爬取页数、目标 URL 等方便后续维护和修改。python运行# 导入依赖库 import requests from bs4 import BeautifulSoup import pymysql import time import openpyxl # 全局配置 # 请求头伪装浏览器核心反爬配置 HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36, Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9 } # MySQL数据库配置 DB_CONFIG { host: localhost, port: 3306, user: root, password: 你的MySQL密码, db: recruitment_db, charset: utf8mb4 } # 爬取配置目标岗位、爬取页数 KEYWORD Python开发工程师 # 搜索关键词 PAGE_NUM 5 # 爬取5页数据 BASE_URL https://招聘网站地址/search?keyword{}page{} # 替换为真实招聘网站搜索URL # Excel存储路径 EXCEL_PATH 招聘岗位数据汇总.xlsx代码原理全局配置将固定参数集中管理降低代码耦合度请求头是反爬核心模拟 Chrome 浏览器的请求标识数据库配置实现 MySQL 连接参数统一管理。4.2 数据库连接模块该模块实现 MySQL 数据库的连接、关闭和数据插入功能保证数据稳定存储。python运行def get_db_connection(): 创建数据库连接 :return: 数据库连接对象、游标对象 try: conn pymysql.connect(**DB_CONFIG) cursor conn.cursor() print(数据库连接成功) return conn, cursor except Exception as e: print(f数据库连接失败{str(e)}) return None, None def close_db_connection(conn, cursor): 关闭数据库连接 :param conn: 数据库连接对象 :param cursor: 游标对象 if cursor: cursor.close() if conn: conn.close() print(数据库连接已关闭) def insert_job_data(cursor, conn, job_data): 插入单条岗位数据到数据库 :param cursor: 游标对象 :param conn: 数据库连接对象 :param job_data: 岗位数据字典 sql INSERT INTO job_info (job_name, company_name, salary, work_address, experience, education, job_desc, publish_time, company_scale, industry) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) try: cursor.execute(sql, ( job_data[job_name], job_data[company_name], job_data[salary], job_data[work_address], job_data[experience], job_data[education], job_data[job_desc], job_data[publish_time], job_data[company_scale], job_data[industry] )) conn.commit() print(f岗位【{job_data[job_name]}】数据插入成功) except Exception as e: conn.rollback() print(f数据插入失败{str(e)})代码原理get_db_connection()通过 PyMySQL 的connect方法创建数据库连接使用字典解包传入配置参数close_db_connection()遵循先关游标、后关连接的规范释放数据库资源insert_job_data()使用参数化 SQL 语句插入数据避免 SQL 注入风险异常捕获实现事务回滚保证数据一致性。4.3 网页请求与数据解析模块该模块是爬虫核心实现网页源码获取、岗位数据解析、数据清洗功能。python运行def get_page_html(url): 发送GET请求获取网页HTML源码 :param url: 目标网页URL :return: HTML源码字符串 try: # 发送请求设置10秒超时 response requests.get(url, headersHEADERS, timeout10) # 判断响应状态码 if response.status_code 200: # 设置编码解决中文乱码 response.encoding response.apparent_encoding return response.text else: print(f请求失败状态码{response.status_code}) return None except Exception as e: print(f网络请求异常{str(e)}) return None def parse_job_list(html): 解析岗位列表页提取单页所有岗位数据 :param html: 网页HTML源码 :return: 岗位数据列表 job_list [] soup BeautifulSoup(html, html.parser) # 定位岗位列表标签根据实际网站结构修改 job_items soup.find_all(div, class_job-item) # 替换为真实岗位容器class for item in job_items: # 初始化岗位数据字典 job_data {} # 提取岗位名称 job_name_tag item.find(h3, class_job-name) job_data[job_name] job_name_tag.get_text(stripTrue) if job_name_tag else 暂无 # 提取公司名称 company_tag item.find(div, class_company-name) job_data[company_name] company_tag.get_text(stripTrue) if company_tag else 暂无 # 提取薪资范围 salary_tag item.find(span, class_salary) job_data[salary] salary_tag.get_text(stripTrue) if salary_tag else 面议 # 提取工作地点、经验、学历要求 base_info_tag item.find(div, class_job-info) base_info base_info_tag.get_text(stripTrue).split( ) if base_info_tag else [] job_data[work_address] base_info[0] if len(base_info) 0 else 暂无 job_data[experience] base_info[1] if len(base_info) 1 else 不限 job_data[education] base_info[2] if len(base_info) 2 else 不限 # 提取发布时间 publish_tag item.find(span, class_publish-time) job_data[publish_time] publish_tag.get_text(stripTrue) if publish_tag else 暂无 # 提取企业规模、所属行业 company_info_tag item.find(div, class_company-info) company_info company_info_tag.get_text(stripTrue).split(|) if company_info_tag else [] job_data[company_scale] company_info[0].strip() if len(company_info) 0 else 暂无 job_data[industry] company_info[1].strip() if len(company_info) 1 else 暂无 # 提取岗位详情链接爬取岗位描述 detail_link_tag job_name_tag.find(a) if job_name_tag else None if detail_link_tag: detail_url detail_link_tag.get(href) # 补全完整URL if not detail_url.startswith(http): detail_url https://招聘网站地址 detail_url # 获取详情页源码 detail_html get_page_html(detail_url) if detail_html: detail_soup BeautifulSoup(detail_html, html.parser) job_desc_tag detail_soup.find(div, class_job-desc) job_data[job_desc] job_desc_tag.get_text(stripTrue).replace(\n, ).replace( , ) if job_desc_tag else 暂无 else: job_data[job_desc] 暂无 else: job_data[job_desc] 暂无 # 添加到岗位列表 job_list.append(job_data) # 延时1秒避免高频请求 time.sleep(1) return job_list代码原理get_page_html()封装 HTTP 请求逻辑设置超时时间、编码格式处理请求异常返回标准化 HTML 源码parse_job_list()通过 BeautifulSoup 解析 HTML根据标签 class 属性定位数据使用strip()去除空白字符处理空值数据岗位描述需要进入详情页爬取代码实现了详情页 URL 补全、二次请求、数据提取同时添加延时请求应对反爬所有数据均做非空判断保证数据完整性避免程序报错。4.4 数据导出 Excel 模块该模块实现将数据库中的岗位数据导出为 Excel 文件完成数据汇总。python运行def export_to_excel(): 从数据库读取数据导出为Excel文件 # 创建工作簿 workbook openpyxl.Workbook() # 获取默认工作表 sheet workbook.active sheet.title 岗位数据汇总 # 定义表头 headers [序号, 岗位名称, 公司名称, 薪资范围, 工作地点, 经验要求, 学历要求, 岗位描述, 发布时间, 企业规模, 所属行业, 采集时间] sheet.append(headers) # 连接数据库读取数据 conn, cursor get_db_connection() if not conn: return try: cursor.execute(SELECT * FROM job_info) job_datas cursor.fetchall() # 写入数据 for data in job_datas: sheet.append(data) # 保存文件 workbook.save(EXCEL_PATH) print(f数据导出成功文件路径{EXCEL_PATH}) except Exception as e: print(f数据导出失败{str(e)}) finally: close_db_connection(conn, cursor)代码原理通过 OpenPyXL 创建 Excel 工作簿和工作表定义标准化表头从 MySQL 数据库查询所有岗位数据逐行写入 Excel 表格异常捕获保证文件正常保存最终完成数据导出。4.5 主函数模块主函数整合所有模块实现分页爬取、数据入库、数据导出的全流程调用。python运行def main(): 爬虫主函数全流程调度 print(*50) print(招聘网站岗位数据爬虫开始运行) print(*50) # 1. 获取数据库连接 conn, cursor get_db_connection() if not conn: return # 2. 分页爬取岗位数据 for page in range(1, PAGE_NUM 1): print(f\n正在爬取第{page}页数据...) # 拼接分页URL url BASE_URL.format(KEYWORD, page) # 获取网页源码 html get_page_html(url) if not html: print(f第{page}页数据获取失败跳过) continue # 解析岗位数据 job_list parse_job_list(html) if not job_list: print(f第{page}页无岗位数据跳过) continue # 插入数据库 for job in job_list: insert_job_data(cursor, conn, job) # 每页延时2秒 time.sleep(2) # 3. 关闭数据库连接 close_db_connection(conn, cursor) # 4. 导出数据到Excel export_to_excel() print(\n *50) print(招聘网站岗位数据爬虫运行完成) print(*50) # 程序入口 if __name__ __main__: main()代码原理主函数按连接数据库→分页爬取→数据解析→数据入库→关闭连接→数据导出的流程调度分页循环拼接 URL实现多页数据连续爬取每页爬取完成后添加延时降低反爬风险程序入口使用if __name__ __main__:保证代码模块化可直接运行。五、代码使用说明与注意事项5.1 代码使用步骤替换核心参数将代码中的BASE_URL替换为目标招聘网站的真实搜索 URL同时修改标签 class 属性通过浏览器 F12 开发者工具查看配置数据库密码修改DB_CONFIG中的password为自己的 MySQL 密码调整爬取参数根据需求修改KEYWORD岗位关键词和PAGE_NUM爬取页数运行代码直接运行 Python 文件控制台会输出爬取日志最终生成 Excel 文件。5.2 关键适配说明招聘网站的页面结构会不定期更新读者需要通过浏览器开发者工具F12查看岗位数据对应的 HTML 标签打开招聘网站搜索页面右键点击岗位名称选择检查查看岗位名称对应的标签名和 class 属性替换代码中的find_all参数同理适配公司名称、薪资、岗位描述等所有数据的标签定位。5.3 反爬与合规注意事项合规使用本项目仅用于学习和个人研究禁止用于商业用途、批量大规模爬取遵守《网络安全法》和网站的robots.txt协议请求频率严格控制请求间隔禁止高频并发请求避免给目标服务器造成压力数据使用采集的招聘数据仅用于个人分析不得泄露、售卖企业隐私信息动态页面适配若目标网站为动态渲染页面需改用 Selenium 或 Playwright 库。六、项目扩展与优化方向6.1 功能扩展多关键词爬取支持批量关键词如 Java、前端、测试工程师的岗位数据采集实现全品类岗位数据汇总数据去重优化基于岗位名称 公司名称建立唯一索引避免数据库存储重复数据数据可视化结合 Matplotlib/Seaborn 库实现薪资分布、学历要求、城市占比等可视化图表定时爬取结合 APScheduler 库实现每日定时自动爬取实时更新岗位数据异常重试增加请求重试机制针对网络波动导致的请求失败进行自动重试。6.2 性能优化多线程爬取使用 Threading 库实现多线程请求提升爬取效率需严格控制线程数避免反爬连接池优化使用 DBUtils 库实现数据库连接池减少频繁创建 / 关闭连接的资源消耗增量爬取记录最后爬取时间仅爬取新增的岗位数据避免重复爬取日志系统集成 Logging 库记录爬取日志、异常信息方便问题排查。七、项目总结本项目完整实现了招聘网站岗位数据的采集、清洗、存储与汇总全流程从环境配置、原理剖析到代码实战覆盖了 Python 爬虫开发的核心知识点。通过本项目你可以掌握Requests 库发送 HTTP 请求、伪装请求头的核心技巧BeautifulSoup4 解析 HTML 页面、提取结构化数据的方法MySQL 数据库的连接、数据插入、事务管理招聘网站基础反爬机制的应对策略爬虫项目的模块化开发、全流程设计思路。爬虫技术的核心是合法、合规、合理本项目作为学习案例能够帮助你夯实爬虫基础同时培养规范化的开发思维。在实际应用中可根据需求扩展功能、优化性能让爬虫更好地服务于数据分析、职场规划等场景。
Python 爬虫实战:招聘网站岗位数据采集与汇总全攻略
发布时间:2026/6/10 0:21:14
前言在大数据时代招聘数据已成为职场分析、行业趋势研判、求职规划的核心依据。手动收集招聘网站的岗位信息效率低下、数据零散而 Python 爬虫技术能够实现自动化、批量、精准的岗位数据采集快速整合薪资、岗位要求、工作地点、企业规模等关键信息为个人求职、企业调研、行业分析提供强有力的数据支撑。本文将以主流招聘网站为实战目标从零到一实现招聘岗位数据的采集、清洗、存储与汇总分析全程采用可落地的实战代码深度解析爬虫核心原理覆盖环境配置、请求发送、数据解析、反爬应对、数据持久化等全流程知识点。无论你是爬虫初学者还是需要实战项目经验的开发者都能通过本文掌握招聘数据爬虫的完整开发逻辑。本文涉及的核心依赖库及官方文档链接如下读者可直接点击访问获取详细配置说明Requests 库HTTP 网络请求BeautifulSoup4 库HTML 数据解析PyMySQL 库MySQL 数据存储Python 官方文档OpenPyXL 库Excel 数据汇总一、项目需求与技术选型1.1 项目核心需求本项目的核心目标是通过 Python 爬虫实现招聘网站岗位数据的自动化采集具体需求如下批量采集岗位名称、公司名称、薪资范围、工作地点、工作经验、学历要求、岗位描述、发布时间、企业规模、所属行业等核心字段应对招聘网站基础反爬机制保证爬虫稳定运行避免请求被拦截对采集到的原始数据进行清洗去除空值、重复数据、无效字符将清洗后的数据存储到 MySQL 数据库同时导出为 Excel 文件完成数据汇总实现分页爬取支持多页数据的连续采集提升数据获取量。1.2 核心技术选型结合招聘网站的页面结构与爬虫开发的易用性、稳定性本项目选用以下技术栈表格技术 / 库名称核心作用选型原因Python 3.8开发基础语言语法简洁第三方爬虫库生态完善Requests发送 HTTP 请求获取网页源码支持 GET/POST 请求自带请求头配置上手简单BeautifulSoup4解析 HTML 页面提取目标数据无需复杂语法支持标签定位、属性筛选适配静态网页PyMySQL连接 MySQL 数据库实现数据存储轻量级数据库连接库支持增删改查操作OpenPyXL数据导出为 Excel 文件支持 xlsx 格式读写适合中小型数据汇总Time控制请求间隔应对反爬原生 Python 库无需额外安装实现延时请求二、开发环境配置2.1 Python 环境安装本项目基于 Python 3.8 及以上版本开发读者可前往 Python 官方网站下载对应操作系统的安装包安装时务必勾选Add Python to PATH选项完成环境变量配置。安装完成后打开命令提示符CMD输入以下命令验证安装结果bash运行python --version若输出 Python 版本号说明环境配置成功。2.2 第三方依赖库安装本文所有依赖库均可通过pip命令一键安装打开 CMD 依次执行以下命令bash运行# 安装HTTP请求库 pip install requests # 安装HTML解析库 pip install beautifulsoup4 # 安装MySQL连接库 pip install pymysql # 安装Excel操作库 pip install openpyxl安装完成后可通过pip list命令查看已安装的库确认无缺失后即可进入开发阶段。2.3 MySQL 数据库配置为了持久化存储招聘数据需要提前安装并配置 MySQL 数据库下载并安装 MySQL 社区版安装过程中设置 root 用户密码打开 MySQL 客户端创建专用数据库与数据表执行以下 SQL 语句sql-- 创建招聘数据数据库 CREATE DATABASE IF NOT EXISTS recruitment_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 使用数据库 USE recruitment_db; -- 创建岗位信息数据表 CREATE TABLE IF NOT EXISTS job_info ( id INT PRIMARY KEY AUTO_INCREMENT, job_name VARCHAR(255) NOT NULL COMMENT 岗位名称, company_name VARCHAR(255) NOT NULL COMMENT 公司名称, salary VARCHAR(100) COMMENT 薪资范围, work_address VARCHAR(255) COMMENT 工作地点, experience VARCHAR(50) COMMENT 经验要求, education VARCHAR(50) COMMENT 学历要求, job_desc TEXT COMMENT 岗位描述, publish_time VARCHAR(100) COMMENT 发布时间, company_scale VARCHAR(100) COMMENT 企业规模, industry VARCHAR(255) COMMENT 所属行业, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 数据采集时间 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT 招聘岗位信息表;数据表设计覆盖所有核心采集字段utf8mb4编码支持特殊字符存储避免数据乱码。三、爬虫核心原理剖析在编写代码前需深度理解招聘网站爬虫的核心运行原理分为网页请求、数据解析、数据处理、数据存储四大核心环节所有爬虫均遵循该底层逻辑3.1 网页请求原理招聘网站的页面分为静态页面和动态页面本项目针对静态页面开发爬虫通过 Requests 库构造 HTTP 请求模拟浏览器向招聘网站服务器发送请求请求中携带请求头User-Agent、Cookie 等伪装成正常浏览器访问绕过基础反爬服务器接收到合法请求后返回包含岗位数据的 HTML 网页源码若请求失败403、404 状态码代表请求被服务器拦截需要优化请求参数。核心原理HTTP 协议是客户端与服务器通信的基础爬虫的本质是模拟浏览器完成 HTTP 请求获取服务器返回的网页数据。3.2 数据解析原理服务器返回的 HTML 源码是结构化的标签文本需要通过解析库提取目标数据BeautifulSoup4 将 HTML 源码转换为可操作的文档对象通过标签名、class 属性、id 属性、层级关系定位包含岗位数据的标签调用get_text()方法提取标签内的文本数据调用get()方法提取标签属性数据过滤无效标签、空白字符得到标准化的岗位数据。核心原理HTML 是结构化标记语言解析库通过 DOM 树遍历技术精准定位目标数据节点完成数据提取。3.3 反爬应对原理主流招聘网站均设置反爬机制核心应对原理请求头伪装设置 User-Agent 标识浏览器身份避免被识别为爬虫延时请求通过time.sleep()设置请求间隔模拟人工浏览速度避免高频请求触发限流状态码判断仅当响应状态码为 200 时才进行数据解析避免无效数据处理异常捕获捕获网络异常、解析异常保证爬虫不会因单次错误中断运行。核心原理反爬机制的核心是识别非人工访问爬虫通过模拟人工行为降低被识别的概率。3.4 数据存储原理采集到的数据需要持久化存储分为数据库存储和文件存储数据库存储通过 PyMySQL 建立与 MySQL 的连接将结构化数据插入数据表支持后续数据查询、分析文件存储通过 OpenPyXL 将数据写入 Excel 表格方便非技术人员查看、汇总、筛选。核心原理数据持久化是将内存中的临时数据写入磁盘保证数据可长期保存和重复使用。四、招聘网站爬虫实战代码实现4.1 全局配置模块该模块用于定义爬虫全局参数包括请求头、数据库配置、爬取页数、目标 URL 等方便后续维护和修改。python运行# 导入依赖库 import requests from bs4 import BeautifulSoup import pymysql import time import openpyxl # 全局配置 # 请求头伪装浏览器核心反爬配置 HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36, Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9 } # MySQL数据库配置 DB_CONFIG { host: localhost, port: 3306, user: root, password: 你的MySQL密码, db: recruitment_db, charset: utf8mb4 } # 爬取配置目标岗位、爬取页数 KEYWORD Python开发工程师 # 搜索关键词 PAGE_NUM 5 # 爬取5页数据 BASE_URL https://招聘网站地址/search?keyword{}page{} # 替换为真实招聘网站搜索URL # Excel存储路径 EXCEL_PATH 招聘岗位数据汇总.xlsx代码原理全局配置将固定参数集中管理降低代码耦合度请求头是反爬核心模拟 Chrome 浏览器的请求标识数据库配置实现 MySQL 连接参数统一管理。4.2 数据库连接模块该模块实现 MySQL 数据库的连接、关闭和数据插入功能保证数据稳定存储。python运行def get_db_connection(): 创建数据库连接 :return: 数据库连接对象、游标对象 try: conn pymysql.connect(**DB_CONFIG) cursor conn.cursor() print(数据库连接成功) return conn, cursor except Exception as e: print(f数据库连接失败{str(e)}) return None, None def close_db_connection(conn, cursor): 关闭数据库连接 :param conn: 数据库连接对象 :param cursor: 游标对象 if cursor: cursor.close() if conn: conn.close() print(数据库连接已关闭) def insert_job_data(cursor, conn, job_data): 插入单条岗位数据到数据库 :param cursor: 游标对象 :param conn: 数据库连接对象 :param job_data: 岗位数据字典 sql INSERT INTO job_info (job_name, company_name, salary, work_address, experience, education, job_desc, publish_time, company_scale, industry) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) try: cursor.execute(sql, ( job_data[job_name], job_data[company_name], job_data[salary], job_data[work_address], job_data[experience], job_data[education], job_data[job_desc], job_data[publish_time], job_data[company_scale], job_data[industry] )) conn.commit() print(f岗位【{job_data[job_name]}】数据插入成功) except Exception as e: conn.rollback() print(f数据插入失败{str(e)})代码原理get_db_connection()通过 PyMySQL 的connect方法创建数据库连接使用字典解包传入配置参数close_db_connection()遵循先关游标、后关连接的规范释放数据库资源insert_job_data()使用参数化 SQL 语句插入数据避免 SQL 注入风险异常捕获实现事务回滚保证数据一致性。4.3 网页请求与数据解析模块该模块是爬虫核心实现网页源码获取、岗位数据解析、数据清洗功能。python运行def get_page_html(url): 发送GET请求获取网页HTML源码 :param url: 目标网页URL :return: HTML源码字符串 try: # 发送请求设置10秒超时 response requests.get(url, headersHEADERS, timeout10) # 判断响应状态码 if response.status_code 200: # 设置编码解决中文乱码 response.encoding response.apparent_encoding return response.text else: print(f请求失败状态码{response.status_code}) return None except Exception as e: print(f网络请求异常{str(e)}) return None def parse_job_list(html): 解析岗位列表页提取单页所有岗位数据 :param html: 网页HTML源码 :return: 岗位数据列表 job_list [] soup BeautifulSoup(html, html.parser) # 定位岗位列表标签根据实际网站结构修改 job_items soup.find_all(div, class_job-item) # 替换为真实岗位容器class for item in job_items: # 初始化岗位数据字典 job_data {} # 提取岗位名称 job_name_tag item.find(h3, class_job-name) job_data[job_name] job_name_tag.get_text(stripTrue) if job_name_tag else 暂无 # 提取公司名称 company_tag item.find(div, class_company-name) job_data[company_name] company_tag.get_text(stripTrue) if company_tag else 暂无 # 提取薪资范围 salary_tag item.find(span, class_salary) job_data[salary] salary_tag.get_text(stripTrue) if salary_tag else 面议 # 提取工作地点、经验、学历要求 base_info_tag item.find(div, class_job-info) base_info base_info_tag.get_text(stripTrue).split( ) if base_info_tag else [] job_data[work_address] base_info[0] if len(base_info) 0 else 暂无 job_data[experience] base_info[1] if len(base_info) 1 else 不限 job_data[education] base_info[2] if len(base_info) 2 else 不限 # 提取发布时间 publish_tag item.find(span, class_publish-time) job_data[publish_time] publish_tag.get_text(stripTrue) if publish_tag else 暂无 # 提取企业规模、所属行业 company_info_tag item.find(div, class_company-info) company_info company_info_tag.get_text(stripTrue).split(|) if company_info_tag else [] job_data[company_scale] company_info[0].strip() if len(company_info) 0 else 暂无 job_data[industry] company_info[1].strip() if len(company_info) 1 else 暂无 # 提取岗位详情链接爬取岗位描述 detail_link_tag job_name_tag.find(a) if job_name_tag else None if detail_link_tag: detail_url detail_link_tag.get(href) # 补全完整URL if not detail_url.startswith(http): detail_url https://招聘网站地址 detail_url # 获取详情页源码 detail_html get_page_html(detail_url) if detail_html: detail_soup BeautifulSoup(detail_html, html.parser) job_desc_tag detail_soup.find(div, class_job-desc) job_data[job_desc] job_desc_tag.get_text(stripTrue).replace(\n, ).replace( , ) if job_desc_tag else 暂无 else: job_data[job_desc] 暂无 else: job_data[job_desc] 暂无 # 添加到岗位列表 job_list.append(job_data) # 延时1秒避免高频请求 time.sleep(1) return job_list代码原理get_page_html()封装 HTTP 请求逻辑设置超时时间、编码格式处理请求异常返回标准化 HTML 源码parse_job_list()通过 BeautifulSoup 解析 HTML根据标签 class 属性定位数据使用strip()去除空白字符处理空值数据岗位描述需要进入详情页爬取代码实现了详情页 URL 补全、二次请求、数据提取同时添加延时请求应对反爬所有数据均做非空判断保证数据完整性避免程序报错。4.4 数据导出 Excel 模块该模块实现将数据库中的岗位数据导出为 Excel 文件完成数据汇总。python运行def export_to_excel(): 从数据库读取数据导出为Excel文件 # 创建工作簿 workbook openpyxl.Workbook() # 获取默认工作表 sheet workbook.active sheet.title 岗位数据汇总 # 定义表头 headers [序号, 岗位名称, 公司名称, 薪资范围, 工作地点, 经验要求, 学历要求, 岗位描述, 发布时间, 企业规模, 所属行业, 采集时间] sheet.append(headers) # 连接数据库读取数据 conn, cursor get_db_connection() if not conn: return try: cursor.execute(SELECT * FROM job_info) job_datas cursor.fetchall() # 写入数据 for data in job_datas: sheet.append(data) # 保存文件 workbook.save(EXCEL_PATH) print(f数据导出成功文件路径{EXCEL_PATH}) except Exception as e: print(f数据导出失败{str(e)}) finally: close_db_connection(conn, cursor)代码原理通过 OpenPyXL 创建 Excel 工作簿和工作表定义标准化表头从 MySQL 数据库查询所有岗位数据逐行写入 Excel 表格异常捕获保证文件正常保存最终完成数据导出。4.5 主函数模块主函数整合所有模块实现分页爬取、数据入库、数据导出的全流程调用。python运行def main(): 爬虫主函数全流程调度 print(*50) print(招聘网站岗位数据爬虫开始运行) print(*50) # 1. 获取数据库连接 conn, cursor get_db_connection() if not conn: return # 2. 分页爬取岗位数据 for page in range(1, PAGE_NUM 1): print(f\n正在爬取第{page}页数据...) # 拼接分页URL url BASE_URL.format(KEYWORD, page) # 获取网页源码 html get_page_html(url) if not html: print(f第{page}页数据获取失败跳过) continue # 解析岗位数据 job_list parse_job_list(html) if not job_list: print(f第{page}页无岗位数据跳过) continue # 插入数据库 for job in job_list: insert_job_data(cursor, conn, job) # 每页延时2秒 time.sleep(2) # 3. 关闭数据库连接 close_db_connection(conn, cursor) # 4. 导出数据到Excel export_to_excel() print(\n *50) print(招聘网站岗位数据爬虫运行完成) print(*50) # 程序入口 if __name__ __main__: main()代码原理主函数按连接数据库→分页爬取→数据解析→数据入库→关闭连接→数据导出的流程调度分页循环拼接 URL实现多页数据连续爬取每页爬取完成后添加延时降低反爬风险程序入口使用if __name__ __main__:保证代码模块化可直接运行。五、代码使用说明与注意事项5.1 代码使用步骤替换核心参数将代码中的BASE_URL替换为目标招聘网站的真实搜索 URL同时修改标签 class 属性通过浏览器 F12 开发者工具查看配置数据库密码修改DB_CONFIG中的password为自己的 MySQL 密码调整爬取参数根据需求修改KEYWORD岗位关键词和PAGE_NUM爬取页数运行代码直接运行 Python 文件控制台会输出爬取日志最终生成 Excel 文件。5.2 关键适配说明招聘网站的页面结构会不定期更新读者需要通过浏览器开发者工具F12查看岗位数据对应的 HTML 标签打开招聘网站搜索页面右键点击岗位名称选择检查查看岗位名称对应的标签名和 class 属性替换代码中的find_all参数同理适配公司名称、薪资、岗位描述等所有数据的标签定位。5.3 反爬与合规注意事项合规使用本项目仅用于学习和个人研究禁止用于商业用途、批量大规模爬取遵守《网络安全法》和网站的robots.txt协议请求频率严格控制请求间隔禁止高频并发请求避免给目标服务器造成压力数据使用采集的招聘数据仅用于个人分析不得泄露、售卖企业隐私信息动态页面适配若目标网站为动态渲染页面需改用 Selenium 或 Playwright 库。六、项目扩展与优化方向6.1 功能扩展多关键词爬取支持批量关键词如 Java、前端、测试工程师的岗位数据采集实现全品类岗位数据汇总数据去重优化基于岗位名称 公司名称建立唯一索引避免数据库存储重复数据数据可视化结合 Matplotlib/Seaborn 库实现薪资分布、学历要求、城市占比等可视化图表定时爬取结合 APScheduler 库实现每日定时自动爬取实时更新岗位数据异常重试增加请求重试机制针对网络波动导致的请求失败进行自动重试。6.2 性能优化多线程爬取使用 Threading 库实现多线程请求提升爬取效率需严格控制线程数避免反爬连接池优化使用 DBUtils 库实现数据库连接池减少频繁创建 / 关闭连接的资源消耗增量爬取记录最后爬取时间仅爬取新增的岗位数据避免重复爬取日志系统集成 Logging 库记录爬取日志、异常信息方便问题排查。七、项目总结本项目完整实现了招聘网站岗位数据的采集、清洗、存储与汇总全流程从环境配置、原理剖析到代码实战覆盖了 Python 爬虫开发的核心知识点。通过本项目你可以掌握Requests 库发送 HTTP 请求、伪装请求头的核心技巧BeautifulSoup4 解析 HTML 页面、提取结构化数据的方法MySQL 数据库的连接、数据插入、事务管理招聘网站基础反爬机制的应对策略爬虫项目的模块化开发、全流程设计思路。爬虫技术的核心是合法、合规、合理本项目作为学习案例能够帮助你夯实爬虫基础同时培养规范化的开发思维。在实际应用中可根据需求扩展功能、优化性能让爬虫更好地服务于数据分析、职场规划等场景。