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

news2024/11/24 18:51:58

 一.数据采集

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()

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

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

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

相关文章

JDK8新特性-上部

文章目录 一、Java发展史1.1 发展史1.2 OpenJDK和OracleJDK1.3 Open JDK 官网介绍 二、Lambda表达式2.1 需求分析2.2 Lamada表达式的体验2.3 Lambda表达式的语法规则2.3.1 Lambda表达式练习2.3.2 Lambda表达式练习 2.4 Lambda表达式的使用前提2.5 FunctionalInterface注解2.6 L…

MATLAB | 如何使用MATLAB获取顶刊《PNAS》绘图(附带近3年图像)

千呼万唤始出来&#xff0c;《PNAS》绘图获取的代码来啦&#xff0c;不过这次研究了半天也没想到如何获取付费文章的绘图&#xff0c;就只下载了免费文章(主要也怕侵权)&#xff0c;不过光免费文章的图片三年了也有接近1.7w张了&#xff0c;同时使用代码下载时依旧需要科学上网…

【Redis】Redis的数据结构

【Redis】Redis的数据结构 文章目录 【Redis】Redis的数据结构1. 动态字符串SDS2. IntSet2.1 IntSet升级 3. Dict3.1 Dict的扩容3.2 Dict的收缩3.3 Dict的rehash 4. ZipList4.1 ZipList中的Entry4.1.1 Encoding编码 4.2 ZipList的连锁更新问题4.3 特性 5. QuickList 1. 动态字符…

【软考网络管理员】2023年软考网管初级常见知识考点(7)-生成树协议

涉及知识点 STP的原理&#xff0c;端口的状态&#xff0c;RSTP协议&#xff0c;MSTP协议&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多考点汇总可…

模拟电路系列分享-运放的关键参数2

目录 概要 整体架构流程 技术名词解释 1.输入偏置电流&#xff1a; 2.输入失调电流 技术细节 总结; 概要 提示&#xff1a;这里可以添加技术概要 实际运放与理想运放具有很多差别。理想运放就像一个十全十美的人&#xff0c;他学习100 分&#xff0c;寿命无限长&#xff0c;长…

Modal对话框(antd-design组件库)展示所有配置选项和onChange的作用

1.Modal对话框 模态对话框。 2.何时使用 需要用户处理事务&#xff0c;又不希望跳转页面以致打断工作流程时&#xff0c;可以使用 Modal 在当前页面正中打开一个浮层&#xff0c;承载相应的操作。 另外当需要一个简洁的确认框询问用户时&#xff0c;可以使用 App.useApp 封装的…

创建微信小程序的几种方式

创建微信小程序的几种方式 1. 使用原生方式 在官网上下载微信开发者工具&#xff0c;之后使用微信开发者工具新建项目即可。 微信这边提供了多个模板&#xff0c;可以直接下载模板快速搭建上线&#xff0c;也可以使用空白模板根据需求自行编写。 空白模板项目结构&#xff1…

C语言:打印0-100000中的自幂数(水仙花数是其中一种)

题目&#xff1a; 求出 0&#xff5e;100000 之间的所有 自幂数 并输出。 自幂数是指一个n位数&#xff0c;其各位数字的n次方之和恰好等于该数本身&#xff0c; 如:153&#xff1d;1^3&#xff0b;5^3&#xff0b;3^3&#xff0c; 则153是一个自幂数。 思路&#xff1a; 总体…

【数据网格架构】分布式数据网格作为集中式数据单体的解决方案

企业数据架构师不应构建大型集中式数据平台&#xff0c;而应创建分布式数据网格。 ThoughtWorks 的首席技术顾问 Zhamak Dehghani 在旧金山 QCon 的演讲和相关文章中表示&#xff0c;这种方法的改变需要范式转变。随着数据变得越来越普遍&#xff0c;传统的数据仓库和数据湖架构…

Linux基础+命令操作+mysql、tomcat、nginx、RabbitMQ、Redis,ElasticSearch

配置代理 一、永久设置 //编辑配置文件 vi /etc/profile //在该配置文件的最后添加代理配置 export http_proxyhttp://f1336515:password10.137.255.169:3128 //代理服务器ip地址和端口号 export https_proxyhttp://f1336515:password10.137.255.169:3128 //代理服务器ip…

【软考网络管理员】2023年软考网管初级常见知识考点(11)-TCP和UDP详解

涉及知识点 传输控制协议TCP是什么&#xff0c;三次握手的概念理解&#xff0c;用户数据报协议UDP是什么&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0…

AntV G6新版源码浅析

前言 AntV是蚂蚁金服全新一代数据可视化解决方案&#xff0c;其中G6主要用于解决图可视领域相关的前端可视化问题&#xff0c;其是一个简单、易用、完备的图可视化引擎。本文旨在通过简要分析G6 5.x版本源码来对图可视领域的一些底层引擎进行一个大致了解&#xff0c;同时也为…

【玩转Linux操作】详细讲解expr,read,echo,printf,test,[]等命令

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【free loop】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 文章目录 &#x1f354;expr命令⭐表达式说明 &#x1f3…

JAVA:Springboot动态装配Druid多数据源

1、简介 最近打算搭建一个鉴权中心服务&#xff0c;采用springbootFastMybatis装配Druid&#xff0c;考虑后续拓展采用Druid多数据源配置&#xff0c;以一个数据源为主&#xff0c;多个动态数据源为辅的结构。除了数据库&#xff0c;后续会结合shiro安全框架来搭建。 2、引用…

【Leetcode60天带刷】day33回溯算法——1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

​ 题目&#xff1a; 1005. K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&am…

将视频转为幻灯片图像:利用OpenCV实现视频资料转换的指南

视频成为了传播知识和信息的重要媒介之一。然而&#xff0c;有时我们需要以静态的形式保存视频内容&#xff0c;例如将视频讲座转换为幻灯片或图像&#xff0c;以便于分享、存档或打印。幸运的是&#xff0c;OpenCV这一功能强大的计算机视觉库提供了各种技术和工具&#xff0c;…

机器学习之线性回归算法

目录 线性回归算法 求导法推导 梯度下降法推导 线性回归实现人脸识别 导入数据 构建标签矩阵 经典线性回归求导法实现 经典线性回归梯度下降法实现 岭回归实现 套索回归实现 局部加权线性回归实现 可视化 人脸识别 线性回归算法 求导法推导 梯度下降法推导 线性回…

chatgpt赋能python:Title:Python编程中的空格怎么用?详细教程!

Title: Python编程中的空格怎么用&#xff1f;详细教程&#xff01; Introduction: Python编程的空格使用一直是令人困惑的话题之一&#xff0c;但它却是Python语言中非常重要的一部分。空格在Python程序中用来表示代码块的开始和结束&#xff0c;因此不同的空格使用方式可能…

【夜深人静学数据结构与算法 | 第十篇】动态规划

目录 前言&#xff1a; 动态规划&#xff1a; 常见应用&#xff1a; 解题步骤&#xff1a; 动态规划的简化步骤&#xff1a; 案例&#xff1a; 509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 62. 不同路…

【软考网络管理员】2023年软考网管初级常见知识考点(10)- 网际协议IP及IPV6,IPV4详解

涉及知识点 分类的IP地址&#xff0c;子网划分&#xff0c;CIDR和路由汇聚&#xff0c;IPV4数据报格式&#xff0c;IPV6协议&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于&#xff1a;CSDN博主-《拄杖盲学…