天天看點

利用 Python 爬取了 13966 條運維招聘資訊,我得出了哪些結論?

利用 Python 爬取了 13966 條運維招聘資訊,我得出了哪些結論?

公衆号背景回複:「運維」可擷取本文完整資料

作者:JackTian、黃偉呢

大家好,我是 JackTian。

我經常會收到讀者關于一系列咨詢運維方面的事情,比如:傑哥,運維到底是做什麼的呀?運維的薪資水準/ 待遇怎麼樣呢?傑哥幫忙看下這個崗位的招聘需要對于小白來說,能否勝任的了呢?等等。

這裡,我把之前寫的《​​一篇文章帶你解讀從初級運維工程師到資深運維專家的學習路線​​》,本文從初級 / 中級 / 進階運維工程師以及到資深方向逐漸展開給大家彙總了一些各階段所具備的技能,僅供學習路線參考,如有補充,可通過本文進行留言參與互動。

這次呢,傑哥帶着一種好奇心的想法,結合自身的工作經驗與業界全國關于招聘運維工程師的崗位做一個初步型的分析,我的一位好朋友 —— 黃偉呢,幫我爬取了 13966 條關于運維的招聘資訊,看看有哪些資料存在相關差異化。主要包括内容:

  • 熱門行業的用人需求 Top10
  • 熱門城市的崗位數量 Top10
  • 崗位的省份分布
  • 不同公司規模的用人情況
  • 排名前 10 的崗位的平均薪資
  • 崗位對學曆的要求
  • 運維崗位需求的詞雲圖分布
利用 Python 爬取了 13966 條運維招聘資訊,我得出了哪些結論?

對于本文的叙述,我們分以下三步為大家講解。

  • 爬蟲部分
  • 資料清洗
  • 資料可視化及分析

1、爬蟲部分

本文主要爬取的是 51job 上面,關于運維相關崗位的資料,網站解析主要使用的是Xpath,資料清洗用的是 Pandas 庫,而可視化主要使用的是 Pyecharts 庫。

相關注釋均已在代碼中注明,為友善閱讀,這裡隻展示部分代碼,完整代碼可檢視文末部分進行擷取。

# 1、崗位名稱job_name = dom.xpath('//div[@class="dw_table"]/div[@class="el"]//p/span/a[@target="_blank"]/@title')
# 2、公司名稱company_name = dom.xpath('//div[@class="dw_table"]/div[@class="el"]/span[@class="t2"]/a[@target="_blank"]/@title')
# 3、工作地點address = dom.xpath('//div[@class="dw_table"]/div[@class="el"]/span[@class="t3"]/text()')
# 4、工資salary_mid = dom.xpath('//div[@class="dw_table"]/div[@class="el"]/span[@class="t4"]')salary = [i.text for i in salary_mid]
# 5、釋出日期release_time = dom.xpath('//div[@class="dw_table"]/div[@class="el"]/span[@class="t5"]/text()')
# 6、擷取二級網址urldeep_url = dom.xpath('//div[@class="dw_table"]/div[@class="el"]//p/span/a[@target="_blank"]/@href')
# 7、爬取經驗、學曆資訊,先合在一個字段裡面,以後再做資料清洗。命名為random_allrandom_all = dom_test.xpath('//div[@class="tHeader tHjob"]//div[@class="cn"]/p[@class="msg ltype"]/text()')
# 8、崗位描述資訊job_describe = dom_test.xpath('//div[@class="tBorderTop_box"]//div[@class="bmsg job_msg inbox"]/p/text()')
# 9、公司類型company_type = dom_test.xpath('//div[@class="tCompany_sidebar"]//div[@class="com_tag"]/p[1]/@title')
# 10、公司規模(人數)company_size = dom_test.xpath('//div[@class="tCompany_sidebar"]//div[@class="com_tag"]/p[2]/@title')
# 11、所屬行業(公司)industry = dom_test.xpath('//div[@class="tCompany_sidebar"]//div[@class="com_tag"]/p[3]/@title')      

2、資料清洗

1)讀取資料

# 下面使用到的相關庫,在這裡展示一下import pandas as pdimport numpy as npimport reimport jieba
df = pd.read_csv("only_yun_wei.csv",encoding="gbk",header=None)df.head()      

2)為資料設定新的行、列索引

# 為資料框指定行索引df.index = range(len(df))# 為資料框指定列索引df.columns = ["崗位名","公司名","工作地點","工資","釋出日期","經驗與學曆","公司類型","公司規模","行業","工作描述"]df.head()      

3)去重處理

# 去重之前的記錄數print("去重之前的記錄數",df.shape)# 記錄去重df.drop_duplicates(subset=["公司名","崗位名","工作地點"],inplace=True)# 去重之後的記錄數print("去重之後的記錄數",df.shape)      

4)對崗位名字段的處理

# ① 崗位字段名的探索df["崗位名"].value_counts()df["崗位名"] = df["崗位名"].apply(lambda x:x.lower())
# ② 構造想要分析的目标崗位,做一個資料篩選df.shapetarget_job = ['運維','Linux運維','運維開發','devOps','應用運維','系統運維','資料庫運維','運維安全','網絡運維','桌面運維']index = [df["崗位名"].str.count(i) for i in target_job]index = np.array(index).sum(axis=0) > 0job_info = df[index]job_info.shape
job_list = ['linux運維','運維開發','devOps','應用運維','系統運維','資料庫運維'            ,'運維安全','網絡運維','桌面運維','it運維','軟體運維','運維工程師']job_list = np.array(job_list)def rename(x=None,job_list=job_list):
    index = [i in x for i in job_list]    if sum(index) > 0:
        return job_list[index][0]
    else:
        return x
job_info["崗位名"] = job_info["崗位名"].apply(rename)job_info["崗位名"].value_counts()[:10]      

5)工資字段的處理

job_info["工資"].str[-1].value_counts()job_info["工資"].str[-3].value_counts()
index1 = job_info["工資"].str[-1].isin(["年","月"])index2 = job_info["工資"].str[-3].isin(["萬","千"])job_info = job_info[index1 & index2]job_info["工資"].str[-3:].value_counts()
def get_money_max_min(x):
    try:
        if x[-3] == "萬":            z = [float(i)*10000 for i in re.findall("[0-9]+\.?[0-9]*",x)]        elif x[-3] == "千":            z = [float(i) * 1000 for i in re.findall("[0-9]+\.?[0-9]*", x)]        if x[-1] == "年":            z = [i/12 for i in z]        return z    except:        return x
salary = job_info["工資"].apply(get_money_max_min)
job_info["最低工資"] = salary.str[0]job_info["最高工資"] = salary.str[1]job_info["工資水準"] = job_info[["最低工資","最高工資"]].mean(axis=1)      

6)工作地點字段的處理

address_list = ['北京', '上海', '廣州', '深圳', '杭州', '蘇州', '長沙',                '武漢', '天津', '成都', '西安', '東莞', '合肥', '佛山',                '甯波', '南京', '重慶', '長春', '鄭州', '常州', '福州',                '沈陽', '濟南', '甯波', '廈門', '貴州', '珠海', '青島',                '中山', '大連','昆山',"惠州","哈爾濱","昆明","南昌","無錫"]address_list = np.array(address_list)
def rename(x=None,address_list=address_list):
    index = [i in x for i in address_list]    if sum(index) > 0:
        return address_list[index][0]
    else:
        return x
job_info["工作地點"] = job_info["工作地點"].apply(rename)job_info["工作地點"].value_counts()      

7)公司類型字段的處理

job_info.loc[job_info["公司類型"].apply(lambda x:len(x)<6),"公司類型"] = np.nanjob_info["公司類型"] = job_info["公司類型"].str[2:-2]job_info["公司類型"].value_counts()      

8)行業字段的處理

job_info["行業"] = job_info["行業"].apply(lambda x:re.sub(",","/",x))job_info.loc[job_info["行業"].apply(lambda x:len(x)<6),"行業"] = np.nanjob_info["行業"] = job_info["行業"].str[2:-2].str.split("/").str[0]job_info["行業"].value_counts()      

9)經驗與學曆字段的處理

job_info["學曆"] = job_info["經驗與學曆"].apply(lambda x:re.findall("大學|大專|應屆生|在校生|碩士|博士",x))def func(x):
    if len(x) == 0:        return np.nan
    elif len(x) == 1 or len(x) == 2:        return x[0]    else:        return x[2]job_info["學曆"] = job_info["學曆"].apply(func)job_info["學曆"].value_counts()      

10)公司規模字段的處理

def func(x):
    if x == "['少于50人']":        return "<50"    elif x == "['50-150人']":        return "50-150"    elif x == "['150-500人']":        return '150-500'    elif x == "['500-1000人']":        return '500-1000'    elif x == "['1000-5000人']":        return '1000-5000'    elif x == "['5000-10000人']":        return '5000-10000'    elif x == "['10000人以上']":        return ">10000"    else:        return np.nanjob_info["公司規模"] = job_info["公司規模"].apply(func)      

11)将處理好的資料,構造新資料,導出為新的 excel

feature = ["公司名","崗位名","工作地點","工資水準","釋出日期","學曆","公司類型","公司規模","行業","工作描述"]final_df = job_info[feature]final_df.to_excel(r"可視化.xlsx",encoding="gbk",index=None)      

3、資料可視化

1)可視化大屏效果

利用 Python 爬取了 13966 條運維招聘資訊,我得出了哪些結論?

2)熱門行業的用人需求 Top10

從招聘行業的資料來看,計算機軟體,計算機服務,網際網路,通信行業用人需求相比其他行業占比會高。

利用 Python 爬取了 13966 條運維招聘資訊,我得出了哪些結論?

3)熱門城市的崗位數量 Top10

從熱門城市來看,北上廣深的一線城市,用人崗位數占比較大,不過這裡的異地招聘資料及結合過往經驗,偏外包性質的企業。

利用 Python 爬取了 13966 條運維招聘資訊,我得出了哪些結論?

4)崗位的省份分布

崗位分布省份,通過最左側的顔色棒,我們可以看出顔色最深的地區崗位招聘數越集中,相反之下,最淺的也就是崗位招聘數越少的省份。從下圖來看,廣東省、江蘇省、上海及北京顔色相比其他省份占據分布會比較集中些。

利用 Python 爬取了 13966 條運維招聘資訊,我得出了哪些結論?

5)不同公司規模的用人情況

行業的不同,公司規模肯定是存在有差異的。公司規模是指按有關标準和規定劃分的公司規模,一般分為特大型、大型、中型、小型、微型。如下圖,公司規模人數在 50-500 範圍内占據 50% 以上,用人需求最高,1000-10000 範圍占據不到 50 %,不過這樣的公司規模已經是比較大的了。

利用 Python 爬取了 13966 條運維招聘資訊,我得出了哪些結論?

6)排名前 10 的崗位的平均薪資

根據我的了解,比如:系統工程師、軟體 / 實施工程師、運維專員 等一系列的崗位其實也是可以劃分在運維領域範疇之内的,每家公司對運維工作者的崗位名稱定義有所不同,為了能夠更精準的篩選分析,把那些崗位占時去掉了。留下了以下 10 個崗位名稱(運維開發、運維工程師、軟體運維、網絡運維、系統運維、桌面運維、資料庫運維、應用運維、Linux 運維、IT 運維)這些崗位名稱基本是我見過招聘資訊内最多的。

排名前 10 的崗位平均薪資,運維開發、應用運維、資料庫運維、Linux 運維均在 1W 以上。是以,也可以看出運維開發在運維領域的優勢,是占據前沿位置。

利用 Python 爬取了 13966 條運維招聘資訊,我得出了哪些結論?

7)運維崗位的學曆要求分布

從學曆要求方面來看,大專及大學學曆占比居多。在校生、碩士、博士基本太少了,是以會有一些我的學生群體讀者會問我,對于一個應屆畢業生,找運維工作好找嗎?站在我個人的角度,我是不建議你畢業後去做運維的。因為運維對你個人的技術水準及工作經驗有些非常高的要求,而對于一個剛畢業的學生來說,沒有過多的實踐經驗,也不會有很大的優勢,除非是這個崗位對你有極大的興趣愛好,但凡你也可以嘗試下。

利用 Python 爬取了 13966 條運維招聘資訊,我得出了哪些結論?

8)運維崗位需求的詞雲圖分布

從運維崗位招聘需求詞雲圖來看,詞頻最多的主要包括:運維、能力、系統、維護、經驗等等,是以也可以看出運維崗位對個人技術能力以及過往工作經驗是要求非常高的。當然了還有很多其他相關的詞頻,可通過下圖檢視詳情。

利用 Python 爬取了 13966 條運維招聘資訊,我得出了哪些結論?

總結

介紹了這麼多,相信你也對運維工程師有了初步的認識與了解,通過本篇文章你可以了解到哪些行業的對運維的用人需求是比較高的?最為招聘運維熱門的城市有哪些?運維崗位的分布、不同公司規模對運維工程師的用人情況占比、關于運維相關崗位的平均薪資、招聘運維崗位對學曆的要求以及運維崗位需求詞雲圖包括哪些詞頻最多,通過這一資料的分析,相信能對你在今後的運維求職方向、行業、城市以及公司規模有所初步的判斷及選擇,希望對你有所幫助。

關于針對運維崗位所具備的技能點,可參考《​​一篇文章帶你解讀從初級運維工程師到資深運維專家的學習路線​​》,如果你對運維崗位還有其他相關疑惑的,也可以通過本篇文章留言參與互動,對于那些大多數讀者有存在相關問題的,我還可以從留言區中挖掘一下,有沒有後續寫相關文章的需要。是以,大家盡情的留言吧。

原創不易,碼字不易,如果你覺得這篇文章對你有點用的話,就請為本文留個言,點個在看,或者轉發一下吧,讓更多的運維工程師看到。因為這将是我持續輸出更多優質文章的最強動力!感謝大家!

對了,最後,在這裡還想說一點,關于不同領域以及相關有意思的文章征稿中,歡迎大家的參與,具體聯系方式可通過本公衆号底部菜單欄中 >>> 聯系我中,進行檢視,期待我們能一起搞事情。

福利時間

書籍贊助方:機械工業出版社

贈書書籍:《高性能Linux伺服器運維實戰》

贈書數量: 1 本

參與方式: 轉發本文到朋友圈,然後背景回複“666”參與

截止時間:2020年7月15日,晚 20:00

end