type
status
date
slug
summary
tags
category
icon
password
能力模型
能力分类
省赛
全球总决赛
学习进度
中国总决赛
一、项目简介
本项目旨在利用爬虫技术从51job网站获取招聘信息,并通过数据可视化技术展示这些数据。通过分析招聘信息的城市薪资对比、学历工资对比、公司规模招聘数量、各省份平均工资以及岗位描述词云等内容,帮助用户更好地了解当前就业市场的情况和趋势。
1.选题来源:
通过知乎、CSDN、微信公众号、哔哩哔哩等网站搜索相关数据可视化案例,我搜集了一些数据可视化选题及其相关实现的技术栈,经个人兴趣、难度考量以及结合了当前就业问题这一社会热点,我决定对招聘网站的数据进行爬取。
2.主要使的Python相关库
- requests
requests 是一个非常流行的Python HTTP库,它允许以非常简单的方式发送HTTP请求。无论是GET、POST还是其他类型的HTTP请求,requests都能轻松处理。这个库被广泛应用于网页内容抓取(爬虫)、API接口调用、自动化测试等领域,因为它提供了简洁易用的API,能够极大地简化网络请求的编写过程。DrissionPage
- Matplotlib
Matplotlib 是Python中最常用的绘图库之一,用于生成各种静态、动态、交互式的图表,如折线图、柱状图、散点图、直方图等。它功能强大,灵活度高,支持自定义几乎所有图形元素,常用于数据可视化、科学计算结果展示等领域。通过Matplotlib,用户可以轻松地将数据转换成美观且信息丰富的图表。
- Pyecharts
pyecharts 是一个用于生成Echarts图表的Python库,Echarts是一个由百度开发的开源JavaScript图表库,以其丰富的图表类型、高度可定制性和交互性而著称。pyecharts通过封装Echarts的接口,使得Python开发者能够方便地在后端生成复杂的前端可视化图表,无需直接编写JavaScript代码。适用于Web应用程序、数据分析报告等多种场景。
- Jieba
jieba 是一个优秀的中文分词库,它支持多种分词模式,包括精确模式、全模式和搜索引擎模式,能够满足不同场景下的分词需求。jieba还提供了关键词提取、词性标注等高级功能,广泛应用于自然语言处理(NLP)、文本挖掘、机器学习等项目中,特别是在需要对中文文本进行预处理的场景下。
- Geopandas
geopandas 是基于Pandas扩展的地理空间数据分析库,它为Pandas DataFrame添加了对地理数据的支持,使得处理带有坐标信息的数据变得更加便捷。geopandas可以读写各种地理空间文件格式,如Shapefile、GeoJSON等,并提供了空间操作、几何属性计算、地图绘制等功能。对于需要进行地理信息系统(GIS)分析、城市规划、环境科学等工作的Python开发者而言,geopandas是一个不可或缺的工具。
3.选择的数据库:MongoDB
MongoDB是一个非常流行的NoSQL数据库,常与Python一起使用。Python中通过pymongo库来连接和操作MongoDB数据库。MongoDB以文档为中心,支持灵活的数据模型,适合处理大量非结构化或半结构化数据,如JSON数据。在Python应用中,pymongo库提供了丰富的API来执行CRUD(创建、读取、更新、删除)操作,以及索引管理、聚合查询等功能,非常适合构建现代的Web应用、数据处理管道等项目。
二、项目实施
第一步:数据爬取
1.数据来源分析
(1)明确需求:明确采集的网站以及数据内容
网站:前程无忧
数据:职位信息
(2)抓包分析
有一些网站,数据是储存在专门的数据包链接里和浏览器导航栏的链接不一样。
- 打开开发者工具:F12
- 刷新网页获取数据
- 通过关键字搜索找到对应的数据包地址
- Headers获取数据包链接并查看相应标签信息
2.代码实现步骤——crawl.py
(1)发送请求:模拟浏览器对于url地址发送请求
(2)获取数据:服务器返回相应数据 < 整个返回响应数据 >
(3)解析数据:提取我们需要的字段
(4)保存数据:报数据保存在表格文件中< csv/Excel>
(5)多页数据采集:更改pagenum即可
3.第二种爬取方法
注:我使用前面的方法完成了招聘信息的爬取,使用下面即将介绍的方法完成了每一条招聘信息的详情页数据的爬取。
- 获取爬取信息网址
- 通过driver方法模拟智能打开浏览器并访问网站
- 通过div标签获取我所需的信息
- 通过quit退出关闭浏览器,避免资源泄露
- Requests
- 基于 Python 的 HTTP 库,简单易用。
- 适用于静态网页的爬取,对于简单的网页结构和数据请求很方便。
- 不支持 JavaScript 渲染,只能获取静态内容,不能获取动态内容。
- 不支持模拟用户行为,无法实现复杂的交互操作。
- Selenium
- 基于浏览器驱动的自动化测试工具,可以模拟用户在浏览器中的操作。
- 支持 JavaScript 渲染,可以获取动态内容。
- 可以实现复杂的交互操作,如点击按钮、填写表单等。
- 需要安装浏览器驱动,增加了环境配置的复杂度。
- 执行速度相对较慢,不适合大规模爬取。
- DrissionPage
- 结合了 Requests 和 Selenium 的优点,是一个高效的爬虫框架,使用 Requests 获取页面源码,再交给 Selenium 处理 JavaScript 渲染和交互操作。
- 兼具 Requests 和 Selenium 的优点,既能快速获取静态内容,又能处理动态内容和交互操作。
另:还可以使用selenium --> 需要下载浏览器对应的驱动,进行操作浏览器,这里我使用的是DrissionPage --> 不需要下载驱动
三种爬虫方法的对比:
4.参考链接
5.遇到的主要问题以及可以优化的方向
- 网站的反爬机制
使用无痕浏览器可以爬多一点,我爬取的网站大概可以爬取13页左右,这里我选择只爬取10页;每次要重新进入获取url和cookie信息,否则网站又会开启反爬机制
- 采用多线程爬取:效率更高
- 使用网站自动化爬取时不进行网页跳转
6.爬虫过程中获取的技巧
(1)正则表达式修改样式
(2)分割数据
(3)通过读取中间值检查代码
第二步:数据处理
1.将城市映射为省份:convert_to_province.py
- 城市省份映射字典
- 取城市对应的省份
2.将薪资格式统一为万元为单位:convert_to_salary.py
- 检查数据并分析结构:'8千-1.2万', '2.5-3.5万/年', '15-25万/年', '6-8千','4.5-7千·13薪'
- “薪”确定年薪计算的月份
- 用“-”对数据进行lower,upper分割并将对应的千和万去掉
- 取最高和最低薪资的平均值返回数值
第三步:可视化呈现
此部分最初采用了maltplotlib库进行绘图、pandas进行数据处理,之后为了便于前端更换使用pyecharts库进行可视化呈现。
- 数据分析师关键词词云:Wordcloud.py
- 使用jieba进行中文分词
- 使用停用词列表去除部分无效词,并将单个词去除
- 地图显示不同地域工资均值:Map_salary.py
- 使用pyecharts直接绘制地图
- 使用Shapefile加载中国地图,匹配个省份的平均工资
- 通过颜色深浅反应不同地区的工资水准
- 不同城市薪资排行:City_salary.py
- 对不同城市的薪资计算平均值再排序
- 不同学历平均工资横向柱状图:Education_salary.py
- 进行数据清洗,筛选出['高中', '大专', '本科']
- 不同规模公司数目:Grouped_number.py
- 利用groupy函数计算不同规模公司数目
- 将数目转化为百分比进行呈现
第四步:连接数据库
- 数据库选择:MongoDB
- 数据库安装
- 参考链接:https://blog.csdn.net/chenghao1012/article/details/138333533
- 安装中遇到的问题:电脑为中文名需要修改为英文名
- 学到的安装知识
- Zip为安装文件材料,需要修改文件配置
- Msi就是我们常用的图形安装界面
- 有两个安装包,大的那个是离线安装包,小的是离线安装包
- 数据库数据导入
- 使用MongoDBcompass图形可视化工具
- 启动MongoDB服务
- 连接本地url:mongodb://localhost:27017
- 创建collection直接导入数据
- 数据库连接
- 使用pymongo库的MongoClient
- 通过client和db获取数据库collection
- 将代码的数据源改为从数据库连接(一开始是使用爬虫导出的csv文件)
- 创建collection直接导入数据库的数据
- 将数据存储为DataFrame格式
- 将数据可视化代码封装成函数
- 函数一律返回图表
第五步:可视化平台呈现
- 使用pyecharts库的Page
- 使用Page函数通过DraggablePageLayout生成各个可视化图像集合的html
- 通过拖拽修改成自己想要的布局
- 保存config.js文件
- 根据js文件重新生成自己想要的html文件
- 使用pyecharts库的Table
- 使用table生成带导航可筛选的html
- 修改tab部分,加上标题
- 修改css样式
- 遇到的未解决的问题以及可以提升的点
- 单独将html保存无效——需要进一步加深对html各个部件的熟悉程度,以观测到底是哪个部分的链接出了问题
- 可以尝试自己重新写一个html页面,加上登录注册之类的,包括后端数据库的衔接
三、项目展示
1.项目设计流程图
2.登录界面
3.进入页面(此时显示所有图表)
4.分页展示(仅截取部分图片)
5.功能详述
- 城市薪资对比: 展示不同城市的平均薪资水平,帮助用户了解各个城市的就业竞争情况和薪资水平。
- 学历工资对比: 分析不同学历对应的平均工资水平,为用户选择合适的学历和提升学历水平提供参考。
- 公司规模招聘数量: 显示不同规模公司的招聘数量,帮助用户了解各个规模公司的招聘趋势。
- 各省份平均工资: 展示各个省份的平均工资水平,为用户选择工作地点提供参考。
- 岗位描述词云: 根据招聘信息中的岗位描述生成词云图,直观展示热门岗位的关键词,帮助用户了解当前热门岗位的特点和需求。
四、项目总结
1.总结
通过本项目,我成功实现了对 51job 网站招聘信息的爬取,并将其数据进行了可视化处理。通过数据可视化页面,用户可以直观地了解就业市场的情况和趋势,为其求职和就业提供了有力的参考依据。
2.个人反馈
通过这次项目经验,我已经基本掌握了requests、Selenium、DrissionPage三种爬虫方法,并且了解到了数据库连接以及编程方法,基本掌握mysql和Mongodb两类数据库的连接具体事项,对于数据分析,熟练使用maltplotlib库进行绘图,并且基本掌握了pyecharts的绘图以及html的page、table等多种页面生成方式。
但是在完成项目的过程中,我发现了一些之后可以修改提升的地方。
- 爬虫可以加上多线程,提高爬虫的效率
- 尝试加上一个完整的前后端框架,实现实时数据爬取分析
- 细致修改数据可视化呈现,做成科技化的数据可视化大屏(这次书要是时间有限没有进行细致的样式修改,实际的样式修改操作并不复杂)
- 增加数据可视化呈现多样化,可以增加折线图、散点图等
如果需要获取源码,请到我的Github中下载,源码仅用于学习交流~
本篇内容的完成离不开网上众多开源社区作者的帮助,以下是致谢名单~
- Author:Koreyoshi
- URL:https://Koreyoshi1216.com/article/806c0bbb-de3b-4236-b52c-4f210b3215af
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!