用Python分析深圳程序員工資有多高?還真是多金的程序員!
前言
多圖預(yù)警、多圖預(yù)警、多圖預(yù)警。秋招季,畢業(yè)也多,跳槽也多。我們的職業(yè)發(fā)展還是要順應(yīng)市場(chǎng)需求,那么各門編程語(yǔ)言在深圳的需求怎么呢?工資待遇怎么樣呢?zone 在上次寫了這篇文章之后 用Python告訴你深圳房租有多高 ,想繼續(xù)用 Python 分析一下,當(dāng)前深圳的求職市場(chǎng)怎么樣?順便幫一下秋招的同學(xué)。于是便爬取了某拉鉤招聘數(shù)據(jù)。以下是本次爬蟲的樣本數(shù)據(jù):
樣本
本次統(tǒng)計(jì)數(shù)據(jù)量為 4658 ,其中某拉鉤最多能顯示 30 頁(yè)數(shù)據(jù),每頁(yè) 15 條招聘信息,則總為:
30 x 15 = 450
首頁(yè)爬取跳過(guò)一頁(yè),則為 435 條,故數(shù)據(jù)基本爬完。其余不夠數(shù)量的語(yǔ)言為該語(yǔ)言在深圳只有這么多條招聘信息。
統(tǒng)計(jì)結(jié)果
各語(yǔ)言平均工資
其中
- 精準(zhǔn)推薦
- 自然語(yǔ)言
- 機(jī)器學(xué)習(xí)
- Go 語(yǔ)言
- 圖像識(shí)別
獨(dú)領(lǐng)風(fēng)騷啊?。?!平均工資都挺高的。區(qū)塊鏈炒得挺火的,好像平均薪資并沒(méi)有那么高。我統(tǒng)計(jì)完之后,感覺(jué)自己拖后腿了,ma 的!??!要?jiǎng)h庫(kù)跑路了?。ㄗⅲ合聢D為月薪,單位:K)
各語(yǔ)言平均薪資
平均工資計(jì)算方式:
某鉤 item
***值與***值,求平均數(shù),如圖薪資則為:
(10k + 20k)/2 = 15k
***,再總體求平均數(shù)。
公司福利詞云
看福利還是挺豐富的,帶薪休假、下午茶、零食、節(jié)假日。
福利詞云
公司發(fā)展級(jí)別排行
總體由 A 輪向 D 輪縮減,大部分公司不需要融資,嗯,估計(jì)是拿不到資本融資,但是自家人又有錢的。
公司發(fā)展級(jí)別
各語(yǔ)言工作年限要求與學(xué)歷要求
看看你的本命語(yǔ)言的市場(chǎng)需求怎么樣?你達(dá)標(biāo)了嗎?其中三至五年的攻城獅職位挺多的,不怕找不到工作。還有一個(gè)趨勢(shì)是,薪資越高,學(xué)歷要求越高高??磥?lái)學(xué)歷還是挺重要的。
Java
Java 工作年限要求
Java 學(xué)歷要求
Python
Python 工作年限要求
Python 學(xué)歷要求
C 語(yǔ)言
C 語(yǔ)言工作年限要求
C 語(yǔ)言學(xué)歷要求
機(jī)器學(xué)習(xí)
機(jī)器學(xué)習(xí)工作年限要求
機(jī)器學(xué)習(xí)學(xué)歷要求
圖像識(shí)別
圖像識(shí)別工作年限要求
圖像識(shí)別學(xué)歷要求
自然語(yǔ)言
自然語(yǔ)言工作年限要求
自然語(yǔ)言學(xué)歷要求
區(qū)塊鏈
區(qū)塊鏈工作年限要求
區(qū)塊鏈學(xué)歷要求
Go 語(yǔ)言
Go 語(yǔ)言工作年限要求
Go
PHP
PHP 工作年限要求
PHP 學(xué)歷要求
爬蟲技術(shù)分析
- 請(qǐng)求庫(kù):selenium
- HTML 解析:BeautifulSoup、xpath
- 詞云:wordcloud
- 數(shù)據(jù)可視化:pyecharts
- 數(shù)據(jù)庫(kù):MongoDB
- 數(shù)據(jù)庫(kù)連接:pymongo
爬蟲代碼實(shí)現(xiàn)
看完統(tǒng)計(jì)結(jié)果之后,有沒(méi)有躍躍欲試?想要自己也實(shí)現(xiàn)以下代碼?以下為代碼實(shí)現(xiàn)。
對(duì)網(wǎng)頁(yè)右擊,點(diǎn)擊檢查,找到一條 item 的數(shù)據(jù):
網(wǎng)頁(yè)源碼
數(shù)據(jù)庫(kù)存儲(chǔ)結(jié)構(gòu):
- /* 1 */
- {
- "_id" : ObjectId("5b8b89328ffaed60a308bacd"),
- "education" : "本科",# 學(xué)習(xí)要求
- "companySize" : "2000人以上",# 公司人數(shù)規(guī)模
- "name" : "python開發(fā)工程師",# 職位名稱
- "welfare" : "“朝九晚五,公司平臺(tái)大,發(fā)展機(jī)遇多,六險(xiǎn)一金”",# 公司福利
- "salaryMid" : 12.5,# 工資上限與工資下限的平均數(shù)
- "companyType" : "移動(dòng)互聯(lián)網(wǎng)",# 公司類型
- "salaryMin" : "10",# 工資下限
- "salaryMax" : "15",# 工資上限
- "experience" : "經(jīng)驗(yàn)3-5年",# 工作年限
- "companyLevel" : "不需要融資",# 公司級(jí)別
- "company" : "XXX技術(shù)有限公司"# 公司名稱
- }
由于篇幅原因,以下只展示主要代碼:
- # 獲取網(wǎng)頁(yè)源碼數(shù)據(jù)
- # language => 編程語(yǔ)言
- # city => 城市
- # collectionType => 值:True/False True => 數(shù)據(jù)庫(kù)表以編程語(yǔ)言命名 False => 以城市命名
- def main(self, language, city, collectionType):
- print(" 當(dāng)前爬取的語(yǔ)言為 => " + language + " 當(dāng)前爬取的城市為 => " + 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">下一頁(yè)<strong class="pager_lgthen pager_lgthen_dis"></strong></span>
- classArr = span['class']
- print(classArr) # 輸出內(nèi)容為 -> ['pager_next', 'pager_next_disabled']
- attr = list(classArr)[0]
- attr2 = list(classArr)[1]
- if attr2 == "pager_next_disabled":#分析發(fā)現(xiàn) class 屬性為 ['pager_next', 'pager_next_disabled'] 時(shí),【下一頁(yè)】按鈕不可點(diǎn)擊
- print("已經(jīng)爬到***一頁(yè),爬蟲結(jié)束")
- break
- else:
- print("還有下一頁(yè),爬蟲繼續(xù)")
- browser.find_element_by_xpath('//*[@id="order"]/li/div[4]/div[2]').click() # 點(diǎn)擊【下一頁(yè)】按鈕
- time.sleep(5)
- print('第{}頁(yè)抓取完畢'.format(i + 1))
- self.getItemData(selector, language, city, collectionType)# 解析 item 數(shù)據(jù),并存進(jìn)數(shù)據(jù)庫(kù)
- browser.close()
爬蟲分析實(shí)現(xiàn)
- # 獲取各語(yǔ)言樣本數(shù)量
- 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)
- # 獲取各語(yǔ)言的平均工資
- 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)
- # 獲取一門語(yǔ)言的學(xué)歷要求(用于 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)
- # 獲取一門語(yǔ)言的工作年限要求(用于 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 數(shù)據(jù),用于構(gòu)建福利詞云
- 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
- # 獲取公司級(jí)別排行(用于條形圖)
- 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)