Python、Java 薪资最高,C# 垫底:分析什么编程语言最赚钱!


本文主要用Python爬取拉勾网不同编程语言职位信息,包括Python岗、Java岗、C++岗、PHP岗、C#岗位(5岗),再用R语言对影响薪资的因素进行分析。由于拉勾网的职位信息只显示30页,一页15个职位信息,如果单独爬取一个城市的岗位信息,只有几页是匹配的信息,信息量太小,分析没有说服力。因此,本文爬取拉勾网全国职位信息。主要包括三部分内容:

爬取拉勾网5岗职位信息,以Python岗为例;
以Python岗位信息为例,分析影响薪资的因素;
5岗之间薪水因素影响比较分析。

爬取拉勾网5岗职位信息——以Python岗为例

我们抓取的信息包括Python岗位名称、公司名称、薪资、工作经验、学历、公司规模、公司福利。

##以python岗位为例,运用selenium+Chrome()爬取岗位信息

coding=UTF-8

from lxml import etree
from selenium import webdriver
import time
import csv
browser = webdriver.Chrome()
browser.get(‘https://www.lagou.com/jobs/list_PYTHON?px=default&city=%E5%85%A8%E5%9B%BD#filterBox‘)
browser.implicitly_wait(10)
def get_dates(selector):
items = selector.xpath(‘//[@id="s_position_list"]/ul/li‘)
for item in items:
yield {
‘Name‘: item.xpath(‘div[1]/div[1]/div[1]/a/h3/text()‘)[0],
‘Company‘: item.xpath(‘div[1]/div[2]/div[1]/a/text()‘)[0],
‘Salary‘: item.xpath(‘div[1]/div[1]/div[2]/div/span/text()‘)[0],
‘Education‘: item.xpath(‘div[1]/div[1]/div[2]/div//text()‘)[3].strip(),
‘Size‘: item.xpath(‘div[1]/div[2]/div[2]/text()‘)[0].strip(),
‘Welfare‘: item.xpath(‘div[2]/div[2]/text()‘)[0]
}
def main():
i = 0
for i in range(30):
selector = etree.HTML(browser.page_source)
browser.find_element_by_xpath(‘//
[@id="order"]/li/div[4]/div[2]‘).click()
time.sleep(5)
print(‘第{}页抓取完毕‘.format(i+1))
for item in get_dates(selector):
print(item)
with open(‘Py.csv‘, ‘a‘, newline=‘‘) as csvfile: ##Py.csv是文件的保存路径,这里默认保存在工作目录
fieldnames = [‘Name‘, ‘Company‘, ‘Salary‘, ‘Education‘, ‘Size‘, ‘Welfare‘]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for item in get_dates(selector):
writer.writerow(item)
time.sleep(5)
browser.close()
if name==‘main‘:
main()

抓取结果如下:

将抓取结果循环写入csv文件:

此外还抓取了Java岗、C++岗、PHP岗、C#岗位4岗的信息,代码和抓取Python岗位信息类似。

以Python岗位信息为例,分析影响薪资的因素

这里包括数据清洗部分和数据分析部分两部分内容。

数据清洗部分

data<-read.csv("E://Data For R/RData/Py.csv")
data[sample(1:nrow(data),size=10),]

在抓取过程中,由于将Python字典循环写入csv文件,因此列名也被循环写在csv文件中。

考虑本文主要分析影响薪资的因素,这里去除Name和Company两列。

##去除Name和Company两列
DATA<-data[,-c(1,2)]
##将python字典循环写入csv文件时,标题也会被写入,去除多余的标题
##查找哪些行是标题重复的行
which(DATA$Salary %in% "Salary")
[1] 16 32 48 64 80 96 102 118 134 150 166 182 198 214 230 246 262 278 294 310 326 342 358 374 390 406 422 438 454 470 486 502 518
[34] 534 550 566
##去除多余的标题所在的行
DATA<-DATA[-(which(DATA$Salary %in% "Salary")),]
dim(DATA)
[1] 545 4

1.变量Salary

变量Salary一般都是范围值,用“-”连接,但是不排除有XXK以上,例如10k以上这种表示形式,或者其他形式,这里需要处理一下。

##如果薪资是一个范围值,都是"-"连接,注意,薪资是一个范围值,匹配末尾结束k值需要注意,有大写K和小写k两种形式。
newdata<-DATA[grep(‘\-‘,DATA$Salary),]
dim(newdata)
[1] 544 4
##对比前面dim(DATA),说明薪水少了一行,Salary具有其他的表示形式。
##这里将范围薪水的值分成底薪和高薪两部分,后面取平均值来表示薪水
library(tidyr)
library(stringr)
newdata<-separate(data=newdata,col=Salary,into=c("lowsalary","highsalary"),sep="-")
##分别去除后面的k值,注意k有大写和小写两种形式
newdata$lowsalary<-str_replace(newdata$lowsalary,‘k|K‘,"")## |表示或的关系
newdata$highsalary<-str_replace(newdata$highsalary,‘k|K‘,"")
newdata$lowsalary<-as.numeric(newdata$lowsalary)##转换数据类型
newdata$highsalary<-as.numeric(newdata$highsalary)
newdata$salary<-(newdata$lowsalary+newdata$highsalary)/2
newdadat<-newdata[,-c(1,2)]##去除原有的lowsalary和highsalary

2.变量Education

###Education部分
##首先将Education中工作经验和学历分开
newdata<-separate(data = newdata,col=Education,into=c("Experience","Graduate"),sep = ‘/‘)
table(newdata$Experience)
经验1-3年 经验1年以下 经验3-5年 经验5-10年 经验不限 经验应届毕业生
187 6 261 46 37 7
table(newdata$Graduate)
本科 不限 大专 硕士
447 27 63 7

3.变量Size

##此处以公司人数作为描述公司规模的标准
newdata<-separate(data=newdata,col=Size,into=c(‘Type‘,‘Rong‘,‘Number‘),sep=‘/‘)
table(newdata$Number)
15-50人 150-500人 2000人以上 50-150人 500-2000人 少于15人
76 139 117 119 82 11
table(newdata$Rong)
A轮 B轮 C轮 D轮及以上 不需要融资 上市公司 天使轮 未融资
86 81 54 30 132 80 33 48
##将Type去除
newdata<-newdata[,-3]

4.变量Welfare

Welfare<-newdata[,"Welfare"]
##将Welfare去除
newdata<-newdata[,-5]
head(newdata)

到此,数据清洗部分内容全部结束。

数据分析部分

1.工资与工作年限的关系

library(ggplot2)
ggplot(newdata,aes(x=Experience,y=salary))+geom_boxplot(col="red")

符合大众的认知,从事Python的应届毕业生起始工资平均值在5K左右,且薪资水平跨度最小。经验5-10年的工资水平跨度最大,主要可能是因为,有一部分转为技术管理岗位,工资较低的可能还在继续码代码,是不是对广大同胞们的警告啊.......

2.工资与学历的关系(专科,本科,研究生,不限)

ggplot(newdata,aes(x=Graduate,y=salary))+geom_boxplot(col="red")

这里是否能说明学历在一定程度上的重要性?学历本科的工资跨度比较大,因为工作经验的不同导致了薪资的差异。

3.工资与公司融资的关系

ggplot(newdata,aes(x=Rong,y=salary))+geom_boxplot(col="red")

对于这部分知识是盲点,但是可以看出融资公司(上市也是一种融资方式)比没有融资的公司平均工资要高出不少,这部分是不是可以是以后找工作的一个风向标......

4.工资与公司大小的关系

公司规模越大,平均的工资也越高。

5.工资与工作时间和学历的关系

library(ggthemes)
library(scales)
ggplot(newdata,aes(x=Experience,y=salary,fill=factor(Graduate)))+
geom_boxplot()+
geom_hline(aes(yintercept=20),color="red",linetype="dashed",lwd=1)+
scale_y_continuous(labels=dollar_format())+theme_few()

这张图告诉我们,在大部分情况下,没(Ren)钱(Chou)就要多读书。不管是经验经验1年以下、经验3-5年、经验5-10年、经验不限的情况下,拥有硕士学历的平均收入都普遍高于本科,本科都高于大专(这里完全没有歧视低学历之意)。

6.公司福利的云图

##公司福利的云图
library(jiebaR)
Welfare<-as.character(Welfare)
wk = worker()
seg_words<-wk[Welfare]
library(plyr)
library(wordcloud)
tableWord<-count(seg_words)
windowsFonts(myFont=windowsFont("华文彩云")) ##使用华文彩云字体
wordcloud(tableWord[,1],tableWord[,2],random.order=F,col= rainbow(100),family="myFont")

现在公司的福利贴有“弹性工作,氛围好,团队,大牛,技术,五险一金”等标签来吸引求职者眼球。

5岗之间薪水因素影响比较分析

1.Python岗、Java岗、C++岗、PHP岗、C#岗位的平均薪水

抓取拉勾网职位信息,可以看出Python和Java的平均薪资较高,C#的平均工资最低。

由此也验证Python近几年火热的态势,由于AI的火热,Python的需求越来越大,传统的Java也比较强势,薪资待遇较高。

2.相同工作经验不同职位信息薪水比较

对于不同工作经验,不同编程语言平均薪水还是有较大的差异。

3.相同学历信息不同职位信息薪水比较

通过硕士、本科、大专、不限四种比较,硕士的总体薪资高于本科。

4.同一职位不同学历信息薪水比较

总的看来,在每个职业,硕士学历的平均薪水高于本科,本科的平均薪水高于大专。

原文地址:http://blog.51cto.com/13952975/2335433

时间: 2024-11-08 20:04:04

Python、Java 薪资最高,C# 垫底:分析什么编程语言最赚钱!的相关文章

Go语言和Java、python等其他语言的对比分析

一.Go语言设计初衷 1.设计Go语言是为了解决当时Google开发遇到的问题: 大量的C++代码,同时又引入了Java和Python 成千上万的工程师 数以万计行的代码 分布式的编译系统 数百万的服务器 2.Google开发中的痛点: 编译慢 失控的依赖 每个工程师只是用了一个语言里面的一部分 程序难以维护(可读性差.文档不清晰等) 更新的花费越来越长 交叉编译困难 3.如何解决当前的问题和痛点? Go希望成为互联网时代的C语言.多数系统级语言(包括Java和C#)的根本编程哲学来源于C++,

使用python操作elasticsearch实现数据插入分析

前言: 例行公事,有些人可能不太了解elasticsearch,下面搜了一段,大家瞅一眼. Elasticsearch是一款分布式搜索引擎,支持在大数据环境中进行实时数据分析.它基于Apache Lucene文本搜索引擎,内部功能通过ReST API暴露给外部.除了通过HTTP直接访问Elasticsearch,还可以通过支持Java.JavaScript.Python及更多语言的客户端库来访问.它也支持集成Apache Hadoop环境.Elasticsearch在有些处理海量数据的公司中已经

学Java薪资待遇怎么样 程序员要掌握哪些技能

学Java薪资待遇怎么样?程序员要掌握哪些技能?Java诞生至今已有二十余年,拥有广阔的市场占有率.数据显示,在所有软件开发类人才的需求中,对Java工程师的需求达到全部需求量的60%-70%.很多人想学Java,但又担心现在学习Java还有前途吗?且看小编分析. 各类新兴编程语言的兴起令Java的霸主地位似乎有所动摇,“Java必死”言论随着喧嚣尘上,也让想要从事Java开发的人心存疑虑.但事实真是这样吗? 资料显示,近20年来Java程序员的工资一直是在稳中有升的状态,一般来说具备3-5年工

Python模块的交叉引用问题分析

实际项目中遇到python模块相互引用问题,查资料,说是通过import局部导入的方式可以避免错误,资料如附录所述. 但更改后测试还是会出错,很疑惑!? 如果哪位读者有好的解决方法,敬请留言说明,谢谢. 所以,最好的方法是不进行交叉引用,如果需要就单独分一个模块出来. 附录:Python模块的交叉引用问题解读:How can I have modules that mutually import each other? 有下面两个文件相互引用,Python解释器报错. foo.py: from

java.io.BufferedOutputStream 源码分析

BufferedOutputStream  是一个带缓冲区到输出流,通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统. 俩个成员变量,一个是存储数据的内部缓冲区,一个是缓冲区中的有效字节数. /** * The internal buffer where data is stored. */ protected byte buf[]; /** * The number of valid bytes in the buffer. This value

Java split方法源码分析

Java split方法源码分析 1 public String[] split(CharSequence input [, int limit]) { 2 int index = 0; // 指针 3 boolean matchLimited = limit > 0; // 是否限制匹配个数 4 ArrayList<String> matchList = new ArrayList<String>(); // 匹配结果队列 5 Matcher m = matcher(inp

Java线程池使用和分析(二) - execute()原理

相关文章目录: Java线程池使用和分析(一) Java线程池使用和分析(二) - execute()原理 execute()是 java.util.concurrent.Executor接口中唯一的方法,JDK注释中的描述是“在未来的某一时刻执行命令command”,即向线程池中提交任务,在未来某个时刻执行,提交的任务必须实现Runnable接口,该提交方式不能获取返回值.下面是对execute()方法内部原理的分析,分析前先简单介绍线程池有哪些状态,在一系列执行过程中涉及线程池状态相关的判断

Eclipse中的快捷键快速生成常用代码(例如无参、带参构造,set、get方法),以及Java中重要的内存分析(栈、堆、方法区、常量池)

Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.堆.方法区.常量池) 以上就是Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.堆.方法区.常量池)的全部内容了,更多内容请关注:CPP学习网_CPP大学 本文固定链接:CPP学习网_CPP大学-Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.

java基础知识回顾之---java String final类 容易混淆的java String常量池内存分析

/** *   栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放  在常量池中). 堆(heap):存放所有new出来的对象. *   静态存储:存放静态成员(static定义的). 常量池(constant pool):在堆中分配出来的一块存储区域,存放储显式的String常量和基本类型常量(float.int等).另外,可以存储不经常改变的东西 *                       p