恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

招聘数据分析全流程:requests采集、文本清洗与pandas透视表

  • 首页
  • 资讯中心
  • /
  • 招聘数据分析全流程:requests采集、文本清洗与pandas透视表

相关资讯

AI工具助力学术开题报告写作:9大核心工具评测与实战指南 2026/9/12 11:29:47
nautilus-plugin 插件系统指南:NautilusTrader 的 C-ABI 边界契约与版本化产物身份 2026/9/12 11:29:47
Rust错误处理机制详解:从Option到高级技巧 2026/9/12 11:24:46

最新资讯

SAR欺骗干扰原理与MATLAB仿真:从延时移频到假目标成像
微软运行库合集:解决DLL缺失问题的完整指南
大数据分析全链路解析:从SQL基础到Spark集群部署与面试实战
Goldie:用编码Agent自动生成App Store截图与预览视频
Midscene.js:用自然语言驱动 E2E 自动化测试,不必写选择器
ruflo 集体智能协调器:基于拜占庭容错共识与注意力机制的蜂群决策实战指南

今日推荐

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现
【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)
【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

本周热门

超人会飞不算本事:系统稳定依赖清晰规则与边界设计
超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论
基于CNN的调制信号识别:MATLAB实现时频图分类实战

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

招聘数据分析全流程:requests采集、文本清洗与pandas透视表

发布时间:2026/9/12 11:29:47
招聘数据分析全流程:requests采集、文本清洗与pandas透视表 简介面向Python学习者、数据采集与数据分析方向的开发者以及需要完成毕业设计或期末大作业的高校学生这是一份可直接运行的招聘网站招聘信息分析项目。压缩包内共包含2000个文件其中Python源码1681个覆盖数据采集、清洗、分析与可视化等模块前端有126个HTML文件、86个JavaScript文件与23个CSS文件可支撑结果展示与交互另有35个文本文件、4个JSON数据文件及11个PDF说明文档用于理解数据格式与使用规范。压缩包整体约84.14MB大小适中便于下载与部署。目前已有92人学习/下载。项目经过助教老师审定难度适中所有源码均已在本地编译验证学习者可直接运行并二次开发适合作为课程设计、毕业设计参考也可完整理解招聘数据从获取到呈现的流程。1. 招聘信息分析项目先看工程包再看代码解压基于Python的招聘网站招聘信息分析源码包之后第一件事不是打开IDE而是把目录结构和样例数据过一遍。包里既有fortranobject.c这类numpy编译中间文件也有jquery-ui.min.css、select2.css这类前端静态资源说明这不是单脚本爬虫而是从数据采集、字段清洗到可视化展示的完整链路。这类工程适合做毕业设计和期末大作业的起点也适合想复现岗位薪资与技能需求分布的一线开发者。运行前先确认数据集规模、字段列表和入口脚本能省掉大半天排错时间。2. 招聘数据采集requests请求参数与反爬规避2.1 请求头伪装为何要写在采集函数最前面招聘网站的列表页和详情页大多走JSON接口分析工程里常见的做法是用requests逐页拉取再把响应JSON交给后续清洗模块。问题在于如果直接带默认请求头发请求服务端会按访问频率和UA指纹很快把请求拒掉。所以这类源码里第一个模块通常是请求构造把User-Agent、Referer、Accept放在同一个headers字典里再传给requests.get。import requests import random from fake_useragent import UserAgent ua UserAgent() def fetch_job_list(city: str, keyword: str, page: int 1, page_size: int 30) - dict: url https://example.com/api/job/search params { city: city, # 城市编码代码库里映射表统一维护 query: keyword, # 岗位关键词如“数据分析” page: page, # 页码从1开始 pageSize: page_size # 单页条数多数站点上限30~50 } headers { User-Agent: ua.random, Referer: https://example.com/, Accept: application/json, text/plain, */* } resp requests.get(url, paramsparams, headersheaders, timeout10) resp.raise_for_status() return resp.json()url、params、headers三个参数分别控制请求地址、查询条件和客户端指纹。User-Agent来自fake_useragent库的随机池每次请求换一个值配合Referer字段让请求看起来是从站内页面点击产生的。timeout10是连接超时防止单个页面卡住拖垮整个采集循环。raise_for_status()会在状态码为4xx或5xx时抛出异常排查“到底是IP被限制了还是参数写错了”这个问题时看异常类型就够了。提示fake_useragent库偶尔会因内置数据陈旧冷启动报错可以直接用一个常用浏览器UA字符串数组随机取用。2.2 分页循环的终止条件与断点续抓分页采集最怕两种情况没加终止条件导致无限循环或者中途断了只能从头再跑。常见做法是同时检查返回数据条数和最大页码上限。import time def collect_all(city: str, keyword: str, max_pages: int 30) - list: results [] for page in range(1, max_pages 1): data fetch_job_list(city, keyword, page) items data.get(data, {}).get(list, []) if not items: # 空列表即到达最后一页 break results.extend(items) time.sleep(random.uniform(1, 3)) # 请求间隔随机避免高频访问 return resultsmax_pages设成30是防御性上限实际岗位数据量用不到30页。items为空就break是分页循环最稳妥的出口比预设总页数更可靠。time.sleep(random.uniform(1, 3))把请求间隔随机化相比固定sleep更能打散访问特征也避免对源站造成过大压力。采集完的结果尽早落盘为csv或json后续清洗步骤不重复请求网络同时也能保留一份原始数据用于复盘。常见反爬手段和这类源码里的应对方式可以整理成一张排查表反爬手段拦截特征分析项目里的应对高频IP封禁连续请求后返回403或验证码请求间隔1至3秒随机化UA指纹识别默认python-requests头fake_useragent随机UA参数签名请求头缺少x-sign等字段从页面静态资源里取token后缓存登录态失效返回401或跳转登录页定期刷新cookie并合并进headers这个方案目前是顺序逐页爬取在毕业设计和期末大作业的样本规模下足够用了也更好在答辩时把逻辑讲清楚。如果以后要处理几十万级岗位数据可以把请求层换成Scrapy的Downloader Middleware但当前工程包的难度标定就是适中用requests更直观。3. 岗位文本与薪资区间清洗的必要步骤3.1 非结构化岗位描述文本的标准化采集到的岗位信息里岗位描述字段经常带HTML标签、全角空格和换行符直接拿来做关键词统计时标签会被当成单词计入频次分析结果直接失真。标准化清洗分三步走去标签、统一空白符、去首尾空白最终把一段不确定长度的文本压缩成干净的一行字符串。import re def clean_job_text(raw: str) - str: if not isinstance(raw, str): return text re.sub(r[^], , raw) # 去掉描述里的HTML标签 text text.replace(\u3000, ).replace(\xa0, ) text re.sub(r\s, , text) # 连续空白合并为一个 return text.strip()re.sub(r[^], , raw)匹配从到的所有标签并替换成空字符串。replace处理全角空格和nbspre.sub(r\s, , text)把连续换行、制表符、空格统一成单个普通空格。最后strip()去掉首尾空白。这里有个细节如果数据里存在嵌套标签[^]的贪婪匹配会一直找到最远的那个再整体删除处理嵌套场景反而比非贪婪写法更干净。清洗之后可以顺手做两件事过滤空岗位文本以及把字数过少的记录剔除。岗位描述长度小于30个字符的大部分是无价值挂靠岗位这个阈值在项目中可以按人工抽查200条后的经验来定属于可解释的决策参数写入分析报告时比随便填一个数更有说服力。3.2 薪资字段10k-15k的区间解析与缺失值处理薪资字段的真实形态是“10k-15k”“8千-1.2万”“面议”“实习200/天”如果直接放在坐标轴里排序和聚合都做不了。需要先把字符串解析成数值区间再把“面议”这类缺失值单独标记出来不能无脑填充0。下面这段解析逻辑在多数招聘分析源码里都能看到类似版本。def parse_salary(salary_str: str) - tuple: if not salary_str or 面议 in salary_str: return (None, None) salary_str salary_str.replace(k, 千).replace(K, 千) nums re.findall(r\d\.?\d*, salary_str) if len(nums) 2: unit 10000 if 万 in salary_str else 1000 low float(nums[0]) * unit high float(nums[1]) * unit return (low, high) if len(nums) 1: unit 10000 if 万 in salary_str else 1000 single float(nums[0]) * unit return (single, single) return (None, None)replace先把“k”和“K”统一成“千”大小写问题消失。re.findall提取所有数字常见格式“10-15k”取到两个数“8千-1.2万”取到两个数。unit先判断“万”再乘对应倍率返回的元组统一成元/月。None的情况保留不填充后面用dropna()丢弃。按天计薪的实习岗位与月薪区间量纲不一致直接过滤掉更符合分析目标。解析过后生成一个平均薪资字段就是(low high) / 2单位仍然是元/月。下面这组对照表可以当单元测试用例用原始文本解析结果(元/月)备注10k-15k(10000, 15000)标准区间取两端8千-1.2万(8000, 12000)跨单位需要先统一实习200/天(None, None)量纲不一致过滤面议(None, None)缺失值不填充0把这份清洗结果和上一节的text整合进DataFrame后字段只剩结构化变量。接下来可以做分组统计和交叉分析进入真正出成果的阶段。4. 岗位技能词频统计与薪资数据透视分析4.1 技能关键词词典的聚合统计岗位描述清洗后汇总到DataFrame里的一列。统计技能需求时维护关键词词典比直接用分词器更稳定。中文描述里“熟练使用Python”和“Python基础扎实”表达的是同一个需求分词后很难自动合并词典匹配可以直接命中。技能词典按规则收集成list规模在几十个词内时线性扫描的耗时完全可以接受。from collections import Counter skill_dict [python, java, spark, hadoop, sql, 机器学习, 深度学习] def count_skills(text_list): counter Counter() for text in text_list: lower_text text.lower() for skill in skill_dict: if skill in lower_text: counter[skill] 1 return countertext.lower()把大写统一成小写后再匹配“Python”和“python”都命中同一个词。Counter是collections标准库的计数对象后面输出词频排序直接counter.most_common()。技能维度可以和薪资字段联表技能命中数高的岗位平均薪资是否显著更高是分析报告里最有价值的一张图。采集2000条岗位样本时词典匹配能在秒级内出结果对毕业设计和期末大作业的体量非常合适。提示样本量过万之后可以考虑用jieba分词配合停用词表做词频统计但词典匹配更适合解释每个关键词的业务含义。下面这组是清洗后最常见的输出形态主键是技能关键词附带命中数和平均薪资两个衍生字段方便做后续排序和图表标注技能关键词命中岗位数平均月薪(元)python18616400sql20315200机器学习9722600java152178004.2 用pandas透视表看学历、城市与薪资的关系薪资分布的分析维度通常是城市加学历再叠加工作经验要求。用pandas自带的pivot_table可以把明细表压缩成交叉表既方便导出Excel也方便直接传给seaborn画热力图。下面这段就是典型的透视表写法。import pandas as pd pivot df.pivot_table( indexdegree, # 行学历要求 columnscity, # 列工作城市 valuesavg_salary, # 值平均月薪 aggfuncmedian # 聚合中位数而非均值 ) pivot.to_csv(salary_pivot.csv, encodingutf-8-sig)index、columns、values、aggfunc四个参数决定交叉表的维度。学历作行索引城市作列索引值是平均薪资的中位数。选median而不是mean是因为招聘数据普遍右偏个别总监级五六万的岗位会把均值拉高中位数更能代表普通岗位水平。to_csv用utf-8-sig编码是为了让Excel打开时不显示乱码后续要导入Word或做PPT汇报都能省不少功夫。把pivot对象接着画热力图输出png供论文或文档直接插入import matplotlib.pyplot as plt import seaborn as sns sns.set(fontSimHei) # 解决中文标注 fig, ax plt.subplots(figsize(12, 8)) sns.heatmap(pivot, annotTrue, fmt.0f, cmapYlOrRd, axax) ax.set_title(不同城市学历要求的薪资中位数) fig.savefig(salary_heatmap.png, dpi150, bbox_inchestight)annotTrue在格子内显示薪资数值fmt.0f取整避免数字过长。cmapYlOrRd是黄红渐变浅色低薪深色高薪。bbox_inchestight裁掉多余留白dpi150保证图清晰度。整张图保存成png插入论文时不用再转格式。透视表出图后如果发现某一整行全是NaN先回数据清洗阶段查城市字段是否有别名别忽略“北京”和“北京市”这类重复写法。5. 本地复现时的环境对齐与常见报错处理5.1 依赖版本冲突与编译文件缺失的定位方法压缩包里能看到fortranobject.c、gfortran_vs2003_hack.c这类文件说明项目依赖过numpy或scipy的旧版构建产物。新环境上跑的时候最常见的报错是DLL加载失败或找不到符号原因往往是pip装了新版numpy而源码编译时代码还是旧接口。优先用python 3.9配numpy 1.21.x这组组合与多数教学型源码兼容性都更好。项目说明里如果给了requirements.txt按锁定的版本安装不要轻易upgrade。pip install -r requirements.txt python check_env.py如果报错信息出现“DLL load failed while importing _multiarray_umath”是numpy二进制版本和Python版本不匹配卸载重装指定版本即可。出现“undefined symbol”则优先怀疑scipy与numpy版本不协调把两个包固定为requirements里列出的组合。5.2 图表中文字体乱码的快速修正matplotlib默认字体不含中文绘图出现方框乱码时不需要重装字体脚本开头加三行就能全局生效。import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False第一行指定SimHei作为缺省无衬线字体第二行关闭坐标轴负号的unicode处理否则负号会显示成方块。Windows没有SimHei时替换成Microsoft YaHeimacOS下换成Arial Unicode MS。这套写法对运行环境的要求最低也适合放在说明文档里让其他人快速复现。最后一步在清洗和可视化之间各加一条断言保证任何一步意外改动都不会把脏数据带到绘图环节。assert df.shape[0] 0, 清洗后数据为空 assert df[avg_salary].notna().sum() / len(df) 0.7, 薪资缺失超过30%两行断言分别守住数据量和字段完整率。数据集更换后再次运行如果清洗逻辑出了问题脚本会停在断言位置不会带着脏数据生成一堆没法解释的图表。交付分析结果前跑一遍能省掉和论文图片对不上的返工时间。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号