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

概述

  • 前言
  • 統計結果
  • 爬蟲技術分析
  • 爬蟲代碼實現
  • 爬蟲分析實現
  • 後記
  • 預告

前言

**多圖預警、多圖預警、多圖預警。**秋招季,畢業也多,跳槽也多。咱們的職業發展仍是要順應市場需求,那麼各門編程語言在深圳的需求怎麼呢?工資待遇怎麼樣呢?zone 在上次寫了這篇文章以後【用Python告訴你深圳房租有多高】,想繼續用 Python 分析一下,當前深圳的求職市場怎麼樣?因而便爬取了某鉤招聘數據。如下是本次爬蟲的樣本數據: html

樣本

本次統計數據量爲 4658 ,其中某拉鉤最多能顯示 30 頁數據,每頁 15 條招聘信息,則總爲:前端

30 x 15 = 450python

首頁爬取跳過一頁,則爲 435 條,故數據基本爬完。其他不夠數量的語言爲該語言在深圳只有這麼多條招聘信息。web

統計結果

各語言平均工資 其中數據庫

  • 精準推薦
  • 天然語言
  • 機器學習
  • Go 語言
  • 圖像識別

獨領風騷啊!!!平均工資都挺高的。區塊鏈炒得挺火的,好像平均薪資並無那麼高。我統計完以後,感受本身拖後腿了,ma 的!!!要刪庫跑路了!編程

各語言平均薪資

平均工資計算方式: 後端

某鉤 item
最高值與最低值,求平均數,如圖薪資則爲:

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

最後,再整體求平均數。 公司福利詞雲 看福利仍是挺豐富的,帶薪休假、下午茶、零食、節假日。 網絡

福利詞雲

公司發展級別排行 整體由 A 輪向 D 輪縮減,大部分公司不須要融資,嗯,估計是拿不到資本融資,可是自家人又有錢的。 app

公司發展級別

各語言工做年限要求與學歷要求 看看你的本命語言的市場需求怎麼樣?你達標了嗎?其中三至五年的攻城獅職位挺多的,不怕找不到工做。還有一個趨勢是,薪資越高,學歷要求越高高。看來學歷仍是挺重要的。

Java

Java 工做年限要求
Java 學歷要求

Python

Python 工做年限要求
Python 學歷要求

C 語言

C 語言工做年限要求
C 語言學歷要求

機器學習

機器學習工做年限要求
機器學習學歷要求

圖像識別

圖像識別工做年限要求
圖像識別學歷要求

天然語言

天然語言工做年限要求
天然語言學歷要求

區塊鏈

區塊鏈工做年限要求
區塊鏈學歷要求

Go 語言

Go 語言工做年限要求
Go

PHP

PHP 工做年限要求
PHP 學歷要求

Android

Android 工做年限要求
Android 學歷要求

iOS

iOS 工做年限要求
iOS 學歷要求

web 前端

web 前端工做年限要求
web 前端學歷要求

精準推薦

精準推薦工做年限要求
精準推薦學歷要求

Node.js

Node.js 工做年限要求
Node.js 學歷要求

Hadoop

Hadoop 工做年限要求
Hadoop 學歷要求

爬蟲技術分析

  • 請求庫: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」,關注公衆號獲取最新推文,後臺回覆【深圳求職】獲取源碼。

相關文章
相關標籤/搜索