|
|
|
|
移动端

用Python分析深圳程序员工资有多高?还真是多金的程序员!

用Python告诉你深圳房租有多高 ,想继续用 Python 分析一下,当前深圳的求职市场怎么样?顺便帮一下秋招的同学。于是便爬取了某拉钩招聘数据。

作者:程序员的聚集地来源:今日头条|2018-09-14 14:53

【新品产上线啦】51CTO播客,随时随地,碎片化学习

前言

多图预警、多图预警、多图预警。秋招季,毕业也多,跳槽也多。我们的职业发展还是要顺应市场需求,那么各门编程语言在深圳的需求怎么呢?工资待遇怎么样呢?zone 在上次写了这篇文章之后 用Python告诉你深圳房租有多高 ,想继续用 Python 分析一下,当前深圳的求职市场怎么样?顺便帮一下秋招的同学。于是便爬取了某拉钩招聘数据。以下是本次爬虫的样本数据:

用Python分析深圳程序员工资有多高?还真是多金的程序员!

样本

本次统计数据量为 4658 ,其中某拉钩最多能显示 30 页数据,每页 15 条招聘信息,则总为:

30 x 15 = 450

首页爬取跳过一页,则为 435 条,故数据基本爬完。其余不够数量的语言为该语言在深圳只有这么多条招聘信息。

统计结果

各语言平均工资

其中

  • 精准推荐
  • 自然语言
  • 机器学习
  • Go 语言
  • 图像识别

独领风骚啊!!!平均工资都挺高的。区块链炒得挺火的,好像平均薪资并没有那么高。我统计完之后,感觉自己拖后腿了,ma 的!!!要删库跑路了!(注:下图为月薪,单位:K)

用Python分析深圳程序员工资有多高?还真是多金的程序员!

各语言平均薪资

平均工资计算方式:

用Python分析深圳程序员工资有多高?还真是多金的程序员!

某钩 item

最高值与最低值,求平均数,如图薪资则为:

(10k + 20k)/2 = 15k

最后,再总体求平均数。

公司福利词云

看福利还是挺丰富的,带薪休假、下午茶、零食、节假日。

用Python分析深圳程序员工资有多高?还真是多金的程序员!

福利词云

公司发展级别排行

总体由 A 轮向 D 轮缩减,大部分公司不需要融资,嗯,估计是拿不到资本融资,但是自家人又有钱的。

用Python分析深圳程序员工资有多高?还真是多金的程序员!

公司发展级别

各语言工作年限要求与学历要求

看看你的本命语言的市场需求怎么样?你达标了吗?其中三至五年的攻城狮职位挺多的,不怕找不到工作。还有一个趋势是,薪资越高,学历要求越高高。看来学历还是挺重要的。

Java

用Python分析深圳程序员工资有多高?还真是多金的程序员!

Java 工作年限要求

用Python分析深圳程序员工资有多高?还真是多金的程序员!

Java 学历要求

Python

用Python分析深圳程序员工资有多高?还真是多金的程序员!

Python 工作年限要求

用Python分析深圳程序员工资有多高?还真是多金的程序员!

Python 学历要求

C 语言

用Python分析深圳程序员工资有多高?还真是多金的程序员!

C 语言工作年限要求

用Python分析深圳程序员工资有多高?还真是多金的程序员!

C 语言学历要求

机器学习

用Python分析深圳程序员工资有多高?还真是多金的程序员!

机器学习工作年限要求

用Python分析深圳程序员工资有多高?还真是多金的程序员!

机器学习学历要求

图像识别

用Python分析深圳程序员工资有多高?还真是多金的程序员!

图像识别工作年限要求

用Python分析深圳程序员工资有多高?还真是多金的程序员!

图像识别学历要求

自然语言

用Python分析深圳程序员工资有多高?还真是多金的程序员!

自然语言工作年限要求

用Python分析深圳程序员工资有多高?还真是多金的程序员!

自然语言学历要求

区块链

用Python分析深圳程序员工资有多高?还真是多金的程序员!

区块链工作年限要求

用Python分析深圳程序员工资有多高?还真是多金的程序员!

区块链学历要求

Go 语言

用Python分析深圳程序员工资有多高?还真是多金的程序员!

Go 语言工作年限要求

用Python分析深圳程序员工资有多高?还真是多金的程序员!

Go

PHP

用Python分析深圳程序员工资有多高?还真是多金的程序员!

PHP 工作年限要求

用Python分析深圳程序员工资有多高?还真是多金的程序员!

PHP 学历要求

爬虫技术分析

  • 请求库:selenium
  • HTML 解析:BeautifulSoup、xpath
  • 词云:wordcloud
  • 数据可视化:pyecharts
  • 数据库:MongoDB
  • 数据库连接:pymongo

爬虫代码实现

看完统计结果之后,有没有跃跃欲试?想要自己也实现以下代码?以下为代码实现。

对网页右击,点击检查,找到一条 item 的数据:

用Python分析深圳程序员工资有多高?还真是多金的程序员!

网页源码

数据库存储结构:


  1. /* 1 */ 
  2.  "_id" : ObjectId("5b8b89328ffaed60a308bacd"), 
  3.  "education" : "本科",# 学习要求 
  4.  "companySize" : "2000人以上",# 公司人数规模 
  5.  "name" : "python开发工程师",# 职位名称 
  6.  "welfare" : "“朝九晚五,公司平台大,发展机遇多,六险一金”",# 公司福利 
  7.  "salaryMid" : 12.5,# 工资上限与工资下限的平均数 
  8.  "companyType" : "移动互联网",# 公司类型 
  9.  "salaryMin" : "10",# 工资下限 
  10.  "salaryMax" : "15",# 工资上限 
  11.  "experience" : "经验3-5年",# 工作年限 
  12.  "companyLevel" : "不需要融资",# 公司级别 
  13.  "company" : "XXX技术有限公司"# 公司名称 

由于篇幅原因,以下只展示主要代码:

  1. # 获取网页源码数据 
  2. # language => 编程语言 
  3. # city => 城市 
  4. # collectionType => 值:True/False True => 数据库表以编程语言命名 False => 以城市命名 
  5. def main(self, language, city, collectionType): 
  6.  print(" 当前爬取的语言为 => " + language + " 当前爬取的城市为 => " + city) 
  7.  url = self.getUrl(language, city) 
  8.  browser = webdriver.Chrome() 
  9.  browser.get(url) 
  10.  browser.implicitly_wait(10) 
  11.  for i in range(30): 
  12.  selector = etree.HTML(browser.page_source) # 获取源码 
  13.  soup = BeautifulSoup(browser.page_source, "html.parser"
  14.  span = soup.find("div", attrs={"class""pager_container"}).find("span", attrs={"action""next"}) 
  15.  print( 
  16.  span) # <span action="next" class="pager_next pager_next_disabled" hidefocus="hidefocus">下一页<strong class="pager_lgthen pager_lgthen_dis"></strong></span> 
  17.  classArr = span['class'
  18.  print(classArr) # 输出内容为 -> ['pager_next''pager_next_disabled'
  19.  attr = list(classArr)[0] 
  20.  attr2 = list(classArr)[1] 
  21.  if attr2 == "pager_next_disabled":#分析发现 class 属性为 ['pager_next''pager_next_disabled'] 时,【下一页】按钮不可点击 
  22.  print("已经爬到最后一页,爬虫结束"
  23.  break 
  24.  else
  25.  print("还有下一页,爬虫继续"
  26.  browser.find_element_by_xpath('//*[@id="order"]/li/div[4]/div[2]').click() # 点击【下一页】按钮 
  27.  time.sleep(5) 
  28.  print('第{}页抓取完毕'.format(i + 1)) 
  29.  self.getItemData(selector, language, city, collectionType)# 解析 item 数据,并存进数据库 
  30.  browser.close() 

爬虫分析实现

  1. # 获取各语言样本数量 
  2. def getLanguageNum(self): 
  3.  analycisList = [] 
  4.  for index, language in enumerate(self.getLanguage()): 
  5.  collection = self.zfdb["z_" + language] 
  6.  totalNum = collection.aggregate([{'$group': {'_id''''total_num': {'$sum': 1}}}]) 
  7.  totalNum2 = list(totalNum)[0]["total_num"
  8.  analycisList.append(totalNum2) 
  9.  return (self.getLanguage(), analycisList) 
  10. # 获取各语言的平均工资 
  11. def getLanguageAvgSalary(self): 
  12.  analycisList = [] 
  13.  for index, language in enumerate(self.getLanguage()): 
  14.  collection = self.zfdb["z_" + language] 
  15.  totalSalary = collection.aggregate([{'$group': {'_id''''total_salary': {'$sum''$salaryMid'}}}]) 
  16.  totalNum = collection.aggregate([{'$group': {'_id''''total_num': {'$sum': 1}}}]) 
  17.  totalNum2 = list(totalNum)[0]["total_num"
  18.  totalSalary2 = list(totalSalary)[0]["total_salary"
  19.  analycisList.append(round(totalSalary2 / totalNum2, 2)) 
  20.  return (self.getLanguage(), analycisList) 
  21. # 获取一门语言的学历要求(用于 pyecharts 的词云) 
  22. def getEducation(self, language): 
  23.  results = self.zfdb["z_" + language].aggregate([{'$group': {'_id''$education''weight': {'$sum': 1}}}]) 
  24.  educationList = [] 
  25.  weightList = [] 
  26.  for result in results: 
  27.  educationList.append(result["_id"]) 
  28.  weightList.append(result["weight"]) 
  29.  # print(list(result)) 
  30.  return (educationList, weightList) 
  31. # 获取一门语言的工作年限要求(用于 pyecharts 的词云) 
  32. def getExperience(self, language): 
  33.  results = self.zfdb["z_" + language].aggregate([{'$group': {'_id''$experience''weight': {'$sum': 1}}}]) 
  34.  totalAvgPriceDirList = [] 
  35.  for result in results: 
  36.  totalAvgPriceDirList.append( 
  37.  {"value": result["weight"], "name": result["_id"] + " " + str(result["weight"])}) 
  38.  return totalAvgPriceDirList 
  39. # 获取 welfare 数据,用于构建福利词云 
  40. def getWelfare(self): 
  41.  content = '' 
  42.  queryArgs = {} 
  43.  projectionFields = {'_id'False'welfare'True} # 用字典指定 
  44.  for language in self.getLanguage(): 
  45.  collection = self.zfdb["z_" + language] 
  46.  searchRes = collection.find(queryArgs, projection=projectionFields).limit(1000) 
  47.  for result in searchRes: 
  48.  print(result["welfare"]) 
  49.  content += result["welfare"
  50.  return content 
  51. # 获取公司级别排行(用于条形图) 
  52. def getAllCompanyLevel(self): 
  53.  levelList = [] 
  54.  weightList = [] 
  55.  newWeightList = [] 
  56.  attrList = ["A轮""B轮""C轮""D轮及以上""不需要融资""上市公司"
  57.  for language in self.getLanguage(): 
  58.  collection = self.zfdb["z_" + language] 
  59.  # searchRes = collection.find(queryArgs, projection=projectionFields).limit(1000) 
  60.  results = collection.aggregate([{'$group': {'_id''$companyLevel''weight': {'$sum': 1}}}]) 
  61.  for result in results: 
  62.  levelList.append(result["_id"]) 
  63.  weightList.append(result["weight"]) 
  64.  for index, attr in enumerate(attrList): 
  65.  newWeight = 0 
  66.  for index2, level in enumerate(levelList): 
  67.  if attr == level
  68.  newWeight += weightList[index2] 
  69.  newWeightList.append(newWeight) 
  70.  return (attrList, newWeightList)  
【责任编辑:庞桂玉 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +2018免费博彩送体验金

C++编程你也行

本书是一本优秀的C++教材,内容包括:基础类型、操作符和简单变量,循环和决策,命名空间和C++标准库,用C++编写函数,行为、序列点和求值...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊
博聚网