Python获取各大企业招聘需求以及可视化分析展示

news2024/11/27 12:52:35

前言

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章

课程亮点

1、爬虫的基本流程

2、可视化分析展示

3、requests模块的使用

4、保存csv

开发环境:

  • python 3.8 运行代码

  • pycharm 2022.3.2 辅助敲代码 专业版

模块使用:

内置模块:

  • import pprint >>> 格式化输入模块

  • import csv >>> 保存csv文件

  • import re >>> re 正则表达式

  • import time >>> 时间模块

第三方模块:

  • import requests >>> 数据请求模块

第三方模块安装:

win + R 输入cmd 输入安装命令 pip install 模块名

(如果你觉得安装速度比较慢, 你可以切换国内镜像源)

完整源码、教程 点击此处跳转文末名片获取 ,我都放在这里了。

数据来源分析思路:

  1. 确定爬取目标

  2. 去分析这些数据内容, 可以从哪里获取

    数据是通过那个url地址 发送什么请求方式, 携带了那些请求头 然后得到数据

    (通过开发者工具进行抓包分析)

    *** 我们分析数据, 是分析服务器返回数据, 而不是元素面板

    # elements 是元素面板 前端代码渲染之后的内容

import requests  # 数据请求模块 第三方模块 pip install requests
import pprint  # 格式化输出模块
import csv  # csv保存数据
import time

f = open('招聘数据.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
    '标题',
    '地区',
    '公司名字',
    '薪资',
    '学历',
    '经验',
    '公司标签',
    '详情页',
])

csv_writer.writeheader() # 写入表头
for page in range(1, 31):
    print(f'------------------------正在爬取第{page}-------------------------')
    time.sleep(1)
    # 1. 发送请求
    url = 'https://****/jobs/positionAjax.json?needAddtionalResult=false'
    headers = {
        'cookie': '你自己的cookie',
        'referer': 'https://****/jobs/list_python?labelWords=&fromSearch=true&suginput=',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36',
    }
    data = {
        'first': 'false',
        'pn': page,
        'kd': 'python',
        'sid': 'bf8ed05047294473875b2c8373df0357'
    }
    # response 自定义变量 可以自己定义  <Response [200]> 获取服务器给我们响应数据
    完整源码、解答+V:pytho8987获取,备注“777”
    response = requests.post(url=url, data=data, headers=headers)
    # print(response.text) # 获取响应体的文本数据 字符串数据类型
    # print(type(response.text))
    # print(response.json()) # 获取响应体的json字典数据 字典数据类型
    # print(type(response.json()))
    #  2. 获取数据
    # print(response.json())
    # pprint.pprint(response.json())
    #  3. 解析数据 json数据最好解析 非常好解析, 就根据字典键值对取值
    result = response.json()['content']['positionResult']['result']
    # 列表数据类型, 但是这个列表里面的元素, 是字典数据类型
    # pprint.pprint(result)
    # 循环遍历  从 result 列表里面 把元素一个一个提取出来
    for index in result:
        # pprint.pprint(index)
        # href = index['positionId']
        href = f'https://****/jobs/{index["positionId"]}.html'
        dit = {
            '标题': index['positionName'],
            '地区': index['city'],
            '公司名字': index['companyFullName'],
            '薪资': index['salary'],
            '学历': index['education'],
            '经验': index['workYear'],
            '公司标签': ','.join(index['companyLabelList']),
            '详情页': href,
        }
        # ''.join() 把列表转成字符串 '免费班车',
        csv_writer.writerow(dit)
        print(dit)

括展小知识

  • headers 请求头 用来伪装python代码, 防止被识别出是爬虫程序, 然后被反爬

  • cookie: 用户信息, 常用于检测是否有登陆账号

  • referer: 防盗链, 告诉服务器我们请求的url地址 是从哪里跳转过来的 (动态网页数据 数据包 要比较多)

  • user-agent: 浏览器的基本标识

  • pycharm里面 先全部选中 按住 ctrl +R 用正则表达式命令 批量替换数据

  • 200 状态码标识请求成功

可视化分析

import numpy as np
import pandas as pd
from pyecharts.charts import *
from pyecharts import options as opts
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
from pyecharts.globals import ThemeType
df = pd.read_csv('data.csv', encoding='UTF-8')
df.head()

df.info()#查看整体性描述
df.describe()

df[df['公司标签'].isnull()]#查看“福利”空值所属信息

df['地区'] = df['地区'].apply(lambda x:x.split('-')[0])#获取地区
df['地区'].unique()
df['经验'].unique()
df['经验'].replace('在校/应届本科','经验不限本科', inplace=True)#重命名经验
df['经验'].replace('5天/周2个月本科','经验不限本科', inplace=True)
df['经验'].replace('经验不限学历不限','经验不限大专', inplace=True)
df['经验'].replace('5天/周6个月大专','经验不限大专', inplace=True)
df['经验'].replace('3天/周12个月本科','经验不限本科', inplace=True)
df['经验'].replace('3天/周3个月硕士','经验不限硕士', inplace=True)
df['经验'].replace('4天/周6个月硕士','经验不限硕士', inplace=True)
df['经验'].replace('3-5年学历不限','经验不限大专', inplace=True)
df['经验'].replace('5-10年大专','经验不限大专', inplace=True)
df['经验'].replace('3-5年大专','经验不限大专', inplace=True)
df['经验'].replace('5天/周6个月本科','经验不限本科', inplace=True)
df['经验'].replace('5天/周6个月本科','经验不限本科', inplace=True)
df['经验'].replace('                                                                                                                                                                                                                                                                    ','经验不限本科', inplace=True)
df['经验'].unique()
df['薪资'].unique()
df['m_max'] = df['薪资'].str.extract('(\d+)')#提取出最低薪资
df['m_min'] = df['薪资'].str.extract('(\d+)K')#提取出最高薪资
df['m_max'] = df['m_max'].apply('float64')#转换数据类型
df['m_min'] = df['m_min'].apply('float64')
df['平均薪资'] = (df['m_max']+df['m_min'])/2
df.head()

#每个地区的招聘数量
dq = df.groupby('地区').count()['标题']
dq_index = dq.index.tolist()
dq_value = dq.values.tolist()

bar1 = (Bar(init_opts=opts.InitOpts(width='800px', height='400px',theme=ThemeType.MACARONS))
       .add_xaxis(dq_index)
       .add_yaxis('', dq_value,category_gap="50%")
       .set_global_opts(title_opts=opts.TitleOpts(title="每个地区的招聘数量"),
                       xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-50)),
                        visualmap_opts=opts.VisualMapOpts(max_=80),#彩色块
                        datazoom_opts=[opts.DataZoomOpts()]#拉动条形轴
                        )
      )
bar1.render_notebook()

#经验学历需求图
pair_1 = [(i, int(j)) for i, j in zip(jingyan.index,jingyan.values)]
pie = (
    Pie(init_opts=opts.InitOpts(theme=ThemeType.MACARONS,width='1000px',height='600px'))
    
    .add('', pair_1, radius=['40%', '70%'])
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title="经验学历需求图", 
            pos_left='center', 
            pos_top='center',
            title_textstyle_opts=opts.TextStyleOpts(
                color='black', 
                font_size=20, 
                font_weight='bold'
            ),
        )
    )
    
)
pie.render_notebook() 

gongsi = df.groupby('经验').count()['标题']
#招聘公司所在领域
pie1 = (
    Pie(init_opts=opts.InitOpts(theme=ThemeType.MACARONS,width='1500px',height='900px'))
    .add(
        "",
        [list(z) for z in zip(gongsi.index.tolist(), gongsi.values.tolist())],
        radius=["20%", "80%"],
        center=["25%", "70%"],
        rosetype="radius",
        label_opts=opts.LabelOpts(is_show=False),
    ).set_global_opts(title_opts=opts.TitleOpts(title="招聘公司所在领域"))
)
pie1.render_notebook()

尾语 💝

好了,今天的分享就差不多到这里了!

完整代码、更多资源、疑惑解答直接点击下方名片自取即可。

对下一篇大家想看什么,可在评论区留言哦!看到我会更新哒(ง •_•)ง

喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/598205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux提权:定时任务 环境变量 配置不当 数据库

目录 环境变量配合SUID 实战测试 原理分析 实战中如何发现挖掘这类安全问题 定时任务打包配合SUID 原理分析 定时任务权限配置不当 数据库提权-梭哈的艺术 隧道出网提权 环境变量配合SUID 实战测试 这个提权方法比较鸡肋&#xff0c;因为它需要两个前提条件&#xf…

C语言:函数栈帧

寄存器&#xff1a; eax ebx ecx edx ebp esp 必须理解这两个寄存器&#xff08;寄存器是独立于内存的&#xff09; 这两个寄存器存放的是地址&#xff0c;用来维护函数栈帧&#xff08;正在调用哪个函数&#xff0c;两个寄存器就维护哪个函数的栈帧&#xff09; 每一个函数都…

C# NX二次开发:实现制图模块复制Sheet页,并且获取其中表格

今天要讲的是如何在NX中实现制图模块当前Sheet页的复制&#xff0c;并且获取Sheet页中的表格。首先简单介绍一下NX的制图模块是做什么的。 在NX中建模模块是用来绘制模型的&#xff0c;而想要将模型的相关尺寸投出来直观的看到&#xff0c;就要用到制图模块。 在制图模块中可…

leetcode--从二叉搜索树到更大和树(java)

从二叉搜索树到更大和树 leetcode -1038 题 从二叉搜索树到更大和树解题思路代码演示二叉树专题 leetcode -1038 题 从二叉搜索树到更大和树 原题链接&#xff1a; https://leetcode.cn/problems/binary-search-tree-to-greater-sum-tree/ 题目描述 给定一个二叉搜索树 root (B…

Chrome提示由贵单位管理该怎么取消?

如果你的 Chrome处于托管&#xff0c;你的管理员是可以设置或限制一些特定功能、可以安装一些应用、监视活动以及控制您的使用方式。 如何知道是否托管&#xff1a; 打开 Chrome 。在右上角&#xff0c;选择“更多”图标 。查看菜单底部。如果您看到“由贵单位管理”&#xff…

泡利矩阵(一)

〇、厄米矩阵 厄米矩阵&#xff08;Hermitian Matrix&#xff09;&#xff0c;也称为自共轭矩阵&#xff08;Self-adjoint Matrix&#xff09;&#xff0c;是线性代数中的一个重要概念。它是指一个复数域上的方阵&#xff0c;其转置矩阵与共轭矩阵相等。 具体来说&#xff0c…

15稳压二级管

目录 一、基本原理 二、I-V特性 三、工作原理 四、参数 1、Vz 2、Zzt和Zzk 3、IrVr 4、VfIf 5、Pd 五、应用 1、示例1 2、串联应用 3、钳位电路 六、动态电阻 一、基本原理 稳压二极管或“击穿二极管”(有时也称为齐纳二极管)基本上与标准PN结二极管相同&#xf…

Linux NGINX服务

NGINX与Apache对比 轻量级&#xff0c;Nginx比apache 占用更少的内存及资源&#xff1b;静态处理&#xff0c;Nginx 静态处理性能比 Apache 高 &#xff1b;Nginx可以实现无缓存的反向代理加速&#xff0c;提高网站运行速度&#xff1b;Nginx的性能和可伸缩性不依赖于硬件&…

multipass基础入门,搭建本地迷你云,一个比VMware轻量的虚拟机软件

介绍 multipass是一款轻量&#xff0c;且开源的虚拟机。 Multipass是一个灵活、强大的工具&#xff0c;可用于多种用途。在其最简单的形式下&#xff0c;它可以用来在任何主机上快速创建和销毁Ubuntu虚拟机&#xff08;实例&#xff09;。在更全面的情况下&#xff0c;Multip…

redhat9 shell脚本判断磁盘、判断web运行、curl测试web(及一些报错纠正)

1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。 2、判断web服务是否运行&#xff08;1、查看进程的方式判断该程序是否运行 2、通过查看端口的方式判断该程序是否运行&#xff09;&…

关于这款开源的ES的ORM框架-Easy-Es适合初学者入手不?

前言 最近笔者为了捡回以前自学的ES知识&#xff0c;准备重新对ES的一些基础使用做个大致学习总结。然后在摸鱼逛开源社区时无意中发现了一款不错的ElasticSearch插件-Easy-ES&#xff0c;可称之为“ES界的MyBatis-Plus”。联想到之前每次用RestHighLevelClient写一些DSL操作时…

微信小程序 nodejs+vue+python家校通家校联系作业系统

家本系统有家长&#xff0c;教师&#xff0c;管理员三个角色&#xff0c;家长可以注册登陆小系统&#xff0c;查看公告&#xff0c;查看教师布置的作业&#xff0c;上传孩子的作业&#xff0c;查看学生成绩&#xff0c;成绩统计&#xff0c;家长在线发贴交流&#xff0c;在线留…

009 - STM32学习笔记 - 中断

009 - STM32学习笔记 - 中断 这节的内容&#xff0c;野火的官方视频我反复看了好几次&#xff0c;但是感觉火哥在这块讲解的特别绕&#xff0c;理解起来很吃力&#xff0c;后来在看了一下其他老师的视频&#xff0c;结合一些书本资料和官方手册&#xff0c;才搞清楚STM32中断该…

基于STM32设计的炉温温度检测仪

炉温检测在现代工业生产中十分重要&#xff0c;因为炉温过高或过低都会对产品质量产生影响&#xff0c;甚至影响工厂的正常运作。因此&#xff0c;设计一款能够精准测量炉温并显示结果的检测仪器具有很大的实用价值。 本项目采用了STM32F103C8T6作为主控芯片&#xff0c;该芯片…

CoreNLP server的开启与使用方法

Ubuntu20.04.2使用CoreNLP JDK安装 Ubuntu20.04.2系统本身不含有JDK&#xff0c;而CoreNLP需要依赖JDK进行运行&#xff0c;所以需要先安装好JDK&#xff0c;可以输入java&#xff0c;然后系统会自动提示没有安装JDK&#xff0c;并会推荐安装的版本&#xff0c;如下图所示&am…

第二十四章手写Spring框架

文章目录 Spring 使用回顾Bean 概述Spring IOC 相关接口BeanFactory 接口BeanDefinition 接口BeanDefinitionReader 接口BeanDefinitionRegistry 接口创建容器 手写模拟Spring IOC核心功能定义 Bean 相关的 POJOPropertyValue 类MutablePropertyValues 类BeanDefinition 类 定义…

2023 中国城市商业魅力排行榜:探索西安商业活力与无限机遇【探索中国城市商业魅力排行榜】

文章目录 探索中国城市商业魅力排行榜评估指标价值和意义 结语 探索中国城市商业魅力排行榜 随着中国经济的迅速崛起&#xff0c;中国各个城市商业中心纷纷崭露头角&#xff0c;展现出令人瞩目的商业魅力。为了揭示这些城市商业的繁荣程度、创新力和吸引力&#xff0c;我们荣幸…

什么是devos勒索病毒,devos勒索病毒加密数据的方式

随着技术和互联网的发展&#xff0c;网络安全成为了重要的关注点。而devos勒索病毒可能是我们需要重点关注的一种恶意软件类型。因此&#xff0c;我们了解devos勒索病毒是什么以及它是如何加密数据的将有助于我们企业提升网络安全意识。 什么是devos勒索病毒&#xff1f; Devos…

Lombok源码

目录儿 jar包结构MainSpiLoadUtilfindServices()readServicesFromUrl()META-INF/services/lombok.core.LombokApp ShadowClassLoaderAgentlombok.core.AgentLauncher Handler jar包结构 Main 这应该是Lombok的入口函数 class Main {private static ShadowClassLoader classLo…

vue3 使用的 Pinia

文章目录 一、Pinia API与Vuex s4 有很大不同二、使用步骤1.安装2.使用3、组件中应用案例 官网&#xff1a;https://pinia.web3doc.top/ 一、Pinia API与Vuex s4 有很大不同 没有 mutations。mutations 被认为是非常几长的。最初带来了 devtools 集成&#xff0c;但这不再是问…