秋招季,用Python分析深圳程序员工资有多高?

概述

  • 前言
  • 统计结果
  • 爬虫技术分析
  • 爬虫代码实现
  • 爬虫分析实现
  • 后记
  • 预告

前言

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

样本

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

30 x 15 = 450

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

统计结果

各语言平均工资
其中

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

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

各语言平均薪资

平均工资计算方式:


某钩 item

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

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

最后,再总体求平均数。
公司福利词云
看福利还是挺丰富的,带薪休假、下午茶、零食、节假日。

福利词云

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

公司发展级别

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

Java

Java 作为一门老牌编程语言,有些要求还是挺高的。为数不多的,有要求 5 - 10 年的。从总体来看,基本与学历没有太大的关联,只要技术到家就行。


Java 工作年限要求

Java 学历要求

Python

Python 作为近年来被追捧的语言,主要是其发展方向众多,AI 、web 后端、运维、爬虫等。其入门要求也不是特别高,基本上本科学历就能胜任多数工作,AI 就要另当别论了。


Python 工作年限要求

Python 学历要求

C 语言

C 语言,也作为一门老牌编程语言。嗯,怎么感觉新一届的程序员越来越少学 C 语言了呢?


C 语言工作年限要求

C 语言学历要求

机器学习

是的,这一次感受到了学历的重要性了,硕士要求占了一大半呢!!我这个渣渣二本是入不了这行了。但工作年限要求没有非常高。


机器学习工作年限要求

机器学习学历要求

图像识别

图像识别薪资也高,学历要求也相对高一点。


图像识别工作年限要求

图像识别学历要求

自然语言

果然,稀缺人才薪资都高,但这次它还是伴有学历门槛的,所以说要时刻都抱着学习的心态呀。


自然语言工作年限要求

自然语言学历要求

区块链

区块链概念刚火爆的时候,感觉大街小巷都在讨论区块链啊?公众号随处都能看到区块链的字眼,随着一些区块链的暴雷,这概念好像有稍微平静下来的感觉。不过从薪资来看,好像也没有非常高。但是为学历还是有点要求的。


区块链工作年限要求

区块链学历要求

Go 语言

Go 语言的需求量还是挺大的,为学历号位有那么点要求。


Go 语言工作年限要求

Go

PHP

PHP 是世界上最好的编程语言,不解释!!!


PHP 工作年限要求

PHP 学历要求

Android

这两年 Android 趋于饱和,在加上小程序与 H5 的冲击,稍微平稳下来了。不过在视频、音频处理方面厉害的话,还是很吃香的。对学历基本没什么要求。


Android 工作年限要求

Android 学历要求

iOS

同 Android 类似,不过比 Android 先饱和了。学历方面,基本没什么要求。


iOS 工作年限要求

iOS 学历要求

web 前端

web 前端平均工资,比我预期的少了。看来会数据分析还是有好处的,其职位基本本科就能胜任。


web 前端工作年限要求

web 前端学历要求

精准推荐

精准推荐薪资贼高啊,可能是和推荐商品有关,商品推荐出去了,买到钱了,你说薪资能不高吗?但是,这行业对学历还是有一定要求的。


精准推荐工作年限要求

精准推荐学历要求

爬虫技术分析

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

爬虫代码实现

看完统计结果之后,有没有跃跃欲试?想要自己也实现以下代码?以下为代码实现。
对网页右击,点击检查,找到一条 item 的数据:


网页源码

数据库存储结构:

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

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

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

爬虫分析实现

# 获取各语言样本数量
def getLanguageNum(self):
    analycisList = []
    for index, language in enumerate(self.getLanguage()):
        collection = self.zfdb["z_" + language]
        totalNum = collection.aggregate([{'$group': {'_id': '', 'total_num': {'$sum': 1}}}])
        totalNum2 = list(totalNum)[0]["total_num"]
        analycisList.append(totalNum2)
    return (self.getLanguage(), analycisList)

# 获取各语言的平均工资
def getLanguageAvgSalary(self):
    analycisList = []
    for index, language in enumerate(self.getLanguage()):
        collection = self.zfdb["z_" + language]
        totalSalary = collection.aggregate([{'$group': {'_id': '', 'total_salary': {'$sum': '$salaryMid'}}}])
        totalNum = collection.aggregate([{'$group': {'_id': '', 'total_num': {'$sum': 1}}}])
        totalNum2 = list(totalNum)[0]["total_num"]
        totalSalary2 = list(totalSalary)[0]["total_salary"]
        analycisList.append(round(totalSalary2 / totalNum2, 2))
    return (self.getLanguage(), analycisList)

# 获取一门语言的学历要求(用于 pyecharts 的词云)
def getEducation(self, language):
    results = self.zfdb["z_" + language].aggregate([{'$group': {'_id': '$education', 'weight': {'$sum': 1}}}])
    educationList = []
    weightList = []
    for result in results:
        educationList.append(result["_id"])
        weightList.append(result["weight"])
    # print(list(result))
    return (educationList, weightList)

# 获取一门语言的工作年限要求(用于 pyecharts 的词云)
def getExperience(self, language):
    results = self.zfdb["z_" + language].aggregate([{'$group': {'_id': '$experience', 'weight': {'$sum': 1}}}])
    totalAvgPriceDirList = []
    for result in results:
        totalAvgPriceDirList.append(
            {"value": result["weight"], "name": result["_id"] + "  " + str(result["weight"])})
    return totalAvgPriceDirList

# 获取 welfare 数据,用于构建福利词云
def getWelfare(self):
    content = ''
    queryArgs = {}
    projectionFields = {'_id': False, 'welfare': True}  # 用字典指定
    for language in self.getLanguage():

        collection = self.zfdb["z_" + language]
        searchRes = collection.find(queryArgs, projection=projectionFields).limit(1000)
        for result in searchRes:
            print(result["welfare"])
            content += result["welfare"]
    return content

# 获取公司级别排行(用于条形图)
def getAllCompanyLevel(self):
    levelList = []
    weightList = []
    newWeightList = []
    attrList = ["A轮", "B轮", "C轮", "D轮及以上", "不需要融资", "上市公司"]
    for language in self.getLanguage():
        collection = self.zfdb["z_" + language]
        # searchRes = collection.find(queryArgs, projection=projectionFields).limit(1000)
        results = collection.aggregate([{'$group': {'_id': '$companyLevel', 'weight': {'$sum': 1}}}])
        for result in results:
            levelList.append(result["_id"])
            weightList.append(result["weight"])
    for index, attr in enumerate(attrList):
        newWeight = 0
        for index2, level in enumerate(levelList):
            if attr == level:
                newWeight += weightList[index2]
        newWeightList.append(newWeight)
    return (attrList, newWeightList)

后记

总体就分析到这里了,如果你也想看看你所在的城市的薪资标准与市场需求,欢迎后台骚扰。如果人数多,我就专门写下你所在的城市的分析。

预告

最近写了挺多关于 Python 的文章,但是这是一个后端公众号啊,所以接下来准备写写后端相关的。最近微服务概念炒得挺火的,但网络好像都没找到什么实实在在的项目来学习,刚好我前段时间用 Python 与 Node.js 写了下微服务,所以下面会写微服务相关的文章。敬请期待!

本篇文章首发于公众号「zone7」,关注公众号获取最新推文,后台回复【深圳求职】获取源码。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容