IT职场新人选python,go还是java?用数据来说话

简介: 最近有读者在后台问,刚参加工作,想选一个职业方法,问我现在python很火,但是貌似就业机会不是很多,所以比较纠结现在到底是学python,go还是java. 所以我就想我们能不能用数据说话,看看python,go,java这三种热门语言,到底在市场上什么行情。

最近有读者在后台问,刚参加工作,想选一个职业方法,问我现在python很火,但是貌似就业机会不是很多,所以比较纠结现在到底是学python,go还是java. 所以我就想我们能不能用数据说话,看看python,go,java这三种热门语言,到底在市场上什么行情。

说到分析,那我们要先拿到数据,这次的数据还是来自我们的爬虫好伙伴,拉勾网,我们各抓取了这三种语言的市场行情数据来分析,话不多说,我们看看怎么去爬取数据和分析。

首先来说老套路,右击网页----->检查------>network抓包(因为拉勾网是异步加载)

1.requests请求数据

点击python搜索页,打开network抓包,我们看看下面的图片

我们可以看到这次的请求模式是post请求,而不是get请求,这点要注意,所以我们代码是请求页面的时候要使用requests.post来请求

这里还有一点要注意,我们看到post请求下面还有一条请求,我们可以看看,它是什么

可以看到这是一个get请求,可能我们会忽略这点,如果忽略了这个get请求,我们在后面的代码执行时会遇到麻烦,这是拉钩的一种反爬手段,我们如果采用原来的固定cookies(headers)信息去爬取数据的时候,可能只能爬个4-5页面就会出现下面的错误

{'status': False, 'msg': '您操作太频繁,请稍后再访问', 'clientIp': 'xxxxxxx', 'state': 2402}

上面的错误看起来是因为IP地址被封导致的,但是一般IP地址被封,我们用网页也是打不开的,但是这里你可以试试用网上去访问页面,其实还是可以正常访问的,所以这里应该不是IP被封的问题,这里其实是拉钩的反爬机制,他是改变了你浏览器端的cookie信息,导致你访问不了,如果你再代码里还是用原来的老套路,cookie信息是定死的,那就着了他的道了。

这其实就是上面的get请求的作用,也就是说我们的cookie信息要在代码里是动态的,用上一次访问返回的cookie信息,进行当前的页面访问,那怎么从前一个url访问后拿取cookie呢,这就要用到requests.session了,另外referer也不能少的,少了一样可能都会出现操作太频繁的回复的,这里的referer其实就是你是从哪个页面跳转来的,我们要访问的URL是"https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false", 他是一个Ajax页面,是不对外访问的,所以如果你不加referer而直接去访问这个Ajax页面,服务器肯定知道你是一个爬虫程序。

具体requests.session怎么写,我们会在下面的代码里给出。说到这里我们大概能访问到页面了。

2.分析页面,获取数据

我们可以看到下面的图片,其他这里得到数据很简单,他返回的是一个JSON类型,而且比较规范,我们稍微处理下就能得到我们想要的数据

3.代码

#coding:utf-8
"""
Created on 2019-05-13
@title: ''
@author: 南山南
公众号:pythonislover
"""

import requests
import re
from bs4 import  BeautifulSoup
import pandas as pd
import xlwt
import random
import time

base_url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'





lagou_list = []
def get_lagou(keyword,page_count):
    for i in range(page_count):

        # cookie_dict = dict()
        # s = requests.session()
        # s.cookies.update(cookie_dict)
        # print(cookie_dict)

        Myheaders = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36',
            'Referer': 'https://www.lagou.com/jobs/list_java?labelWords=&fromSearch=true&suginput='
            }

        time.sleep(5)
        session = requests.session()  # 获取session
        session.headers.update(Myheaders) #更新header信息,cookies会变
        session.get("https://www.lagou.com/jobs/list_python?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=")

        try:
            from_data = {
            'first': 'false',
            'pn': str(i+1),
            'kd': keyword
            }

            print('正在爬取第%s职位的%s页' %(keyword,str(i+1)))

            response = session.post(base_url,headers=Myheaders,data= from_data)
            response.encoding = 'utf-8'
            info_list = response.json()['content']['positionResult']['result']
            companyIds_list = []
            for job in info_list:
                information = []
                information.append(keyword)  # 岗位对应ID
                information.append(job['city'])  # 岗位对应城市
                information.append(job['companyFullName'])  # 公司名
                information.append(job['companySize'])  # 公司规模
                information.append(job['companyLabelList'])  # 福利待遇
                information.append(job['district'])  # 工作地点
                information.append(job['education'])  # 学历要求
                information.append(job['firstType'])  # 工作类型
                information.append(job['positionName'])  # 职位名称
                information.append(job['salary'])  # 薪资
                information.append(job['workYear'])  # 工作年限
                information.append(job['financeStage'])  # 公司发展阶段
                information.append(job['skillLables'])  # 技能要求
                lagou_list.append(information)
                companyIds_list.append(job['companyId'])
            # print(companyIds_list)
            # companyIds_str ='%2C'.join(str(s) for s in companyIds_list)
            # print(companyIds_str)
            # get_url='https://www.lagou.com/c/approve.json?companyIds='+companyIds_str
            # print(get_url)
            # res = requests.get(get_url,headers = Myheaders)
            # get_cookies = res.cookies.get_dict()


        except Exception as e:
            print('程序出错',e)
        continue

    return lagou_list


def main():
    info_result = []
    title = ['职位类型','城市','公司名','公司规模','福利待遇', '工作地点', '学历要求', '工作类型', '职位名称', '薪资', '工作年限','公司发展阶段','技能要求']
    info_result.append(title)

    #抓取python语言信息
    lagou_list_python = get_lagou('python',20)

    # 抓取java语言信息
    lagou_list_java = get_lagou('java', 20)

    # 抓取go语言信息
    lagou_list_go = get_lagou('go', 20)


    info_result.extend(lagou_list_python)
    info_result.extend(lagou_list_java)
    info_result.extend(lagou_list_go)

    # 创建workbook,即excel
    workbook = xlwt.Workbook(encoding='utf_8_sig')
    # 创建sheet,第二参数用于确认同一个cell单元是否可以重设值
    worksheet = workbook.add_sheet('lagou', cell_overwrite_ok=True)
    for i, row in enumerate(info_result):
        for j, col in enumerate(row):
            worksheet.write(i, j, col)
    workbook.save('lagou.xls')


if __name__ == '__main__':
    main()
    # get_lagou('python',2)
    # print(res)
    # df = pd.DataFrame(res)
    # df.to_csv('lagou.csv', encoding='utf_8_sig')

4.分析数据

1.薪资对比

bar = Bar("薪资分布图", "数量")
bar.add("python薪资分布", df_python['薪资'], df_python['count'], is_more_utils=True)
bar.add("java薪资分布", df_java['薪资'], df_java['count'], is_more_utils=True)
bar.add("go薪资分布", df_go['薪资'], df_go['count'], is_more_utils=True)
# bar.print_echarts_options() # 该行只为了打印配置项,方便调试时使用
bar.render('薪资分布图.html')  # 生成本地 HTML 文件

从图上大致可以看成在高薪资这块,GO语言的优势比较大,"钱途"还是有的,对于python来说,薪资分布比较均匀,各个层次的人才都需要,但是如果想拿高薪,还是需要努力的,对于java来说呢,感觉比python还低一等,也许是java的需求量比较大,平均下面,薪资就不咋的了。

2.各大中心城市职位需求量

bar = Bar("职位需求量分布图", "数量")
bar.add("python需求量分布", df_python_pos['城市'], df_python_pos['count'], is_more_utils=True)
bar.add("java需求量分布", df_java_pos['城市'], df_java_pos['count'], is_more_utils=True)
bar.add("go需求量分布", df_go_pos['城市'], df_go_pos['count'], is_more_utils=True)
# bar.print_echarts_options() # 该行只为了打印配置项,方便调试时使用
bar.render('各大城市职位需求量大致分布图.html')  # 生成本地 HTML 文件

上图我们可以看到传统的北上广深,职位需求还是远远大于其他城市(抽样数据),但是杭州,成都也是后起之秀,对于我所在的大南京,哎,不说了,哭会去。。。。,但是大城市压力也大,房价也高,如果是年轻人,可以拼几年,如果可以本地安家当然好,如果不能就老老实实回二线城市,哈哈,个人意见,勿喷。

3.学历要求

pie = Pie("各类职位中学历所占的比例", title_pos='center')
pie.add(
    "python",
    df_python_education['学历要求'],
    df_python_education['count'],
    center=[50, 70],
    radius=[20, 30],
    label_text_color=None,
    is_label_show=True,
    legend_orient="vertical",
    legend_pos="left",
)

pie.add(
    "",
    df_java_education['学历要求'],
    df_java_education['count'],
    center=[70, 70],
    radius=[20, 30],
    label_text_color=None,
    is_label_show=True,
    legend_orient="vertical",
    legend_pos="left",
)

pie.add(
    "",
    df_go_education['学历要求'],
    df_go_education['count'],
    center=[90, 70],
    radius=[20, 30],
    label_text_color=None,
    is_label_show=True,
    legend_orient="vertical",
    legend_pos="left",
)

pie.render('python学历要求分布.html')


可以看到搞IT的大多数还是本科,如果可以研究生当然更好,薪资也会更好,大家也可以自己拿数据,分析下研究生和本科生的薪资差距。

完整代码获取关注公众号:pythonislover , 回复"职位"。

目录
相关文章
|
28天前
|
安全 Java 编译器
对比Java学习Go——基础理论篇
本章介绍了Java开发者学习Go语言的必要性。Go语言以简单、高效、并发为核心设计哲学,摒弃了传统的类继承和异常机制,采用组合、接口和多返回值错误处理,提升了代码清晰度与开发效率。Go直接编译为静态二进制文件,启动迅速、部署简便,其基于Goroutine和Channel的并发模型相较Java的线程与锁机制更轻量安全。此外,Go Modules简化了依赖管理,与Java的Maven/Gradle形成鲜明对比,提升了构建与部署效率。
|
6月前
|
JavaScript 前端开发 Java
通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
通义灵码新上的外挂 Project Rules 获得了开发者的一致好评:最小成本适配我的开发风格、相当把团队经验沉淀下来,是个很好功能……
1167 103
|
5月前
|
人工智能 Kubernetes Java
回归开源,两位 Java 和 Go 程序员分享的开源贡献指引
Higress是一个基于Istio和Envoy的云原生API网关,支持AI功能扩展。它通过Go/Rust/JS编写的Wasm插件提供可扩展架构,并包含Node和Java的console模块。Higress起源于阿里巴巴,解决了Tengine配置重载及gRPC/Dubbo负载均衡问题,现已成为阿里云API网关的基础。本文介绍Higress的基本架构、功能(如AI网关、API管理、Ingress流量网关等)、部署方式以及如何参与开源贡献。此外,还提供了有效的开源贡献指南和社区交流信息。
527 33
|
18天前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
28天前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
|
3月前
|
人工智能 安全 Java
Go与Java泛型原理简介
本文介绍了Go与Java泛型的实现原理。Go通过单态化为不同类型生成函数副本,提升运行效率;而Java则采用类型擦除,将泛型转为Object类型处理,保持兼容性但牺牲部分类型安全。两种机制各有优劣,适用于不同场景。
97 24
|
3月前
|
Java Shell Maven
【Azure Container App】构建Java应用镜像时候遇无法编译错误:ERROR [build 10/10] RUN ./mvnw.cmd dependency:go-offline -B -Dproduction package
在部署Java应用到Azure Container App时,构建镜像过程中出现错误:“./mvnw.cmd: No such file or directory”。尽管项目根目录包含mvnw和mvnw.cmd文件,但依然报错。问题出现在Dockerfile构建阶段执行`./mvnw dependency:go-offline`命令时,系统提示找不到可执行文件。经过排查,确认是mvnw文件内容异常所致。最终通过重新生成mvnw文件解决该问题,镜像成功构建。
|
5月前
|
数据采集 自然语言处理 Java
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
本文以反面教材形式,剖析了在使用 Playwright 爬取懂车帝车友圈问答数据时常见的配置错误(如未设置代理、Cookie 和 User-Agent),并提供了 Python、Java 和 .NET 三种语言的修复代码示例。通过错误示例 → 问题剖析 → 修复过程 → 总结教训的完整流程,帮助读者掌握如何正确配置爬虫代理及其它必要参数,避免 IP 封禁和反爬检测,实现高效数据采集与分析。
250 3
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
|
3月前
|
JSON JavaScript 前端开发
Python+JAVA+PHP语言,苏宁商品详情API
调用苏宁商品详情API,可通过HTTP/HTTPS发送请求并解析响应数据,支持多种编程语言,如JavaScript、Java、PHP、C#、Ruby等。核心步骤包括构造请求URL、发送GET/POST请求及解析JSON/XML响应。不同语言示例展示了如何获取商品名称与价格等信息,实际使用时请参考苏宁开放平台最新文档以确保兼容性。
|
6月前
|
数据采集 自然语言处理 JavaScript
Playwright多语言生态:跨Python/Java/.NET的统一采集方案
随着数据采集需求的增加,传统爬虫工具如Selenium、Jsoup等因语言割裂、JS渲染困难及代理兼容性差等问题,难以满足现代网站抓取需求。微软推出的Playwright框架,凭借多语言支持(Python/Java/.NET/Node.js)、统一API接口和优异的JS兼容性,解决了跨语言协作、动态页面解析和身份伪装等痛点。其性能优于Selenium与Puppeteer,在学术数据库(如Scopus)抓取中表现出色。行业应用广泛,涵盖高校科研、大型数据公司及AI初创团队,助力构建高效稳定的爬虫系统。
295 2
Playwright多语言生态:跨Python/Java/.NET的统一采集方案

推荐镜像

更多