秋招季,Java 程序员薪资竟不如 C、Python 和 Go!

640?wx_fmt=gif

640?wx_fmt=png

作者 | zone7

责编 | 郭芮

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

640?wx_fmt=png

本次统计数据量为 4658 ,其中某拉钩最多能显示 30 页数据,每页 15 条招聘信息,则汇总为 450。首页爬取跳过一页,则为 435 条,故数据基本爬完。其余不够数量的语言为该语言在深圳只有这么多条招聘信息。


640?wx_fmt=png

统计结果


如下表所示,根据统计,精准推荐、自然语言、机器学习、Go 语言、图像识别这几个平均工资较高。其中比较意外的是,炒得很火的区块链平均薪资并没有那么高,月薪约为 18.84 k。

640?wx_fmt=png

各语言平均薪资

统计完之后笔者发现自己严重拖后腿了......是不是该删库跑路了?

上面的平均工资计算方式如下:

640?wx_fmt=other

最高值与最低值,求平均数,以上面的薪资为例则为:(10k + 20k)/2 = 15k。最后,再总体求平均数。

公司福利词云:

640?wx_fmt=jpeg

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

公司发展级别排行:

640?wx_fmt=png

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


640?wx_fmt=png

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


下面我们来看看各种本命语言的市场需求是怎样的?你又是否达标了呢?总体来看,三至五年的工程师职位需求最多,不怕找不到工作。还有一个趋势是,薪资越高,学历要求越高——学历的重要性不言而喻。

Java

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

640?wx_fmt=png640?wx_fmt=png

Python

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

640?wx_fmt=png640?wx_fmt=pngC 语言

同样是老牌编程语言的 C 语言,近年来学的人却似乎越来越少了。

640?wx_fmt=png640?wx_fmt=png

机器学习

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

640?wx_fmt=png640?wx_fmt=png

图像识别

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

640?wx_fmt=png640?wx_fmt=png

自然语言

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

640?wx_fmt=png640?wx_fmt=png

区块链

区块链概念刚火爆的时候,大街小巷都在讨论区块链,网上也随处都能看到区块链的字眼。但是随着一些区块链的暴雷,现在已经有了偃旗息鼓的态势了。从薪资来看,也没有十分之高,但是学历还是有要求的。  

640?wx_fmt=png640?wx_fmt=png

Go 语言

640?wx_fmt=png640?wx_fmt=png

PHP

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

640?wx_fmt=png640?wx_fmt=png

Android

这两年 Android 市场不断趋于饱和,再加上小程序与 H5 的冲击,已经稍微平稳下来了。不过在视频、音频处理方面还是很吃香的。

640?wx_fmt=png640?wx_fmt=png

iOS

同 Android 类似,不过比 Android 的饱和程度更高,学历方面要求不高。  

640?wx_fmt=png640?wx_fmt=png

web 前端

web 前端平均工资比预期低,其职位基本本科就能胜任。  

640?wx_fmt=png640?wx_fmt=png

精准推荐

精准推荐薪资特别高,可能是和推荐商品有关。但是,这行业对学历还是有一定要求的。  

640?wx_fmt=png640?wx_fmt=png


640?wx_fmt=png

爬虫技术分析


本次爬取过程中用的的数据工具如下:

  • 请求库:selenium

  • HTML 解析:BeautifulSoup、xpath

  • 词云:wordcloud

  • 数据可视化:pyecharts

  • 数据库:MongoDB

  • 数据库连接:pymongo

看完统计结果之后,有没有跃跃欲试?以下即为代码实现。

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

640?wx_fmt=png

数据库存储结构:

/* 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)

作者:zone7,一只爱折腾的后端攻城狮,爱写作爱分享。

声明:本文首发于公众号 zone7,作者投稿,版权归对方所有。


征稿啦

优快云 公众号秉持着「与千万技术人共成长」理念,不仅以「极客头条」、「畅言」栏目在第一时间以技术人的独特视角描述技术人关心的行业焦点事件,更有「技术头条」专栏,深度解读行业内的热门技术与场景应用,让所有的开发者紧跟技术潮流,保持警醒的技术嗅觉,对行业趋势、技术有更为全面的认知。

如果你有优质的文章,或是行业热点事件、技术趋势的真知灼见,或是深度的应用实践、场景方案等的新见解,欢迎联系 优快云 投稿,联系方式:微信(guorui_1118,请备注投稿+姓名+公司职位),邮箱(guorui@youkuaiyun.com)。


————— 推荐阅读 —————

640?wx_fmt=png

640?wx_fmt=png640?wx_fmt=png640?wx_fmt=gif640?wx_fmt=gif

<think>好的,用户是一个Java程序员,现在想学习Python,需要入门资料或学习路径。首先,我得了解JavaPython之间的主要差异,这样用户能更快适应新语言。比如,Python是动态类型的,而Java是静态类型,这点可能需要强调。然后,用户可能需要一些对比学习的方法,这样能利用已有的Java知识来加速学习Python。 接下来,我得整理一些适合的资源。用户提到需要入门资料路径,所以应该包括在线课程、书籍、实践项目等。参考用户提供的引用,比如引用[2]提到Codecademy适合基础实践,Coursera也是不错的选择。另外,引用[3][1]都是关于机器学习Python的教程,但用户可能更需要基础内容,所以可能需要筛选。 然后,学习路径需要分阶段,比如基础语法、面向对象、工具框架、实战项目。每个阶段推荐相应的资源,比如Codecademy的Python课程作为起点,然后进阶到书籍《Python Crash Course》。同时,考虑到用户有Java经验,可以强调Python中不同的地方,比如缩进、动态类型、列表推导等。 另外,用户可能需要知道如何将已有的编程知识迁移到Python,比如设计模式、算法等,但也要注意差异,比如Python的GIL多线程问题。实战项目部分,可以推荐Web开发、数据分析等领域,因为这些是Python的强项,同时引用中的资源可能包含相关教程。 最后,生成相关问题时要考虑用户可能遇到的后续问题,比如性能优化、框架选择、调试技巧等。确保回答结构清晰,分点明确,帮助用户一步步过渡到Python。</think>### Java程序员学习Python的入门路径与资源推荐 #### 一、核心差异与学习策略 1. **类型系统**:Python采用动态类型,无需声明变量类型(如`x = 5`而非`int x = 5`) 2. **语法简化**:Python用缩进替代花括号,列表推导式`[x*2 for x in range(10)]`可替代循环 3. **生态定位**:Python在数据分析/机器学习领域更效,Java更适合大型企业级应用[^3] #### 二、分阶段学习路径 **▎阶段1:基础语法过渡** - 在线交互学习: - Codecademy Python课程(快速熟悉基础语法)[^2] - LeetCode用Python解简单算法题(利用已有算法知识) - 对比学习表: | Java语法 | Python等效 | |-------------------|---------------------| | `System.out.println` | `print()` | | `ArrayList<Integer>` | `list = []` | | `interface` | `抽象类+@abstractmethod`| **▎阶段2:面向对象深化** - 推荐书籍: - 《Python Crash Course》第2版(含项目实战) - 《Fluent Python》(深入理解Python特性) - 关键差异: - 多重继承支持 - 鸭子类型(Duck Typing) - 魔术方法(如`__init__`, `__str__`) **▎阶段3:工具链掌握** 1. 虚拟环境:`venv`或`conda` 2. 包管理:`pip install` + `requirements.txt` 3. 调试工具:pdb模块与PyCharm调试器 **▎阶段4:专项领域实践** - Web开发:Django框架(对比Spring) - 数据分析:Pandas + Matplotlib - 自动化:文件处理/网络请求(`os`, `requests`模块) #### 三、Java开发者专属优化建议 1. **避免过度设计**:Python更倾向"简单优于复杂"哲学 2. **并发处理**:理解GIL限制,多进程替代多线程 3. **类型提示**:Python 3.5+支持类型注解(`def func(x: int) -> str:`) #### 四、推荐资源清单 | 类型 | 资源 | 特点 | |------------|----------------------------------------------------------------------|-----------------------------| | 在线课程 | [Coursera: Python for Everybody](https://www.coursera.org/specializations/python) | 包含完整项目实践 | | 文档 | [官方Python教程](https://docs.python.org/3/tutorial/) | 权威参考 | | 实战项目 | [Automate the Boring Stuff](https://automatetheboringstuff.com/) | 侧重实用脚本开发 | | 进阶书籍 | 《Effective Python》 | 90个Python最佳实践 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值