news 2026/7/21 17:03:34

【python大作业/爬虫实战】——基于智联招聘的数据采集(爬虫)+可视化(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【python大作业/爬虫实战】——基于智联招聘的数据采集(爬虫)+可视化(附完整代码)

在当今数字化时代,网络爬虫技术已成为数据获取的重要手段之一。本文将通过一个实际案例——采集智联招聘信息,详细介绍如何使用Python和Selenium框架实现数据采集。我们将从环境准备、网页结构分析、采集字段说明到爬虫实现步骤等方面展开,帮助读者快速掌握相关技术。

> 本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

本篇文章使用的是seleniunm接管已经打开的浏览器进行数据采集,原理不懂的可以看之前的技术博客(selenium接管已经打开的浏览器)

更新时间:2026-7-21

一、项目背景

随着大数据技术的快速发展,大数据相关岗位需求激增。为了更好地了解全国各地区大数据岗位的分布情况、薪资水平及企业需求,我开发了这个基于Selenium的智联招聘爬虫项目。该项目能够自动搜索"大数据"相关岗位,并按省份分类采集岗位详细信息,为求职者、人力资源研究者和数据分析师提供有价值的数据支持。

二、环境准备

所需工具和库

  • Python

  • Selenium

  • Chrome浏览器

  • ChromeDriver驱动

pip install selenium

ChromeDriver配置

  1. 下载与本地Chrome浏览器版本匹配的ChromeDriver

  2. 将ChromeDriver.exe放在指定路径(或者放在anaconda根目录下,不懂的直接指定路径)

  3. 确保Chrome浏览器已安装并可正常运行

三、采集字段说明

字段类别字段名称字段说明示例值
岗位信息岗位名称招聘职位的名称"大数据开发工程师"
岗位薪资职位提供的薪资范围"15-25k/月"
岗位标签职位的福利或特点标签列表["五险一金", "年终奖", "带薪年假"]
工作省份职位所在的省份"北京"
工作地点职位的具体工作城市/区域"海淀区"
工作经验职位要求的工作年限"3-5年"
学历要求职位要求的学历水平"本科"
公司信息公司名字招聘企业的名称"XX科技有限公司"
公司类型企业的所有制类型"民营"
公司规模企业的人员规模范围"1000-9999人"
公司行业企业所属的行业领域"互联网/IT"

四、网页结构分析

在编写爬虫之前,我们需要对51job的网页结构进行分析,以便准确提取所需信息。

职位列表页面智联招聘

对于该网页,第一步应该是在搜索框输入关键字,然后点击搜索;第二步是选择地区,然后对网页进行数据解析和数据保存。

  1. 动态加载:页面采用动态加载技术,需要模拟浏览器操作

  2. 反爬机制:有一定反爬措施,需要合理设置等待时间和随机延迟

五、爬虫步骤分析

(一)关键字搜索

关键字搜索是整个爬虫的起始步骤,通过模拟用户在智联招聘网站上的搜索行为来定位目标数据。

  1. 访问初始页面:首先使用bro.get()方法打开智联招聘的搜索页面(基础URL为https://www.zhaopin.com/sou/jl779/p1

  2. 定位搜索框:通过XPath语法找到搜索输入框元素

  3. 输入关键词:使用send_keys(keyword)方法输入目标关键词("大数据")

  4. 触发搜索:点击搜索按钮

(二)区域选择

区域选择功能允许按省份筛选职位,通过job_area(province)函数实现:

  1. 打开地区筛选器:点击地区筛选按钮

  2. 输入目标省份:在地区搜索框中输入省份名称(注意:海南和吉林是情况,不能简单的回车

  3. 确认选择

    • 对于特殊省份(如吉林、海南)需要单独处理,点击特定列表项

    • 其他省份直接按回车键确认

  4. 等待结果刷新:选择后等待1-2秒让页面刷新

特殊处理:

  • 使用WebDriverWait显式等待确保元素可交互,确保按钮已经可以点击

  • 对"香港"、"澳门"、"台湾"地区做了跳过处理,因为没有数据

(三)数据解析和保存

数据解析是核心功能,通过parsel_data()函数实现:

1.定位职位列表

本案例用的是二次提取,最后一页的岗位信息标签存在不一致,应该是第二套标签内容。

或者直接//div[@class="joblist-box__item clearfix"] 这样定位就不会出现定位不到的问题

2.提取岗位信息

  • 岗位名称:从jobinfo__top类下的<a>标签获取

  • 薪资:从jobinfo__salary类提取

  • 标签:收集jobinfo__tag下的所有div文本

3.提取公司信息

  • 公司名称:从companyinfo__top类下的<a>标签获取

  • 公司标签:解析companyinfo__tag下的div,分别提取类型、规模和行业

4.数据存储

  • 使用csv.DictWriter将数据写入CSV文件(按实际需求进行对应的数据保存)

  • 字段包括11个关键信息点

  • 对可能缺失的字段(如公司类型)进行异常处理

(四)翻页

  1. 定位翻页按钮:使用XPath//div[@class="soupager"]/a[last()]找到"下一页"按钮

  2. 执行翻页操作

    • 直接调用click()方法点击

    • 也可使用JS执行点击(注释掉的execute_script方案)

  3. 页码追踪:通过page += 1记录当前页码

  4. 终止条件

    • 当找不到下一页按钮时触发异常

    • 通过try-except捕获异常并终止循环

建议采用click点击翻页,因为最后一页点击不到就报错,然后捕获异常break

六、结果展示

七、完整代码

(一)数据采集(爬虫)部分

如果你对这个项目感兴趣,想要获取完整可运行的源代码,欢迎在评论区留言或私信(主页 \/)zzxcrq1234 伪善。

(二)可视化部分

1.岗位数量地域分布地图

from pyecharts import options as opts from pyecharts.charts import Map map_data = df['工作省份'].value_counts().reset_index().values.tolist() map_chart = ( Map() .add( series_name="", data_pair=map_data, maptype="china", is_map_symbol_show=False, # 禁用标记点 label_opts=opts.LabelOpts(is_show=True, font_size=8), # 调整省份字体大小 ) .set_global_opts( title_opts=opts.TitleOpts(title="岗位数量地域分布地图"), visualmap_opts=opts.VisualMapOpts( is_piecewise=True, # 分段显示 pieces=[ {"min": 300, "label": "300以上", "color": "#FF4500"}, {"min": 150, "max": 299, "label": "150-300", "color": "#FFA07A"}, {"min": 50, "max": 149, "label": "50-150", "color": "#FFE4B5"}, {"min": 0, "max": 49, "label": "50以下", "color": "#FFF5E6"}, ], ), ) ) map_chart.render('./可视化结果/岗位数量地域分布地图.html') map_chart.render_notebook()

2 .不同学历的平均月薪

education_order = [ '学历不限', '初中及以下', '高中', '中专/中技', '大专', '本科', '硕士', '博士', ] avg_salary = df['岗位薪资(元/月)'].groupby(df['学历要求']).mean() avg_salary = avg_salary.reindex(education_order) # 按学历由低到稿排列 plt.figure(figsize=(8, 6)) # 设置图形大小 sns.barplot(x=avg_salary.index, y=avg_salary.values, palette='viridis') # 使用 seaborn 绘制柱状图 # 添加标题和标签 plt.title('不同学历的平均月薪', fontsize=16) plt.xlabel('') plt.ylabel('') plt.savefig('./可视化结果/不同学历的平均月薪.png') # 显示图形 plt.show()

3 .中国城市月薪Top 7

avg_salary_city = df['岗位薪资(元/月)'].groupby(df['工作地点']).mean().sort_values(ascending=False)[:7] plt.figure(figsize=(10, 6)) # 设置图形大小 sns.barplot(x=avg_salary_city.values, y=avg_salary_city.index, palette='viridis') # 使用 seaborn 绘制柱状图 # 添加标题和标签 plt.title('中国城市月薪Top 7', fontsize=16) plt.xlabel('') plt.ylabel('') plt.grid(False) plt.savefig('./可视化结果/中国城市月薪Top7.png') plt.show()

4. 工作经验占比分布

size_counts = df['工作经验'].value_counts() # 主题 sns.set_theme(style="whitegrid",rc={ "font.sans-serif": ["SimHei"], "axes.unicode_minus": False, "font.family": "sans-serif" }) plt.figure(figsize=(8, 8)) # 设置画布大小 plt.pie( size_counts, # 数据 labels=size_counts.index, # 标签 autopct='%1.1f%%', # 显示百分比 startangle=90, # 起始角度 colors=sns.color_palette("pastel"), # 使用 Seaborn 的 pastel 调色板 wedgeprops={'edgecolor': 'white', 'linewidth': 1.5}, # 设置扇形边缘样式 textprops={'fontsize': 12, 'color': 'black'} # 设置文本样式 ) plt.title("工作经验占比分布", fontsize=16, fontweight='bold', pad=20) plt.savefig('./可视化结果/工作经验占比分布.png') plt.show()

5.企业规模占比分布

6.企业类型占比分布

7.岗位标签词云

from wordcloud import WordCloud import jieba all_text = ' '.join(df['岗位标签']) words = jieba.lcut(all_text) all_text = ' '.join(words) wordcloud = WordCloud( font_path='simhei.ttf', # 设置字体路径(支持中文) width=800, height=600, background_color='white', # 设置背景颜色 max_words=100, # 设置最多显示的词数 min_font_size=10, # 设置最小字体大小 max_font_size=100, # 设置最大字体大小 random_state=42 # 设置随机种子 ).generate(all_text) plt.figure(figsize=(10, 8)) plt.imshow(wordcloud, interpolation='bilinear') plt.axis('off') # 关闭坐标轴 plt.title('', fontsize=16) plt.savefig('./可视化结果/岗位标签词云.png') plt.show()

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/21 17:02:14

【IDEA_Maven】(进阶版)永久性的更改IDEA中每个项目所依赖的Maven默认配置文件及其仓库路径|配置全局新项目默认设置

【IDEA_Maven】永久性的更改IDEA中每个项目所依赖的Maven默认配置文件及其仓库路径 问题解决配置全局新项目默认设置问题 Maven使用在线导入&#xff0c;在网络不佳时&#xff0c;往往加载很慢。十分浪费时间&#xff0c;所以我们需要在maven官网找到合适版本的maven&#xff…

作者头像 李华
网站建设 2026/7/21 16:59:09

内存泄漏系列专题分析之四:Android malloc_debug工具在Camera领域使用中预览卡死的瓶颈限制问题和二次改造

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:内存泄漏系列专题分析之三:Google官方Android malloc_debug官方英文版介绍 这一篇我们开始讲: 内存泄漏系列专题分析之四:Android malloc_debug工具在Camera领域使用中预览卡死的瓶颈限制问题和二次…

作者头像 李华
网站建设 2026/7/21 16:58:36

终极PrismLauncher手柄配置指南:10分钟实现Minecraft手柄操控

终极PrismLauncher手柄配置指南&#xff1a;10分钟实现Minecraft手柄操控 【免费下载链接】PrismLauncher A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once (Fork of MultiMC) 项目地址: https://gitcode.co…

作者头像 李华
网站建设 2026/7/21 16:58:33

通义千问CLI:终极命令行AI助手完全指南与快速上手教程

通义千问CLI&#xff1a;终极命令行AI助手完全指南与快速上手教程 【免费下载链接】Qwen The official repo of Qwen (通义千问) chat & pretrained large language model proposed by Alibaba Cloud. 项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen 通义千…

作者头像 李华
网站建设 2026/7/21 16:57:45

网络基础概念 [ 上 ]

计算机网络背景网络发展&#xff1a;从孤立到互联的演变独立模式&#xff1a;计算机的孤岛时代在早期的计算机时代&#xff0c;每台计算机都是一个独立的个体&#xff0c;彼此之间没有联系。就像办公室里的独立办公桌&#xff0c;每个办公桌代表一台计算机&#xff0c;它们各自…

作者头像 李华