python爬虫并做可视化分析--前程无忧

 一.数据采集

1.采集逻辑

 2.数据schema

招聘信息Schema

{

"岗位名称": "财务会计主管",

"薪资":"1.3-2万",

"地址": "*******",

"经验要求": "5-7年",

"公司名": "********",

"公司类型": "民营",

"人员规模": "少于50人",

"发展领域": "*******",

"工作福利": "****************",

"发布时间":"06-09发布"

}

3.数据爬取

        1.下载相关库并导入
#下载相关库
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium
pip install  undetected_chromedriver 
#导入相关库
import csv
import random
import time
import re
from time import sleep
from selenium import webdriver
import undetected_chromedriver as uc
from selenium.webdriver import ActionChains
from selenium.webdriver import ChromeOptions
from selenium.webdriver.common.by import By
        2.实例化浏览器对象
# # 实例化一个浏览器对象
driver=uc.Chrome()

注:使用selenium时可能会被检测,因此使用undetected_chromedriver 可以防止浏览器特征被识别,并且可以根据浏览器版本自动下载驱动。(建议浏览器更新到最新版本,避免不必要问题)

        3.发起请求
#发起请求
driver.get("https://www.51job.com/")
sleep(3)

设置休眠时间,避免网络卡顿等问题。

        4.键入关键词并搜索
#键入关键词并搜索
driver.find_element(By.XPATH, '//*[@id="kwdselectid"]').click()
driver.find_element(By.XPATH, '//*[@id="kwdselectid"]').clear()
driver.find_element(By.XPATH, '//*[@id="kwdselectid"]').send_keys('会计')
driver.find_element(By.XPATH, '/html/body/div[3]/div/div[1]/div/button').click()
sleep(5)

利用send_keys方法传入关键词,并通过xpath定位输入框和确定按钮,完成搜索工作。

        5.数据提取
    data=driver.page_source
    sleep(3)
    jobName=re.findall('class="jname at">(.*?)</span>',data,re.S)
    jobSalary=re.findall('class="sal">(.*?)</span>',data,re.S)

    address=[]
    experience=[]
    education=[]
    for req in re.findall('class="d at">(.*?)</p>',data,re.S):
        require=("".join(re.findall('<span data-v-b4bd26a2="">(.*?)</span>',req,re.S))).split('|')
        if len(require)==2:
            require.append('无学历要求')
        address.append(require[0])
        experience.append(require[1])
        education.append(require[2])
        
    companyName=re.findall('class="cname at">(.*?)</a>',data,re.S)

    companyType=[]
    companySize=[]
    for comp in re.findall('class="dc at">(.*?)</p>',data,re.S):
        #中间变量m
        m=("".join(comp).split('|'))
        if len(m)==2:
            companyType.append(m[0].strip())
            companySize.append(m[1].strip())
        else:
            companyType.append(m[0].strip())
            companySize.append("无公司规模数据")

    companyStatus=re.findall('class="int at">(.*?)</p>',data,re.S)

    jobWelf=[]
    for tag in re.findall('class="tags">(.*?)</p>',data,re.S):
        #中间变量n
        n=re.findall('<i data-v-b4bd26a2="">(.*?)</i>',tag,re.S)
        if len(n)==0:
            jobWelf.append('无工作福利数据')
        else:
            jobWelf.append(" ".join(n))
    updatetime = re.findall('class="time">(.*?)</span>', data, re.S)

其中,data为当前页的源代码,后续利用正则对数据进行提取(注:随着时间推移,源代码可能有稍微变动,需注意并修改正则表达式中的pattern)

        6.页面跳转
    driver.find_element(By.XPATH, '//*[@id="jump_page"]').click()
    sleep(random.randint(10, 30) * 0.1)
    driver.find_element(By.XPATH, '//*[@id="jump_page"]').clear()
    sleep(random.randint(10, 40) * 0.1)
    driver.find_element(By.XPATH, '//*[@id="jump_page"]').send_keys(page)
    sleep(random.randint(10, 30) * 0.1)
    driver.find_element(By.XPATH,
                        '//*[@id="app"]/div/div[2]/div/div/div[2]/div/div[2]/div/div[3]/div/div/span[3]').click()
    sleep(random.randint(10, 40) * 0.1)  

定位页码输入框并输入数字,点击跳转按钮实现跳转。在这个过程,每一步设置随机时间的休眠,防止被检测。

4.数据存储

本例中将数据导入csv文件:

#创建csv文件
with open('无忧-会计.csv', 'a', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['岗位名称','薪资','地址','经验要求','学历要求','公司名','公司类型','人员规模','发展领域','工作福利','发布时间'])


with open('无忧-会计.csv', 'a', newline='') as csvfile:
    writer = csv.writer(csvfile)
    for i in list(zip(jobName,jobSalary,address,experience,education,companyName,companyType,companySize,companyStatus,jobWelf,updatetime)):
            writer.writerow(i)

上述是数据采集模块的代码,需要大家充分理解各部分的功能从而完成采集工作。

二.可视化分析

1.数据预览

2.导入库及数据

import pandas as pd
import numpy as np
from pyecharts.charts import Pie
from pyecharts.charts import Funnel
from pyecharts.globals import ThemeType
import pyecharts.options as opts

#读取数据
df=pd.read_csv('无忧-会计.csv',encoding='gbk')

3.不同类型公司占比饼状图

companyType_valuecount=list(zip(df['公司类型'].value_counts().index,df['公司类型'].value_counts().values.tolist()))
#饼状图
pie=(
Pie()
.add(series_name="",data_pair=companyType_valuecount,radius=["20%","65%"])
.set_global_opts(title_opts=opts.TitleOpts(title="公司类型占比图",subtitle="--饼状图"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
)
pie.render_notebook()

由上图可知:绝大多数公司为民营企业,占比为80.8%,...........(读者自由发挥)

4.各公司的人员规模占比饼状图

companySize_valuecount=list(zip(df['人员规模'].value_counts().index,df['人员规模'].value_counts().values.tolist()))
#饼状图
pie=(
Pie()
.add(series_name="",data_pair=companySize_valuecount,rosetype="area",radius=["15%","80%"])
.set_global_opts(title_opts=opts.TitleOpts(title="人员规模占比图",subtitle="--饼状图",pos_top='bottom',pos_left='right'))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c}家"))
)
pie.render_notebook()

由上图可知:................................

 5.学历需求度分析--漏斗图

education_valuecount=list(zip(df['学历要求'].value_counts().index,df['学历要求'].value_counts().values.tolist()))
#漏斗图
funnel=(
Funnel()
.add(series_name="学历",data_pair=education_valuecount,sort_="ascending")
.set_global_opts(title_opts=opts.TitleOpts(title="学历需求度",subtitle="--漏斗图"),
                legend_opts=opts.LegendOpts(pos_left="left",pos_top="middle",orient = 'vertical'))

)
funnel.render_notebook()

由上图可知:....................

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb小记——重定向和内部转发

目录 重定向 原理图 重定向语句 重定向特点 内部转发 原理图 请求转发特点 路径的书写 请求域对象request 特点 请求转发特点 重定向特点 重定向 原理图 重定向语句 response.setStatus(302); response.setHeader("location","http://www.baidu.c…

MS1826 HDMI 多功能视频处理器 4*4矩阵切换器

基本介绍 MS1826 是一款多功能视频处理器&#xff0c;包含 4 路独立 HDMI 音视频输入通道、4 路独立 HDMI 音视频输出通道以及四路独立可配置为输入或者输出的 SPDIF、I2S 音频信号。支持 4 个独立的字 库定制型 OSD&#xff1b;可处理隔行和逐行视频或者图形输入信号&#xff…

【计算机网络】网络安全,HTTP协议,同源策略,cors,jsonp

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 网络安全非对称加密中间人攻击XSSSQL注入CSRF HTTP协议同源策略corsjsonp 网络安全 非对称加密…

推荐好用的AI工具集

AI技术未来已来&#xff0c;我们要拥抱变化 &#xff0c;笔记试用好用AI工具&#xff0c;也在代码中试用chatGPT 一、工具集 解决任何问题&#xff1a;ChatGPT 写文案&#xff1a;Jasper Al 、Copysmith 生成真人视频&#xff1a;Synthesia、 CogView2 AI AI 解决法律问题…

MySQL面试题--索引概念以及底层

目录 概述 索引的底层数据结构 二叉树 B树 B树 B树与B树对比: 面试回答 大纲 回答 概述 索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。 在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff08;B树&#xff0…

springboot 国家公务员招聘网站-计算机毕设 附源码80528

springboot 国家公务员招聘网站 目 录 摘要 1 绪论 1.1研究背景与意义 1.2开发现状 1.3系统开发技术的特色 1.4springboot框架介绍 1.5论文结构与章节安排 2 2国家公务员招聘网站系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.3.2数据修改流程 2.…

【Solr】体验极速安装solr

目录 前言 安装下载- 方式一&#xff1a;官网下载- 方式二&#xff1a;仓库下载 启动方式 快速使用 关于查询 前言 solr是基于java开发的&#xff0c;所以solr需要用到jdk环境,并且solr需要在tomcat容器中才能运行,所以需要提前配置好jdk和tomcat环境。 安装下载 需要注意的…

springboot集成mybatisPlus

1、添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-jav…

【操作系统笔记】南京大学jyy老师

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了操作系统学习&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于南京大学操作系统jyy老师课程进行的&#xff0c;每个知识点的修正…

如何使用Wu10Man启用或禁用自动更新

使用Wu10Man启用或禁用自动更新 启用自动更新禁用自动更新Windows 10 将在你设置为自动维护时自动检查新的 Windows 更新。默认情况下,Windows 10 将自动下载并安装重要和关键更新。 某些更新不是自动安装的。这包括可选更新和要求你接受新使用条款的更新。当这些更新可用时,…

基于卷积神经网络的高光谱图像分类

文章目录 引言1. 基于光谱特征2. 基于空间特征3. 基于空谱特征3.1 空间特征和光谱特征的融合3.2 基于3D-CNN分类 4. 总结 引言 近年来深度学习的技术在计算机视觉领域中大放异彩&#xff0c;使得对多光谱数据分类的研究迅速发展&#xff0c;结合2D-CNN&#xff0c;3D-CNN&…

让性能腾飞!亚马逊云科技的 Java 云端之旅

在上篇文章中&#xff0c;我们为大家介绍了亚马逊的 Java 生态及丰富的开发工具、框架。本文将分享亚马逊的 Java 架构、迁移途径&#xff0c;并分享一个具体实例&#xff0c;介绍如何使用机器学习来构建 Java 应用和提升 Java 性能。 亚马逊云科技开发者社区为开发者们提供全…

怎么高效的通过爬虫获取数据

导语&#xff1a;在当今数字化时代中&#xff0c;获取数据已成为许多企业和个人的重要需求。在快速获取数据时&#xff0c;通过爬虫技术迅速获取网络数据已成为一项重要的技能和技术。然而&#xff0c;在应用爬虫技术前&#xff0c;需要注意一些重要的问题。本文总结了从数据来…

leetcode1.两数之和

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【LeetCode】 &#x1f353;希望我们一起努力、成长&#xff0c;共同进步。 题目链接 给定一个整数数组 nums 和一个整数目标值 target&am…

读写锁原理解读

目录 回顾什么是读写锁 t1 w.lock&#xff0c;t2 r.lock t3 r.lock&#xff0c;t4 w.lock t1 w.unlock t2 r.unlock&#xff0c;t3 r.unlock 写锁上锁流程 写锁释放流程 读锁上锁流程 读锁释放流程 回顾什么是读写锁 读写锁是一对互斥锁&#xff0c;分为读锁和写锁。…

《kafka 核心技术与实战》课程学习笔记(八)

无消息丢失配置怎么实现&#xff1f; Kafka 只对“已提交”的消息&#xff08;committed message&#xff09;做有限度的持久化保证。 第一个核心要素是“已提交的消息”。 当 Kafka 的若干个 Broker 成功地接收到一条消息并写入到日志文件后&#xff0c;它们会告诉生产者程序…

知识图谱项目——红色文化之张学良人物知识图谱(Neo4j+vue+flask+mysql实现)

张学良人物简史知识图谱_说明文档 本项目为人工智能专业大三知识图谱课程期末作业。意在完成一个以张学良为背景的红色文化类知识图谱。文末放上本项目的代码地址。 文章目录 张学良人物简史知识图谱_说明文档:rocket:前端:rocket:后端:rocket:中间件:rocket:数据库:rocket:服…

Linux常用命令——free命令

在线Linux命令查询工具 free 显示内存的使用情况 补充说明 free命令可以显示当前系统未使用的和已使用的内存数目&#xff0c;还可以显示被内核使用的内存缓冲区。 语法 free(选项)选项 -b # 以Byte为单位显示内存使用情况&#xff1b; -k # 以KB为单位显示内存使用情况…

【云原生】二进制部署k8s集群(中)搭建node节点

连接上文 在上文已经成功部署了etcd分布式数据库、master01节点&#xff0c; 本文将承接上文的内容&#xff0c;继续部署Kubernetes集群中的 worker node 节点和 CNI 网络插件 1. 部署 Worker Node 组件 1.1 work node 组件部署前需了解的节点注册机制 kubelet 采用 TLS Bo…

设计模式-05.01-行为型-观察者模板

观察者模式【常用】 我们常把 23 种经典的设计模式分为三类&#xff1a;创建型、结构型、行为型。前面我们已经学习了创建型和结构型&#xff0c;从今天起&#xff0c;我们开始学习行为型设计模式。我们知道&#xff0c;创建型设计模式主要解决“对象的创建”问题&#xff0c;…