1. 程式人生 > >IT職場新人選python,go還是java?用數據來說話

IT職場新人選python,go還是java?用數據來說話

encoding inf random ksh book and update radius 研究

最近有讀者在後臺問,剛參加工作,想選一個職業方法,問我現在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 , 回復"職位"。
技術分享圖片

IT職場新人選python,go還是java?用數據來說話