哪種 Python 程序員最賺錢?
- 2019 年 10 月 8 日
- 筆記
本文是春節經典文章回顧專題第一彈。轉載自簡說Python,作者XksA,詳情可以掃描下方二維碼關注該公眾號
這是之前寫的兩篇文章的整合版(Python職位分析上與Python職位分析下),由csdn排版,這幾天這個文章又活起來了(不過的確是挺好的,當時寫花了好幾天時間),所以特地發一遍,讓新讀者也看看,文章很長,耐心觀看。
爬蟲準備
1、先獲取薪資和學歷、工作經驗要求
由於拉勾網數據加載是動態加載的,需要我們分析。分析方法如下:
F12分析頁面數據存儲位置
我們發現網頁內容是通過post請求得到的,返回數據是json格式,那我們直接拿到json數據即可。
我們只需要薪資和學歷、工作經驗還有單個招聘信息,返回json數據字典中對應的英文為:positionId,salary, education, workYear(positionId為單個招聘信息詳情頁面編號)。相關操作代碼如下:
- 文件存儲:
def file_do(list_info): # 獲取文件大小 file_size = os.path.getsize(r'G:lagou_anv.csv') if file_size == 0: # 表頭 name = ['ID','薪資', '學歷要求', '工作經驗'] # 建立DataFrame對象 file_test = pd.DataFrame(columns=name, data=list_info) # 數據寫入 file_test.to_csv(r'G:lagou_anv.csv', encoding='gbk', index=False) else: with open(r'G:lagou_anv.csv', 'a+', newline='') as file_test: # 追加到文件後面 writer = csv.writer(file_test) # 寫入文件 writer.writerows(list_info)
- 基本數據獲取:
# 1. post 請求 url req_url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false' # 2.請求頭 headers headers = { 'Accept': 'application/json,text/javascript,*/*;q=0.01', 'Connection': 'keep-alive', 'Cookie': '你的Cookie值,必須加上去', 'Host': 'www.lagou.com', 'Referer': 'https://www.lagou.com/jobs/list_Python?labelWords=&fromSearch=true&suginput=', 'User-Agent': str(UserAgent().random), } def get_info(headers): # 3.for 循環請求(一共30頁) for i in range(1, 31): # 翻頁 data = { 'first': 'true', 'kd': 'Python爬蟲', 'pn': i } # 3.1 requests 發送請求 req_result = requests.post(req_url, data=data, headers=headers) req_result.encoding = 'utf-8' print("第%d頁:"%i+str(req_result.status_code)) # 3.2 獲取數據 req_info = req_result.json() # 定位到我們所需數據位置 req_info = req_info['content']['positionResult']['result'] print(len(req_info)) list_info = [] # 3.3 取出具體數據 for j in range(0, len(req_info)): salary = req_info[j]['salary'] education = req_info[j]['education'] workYear = req_info[j]['workYear'] positionId = req_info[j]['positionId'] list_one = [positionId,salary, education, workYear] list_info.append(list_one) print(list_info) # 存儲文件 file_do(list_info) time.sleep(1.5)
- 運行結果:

2、根據獲取到的`positionId`來訪問招聘信息詳細頁面
- 根據`positionId`還原訪問鏈接:
position_url = [] def read_csv(): # 讀取文件內容 with open(r'G:lagou_anv.csv', 'r', newline='') as file_test: # 讀文件 reader = csv.reader(file_test) i = 0 for row in reader: if i != 0 : # 根據positionID補全鏈接 url_single = "https://www.lagou.com/jobs/%s.html"%row[0] position_url.append(url_single) i = i + 1 print('一共有:'+str(i-1)+'個') print(position_url)
- 訪問招聘信息詳情頁面,獲取職位描述(崗位職責和崗位要求)並清理數據:
def get_info(): for position_url in position_urls: work_duty = '' work_requirement = '' response00 = get_response(position_url,headers = headers) time.sleep(1) content = response00.xpath('//*[@id="job_detail"]/dd[2]/div/p/text()') # 數據清理 j = 0 for i in range(len(content)): content[i] = content[i].replace('xa0',' ') if content[i][0].isdigit(): if j == 0: content[i] = content[i][2:].replace('、',' ') content[i] = re.sub('[;;.0-9。]','', content[i]) work_duty = work_duty+content[i]+ '/' j = j + 1 elif content[i][0] == '1' and not content[i][1].isdigit(): break else: content[i] = content[i][2:].replace('、', ' ') content[i] = re.sub('[、;;.0-9。]','',content[i]) work_duty = work_duty + content[i]+ '/' m = i # 崗位職責 write_file(work_duty) print(work_duty) # 數據清理 j = 0 for i in range(m,len(content)): content[i] = content[i].replace('xa0',' ') if content[i][0].isdigit(): if j == 0: content[i] = content[i][2:].replace('、', ' ') content[i] = re.sub('[、;;.0-9。]', '', content[i]) work_requirement = work_requirement + content[i] + '/' j = j + 1 elif content[i][0] == '1' and not content[i][1].isdigit(): # 控制範圍 break else: content[i] = content[i][2:].replace('、', ' ') content[i] = re.sub('[、;;.0-9。]', '', content[i]) work_requirement = work_requirement + content[i] + '/' # 崗位要求 write_file2(work_requirement) print(work_requirement) print("-----------------------------")
- 運行結果:

duty

require
3、四種圖可視化數據+數據清理方式
- 矩形樹圖:
# 1.矩形樹圖可視化學歷要求 from pyecharts import TreeMap education_table = {} for x in education: education_table[x] = education.count(x) key = [] values = [] for k,v in education_table.items(): key.append(k) values.append(v) data = [] for i in range(len(key)) : dict_01 = {"value": 40, "name": "我是A"} dict_01["value"] = values[i] dict_01["name"] = key[i] data.append(dict_01) tree_map = TreeMap("矩形樹圖", width=1200, height=600) tree_map.add("學歷要求",data, is_label_show=True, label_pos='inside')
- 玫瑰餅圖:
# 2.玫瑰餅圖可視化薪資 import re import math ''' # 薪水分類 parameter : str_01--字符串原格式:20k-30k returned value : (a0+b0)/2 --- 解析後變成數字求中間值:25.0 ''' def assort_salary(str_01): reg_str01 = "(d+)" res_01 = re.findall(reg_str01, str_01) if len(res_01) == 2: a0 = int(res_01[0]) b0 = int(res_01[1]) else : a0 = int(res_01[0]) b0 = int(res_01[0]) return (a0+b0)/2 from pyecharts import Pie salary_table = {} for x in salary: salary_table[x] = salary.count(x) key = ['5k以下','5k-10k','10k-20k','20k-30k','30k-40k','40k以上'] a0,b0,c0,d0,e0,f0=[0,0,0,0,0,0] for k,v in salary_table.items(): ave_salary = math.ceil(assort_salary(k)) print(ave_salary) if ave_salary < 5: a0 = a0 + v elif ave_salary in range(5,10): b0 = b0 +v elif ave_salary in range(10,20): c0 = c0 +v elif ave_salary in range(20,30): d0 = d0 +v elif ave_salary in range(30,40): e0 = e0 +v else : f0 = f0 + v values = [a0,b0,c0,d0,e0,f0] pie = Pie("薪資玫瑰圖", title_pos='center', width=900) pie.add("salary",key,values,center=[40, 50],is_random=True,radius=[30, 75],rosetype="area",is_legend_show=False,is_label_show=True)
- 普通柱狀圖:
# 3.工作經驗要求柱狀圖可視化 from pyecharts import Bar workYear_table = {} for x in workYear: workYear_table[x] = workYear.count(x) key = [] values = [] for k,v in workYear_table.items(): key.append(k) values.append(v) bar = Bar("柱狀圖") bar.add("workYear", key, values, is_stack=True,center= (40,60))
- 詞雲圖:
import jieba from pyecharts import WordCloud import pandas as pd import re,numpy stopwords_path = 'H:PyCodingLagou_analysisstopwords.txt' def read_txt(): with open("G:lagouContent\ywkf_requirement.txt",encoding='gbk') as file: text = file.read() content = text # 去除所有評論里多餘的字符 content = re.sub('[,,。. rn]', '', content) segment = jieba.lcut(content) words_df = pd.DataFrame({'segment': segment}) # quoting=3 表示stopwords.txt里的內容全部不引用 stopwords = pd.read_csv(stopwords_path, index_col=False,quoting=3, sep="t", names=['stopword'], encoding='utf-8') words_df = words_df[~words_df.segment.isin(stopwords.stopword)] words_stat = words_df.groupby(by=['segment'])['segment'].agg({"計數": numpy.size}) words_stat = words_stat.reset_index().sort_values(by=["計數"], ascending=False) test = words_stat.head(200).values codes = [test[i][0] for i in range(0, len(test))] counts = [test[i][1] for i in range(0, len(test))] wordcloud = WordCloud(width=1300, height=620) wordcloud.add("必須技能", codes, counts, word_size_range=[20, 100]) wordcloud.render("H:PyCodingLagou_analysiscloud_pitywkf_bxjn.html")

Python爬蟲崗位
學歷要求

工作月薪

工作經驗要求

爬蟲技能
關鍵詞解析:
- 學歷:本科
- 工作月薪:10k-30k
- 工作經驗:1-5年
- 技能:分佈式、多線程、框架、Scrapy、算法、數據結構、數據庫
綜合:爬蟲這個崗位在學歷要求上比較放鬆,大多數為本科即可,比較適合想轉業的老哥小姐姐,學起來也不會特別難。而且薪資待遇上也還算比較優厚,基本在10k以上。不過唯一對工作經驗要求還是比較高的,有近一半的企業要求工作經驗要達到3年以上。

Python數據分析崗位

工作月薪

工作經驗要求

數據分析技能
關鍵詞解析:
- 學歷:本科(碩士比例有所增高)
- 工作月薪:10k-30k
- 工作經驗:1-5年
- 技能:SAS、SPSS、Hadoop、Hive、數據庫、Excel、統計學、算法
綜合:數據分析這個崗位在學歷要求上比爬蟲要求稍微高一些,碩士比例有所提升,專業知識上有一定要求。薪資待遇上也還算比較優厚,基本在10k以上,同時薪資在30k-40k的比例也有所上升。對工作經驗要求還是比較高,大部分的企業要求工作經驗要達到3年以上。
Python後端崗位
學歷要求
工作月薪
工作經驗要求
後端技能

學歷要求

工作月薪

工作經驗要求

後端技能
關鍵詞解析:
- 學歷:本科
- 工作月薪:10k-30k
- 工作經驗:3-5年
- 技能:Flask、Django、Tornado、Linux、MySql、Redis、MongoDB、TCP/IP、數學(哈哈)
綜合:web後端這個崗位對學歷要求不高,但專業知識上有很大要求,得會Linux操作系統基本操作、三大主流數據庫的使用、以及三大基本web框架的使用等計算機相關知識,總體來說難道還是比較大。薪資待遇上也比較優厚,基本在10k以上,同時薪資在30k-40k的比例也有近20%。對工作經驗要求還是比較高,大部分的企業要求工作經驗要達到3年以上。

學歷要求

工作月薪

工作經驗要求

數據挖掘技能
關鍵詞解析:
- 學歷:本科(碩士)
- 工作月薪:20k-40k
- 工作經驗:3-5年
- 技能:學歷(hhh)、Hadoop、Spark、MapReduce、Scala、Hive、聚類、決策樹、GBDT、算法
綜合:數據挖掘這個崗位,在學歷要求是最高的,雖然還是本科居多,但碩士比例明顯增加,還有公司要求博士學歷。在專業知識上也有很大要求,得會Linux操作系統基本操作、大數據框架Hadoop、Spark以及數據倉庫Hive的使用等計算機相關知識,總體來說難道還是比較大。薪資待遇上特別優厚,基本在20k以上,薪資在30k-40k的比例也有近40%,對工作經驗要求還是比較高,大部分的企業要求工作經驗要達到3年以上。

學歷要求

工作月薪

工作經驗要求

全棧開發技能
關鍵詞解析:
- 學歷:本科
- 工作月薪:10k-30k
- 工作經驗:3-5年
- 技能:測試、運維、管理、開發、數據結構、算法、接口、虛擬化、前端
綜合:全棧開發這個崗位什麼都要懂些,什麼都要學些,在學歷要求上並不太高,本科學歷即可,在專業知識上就不用說了,各個方面都得懂,還得理解運用。薪資待遇上也還可以,基本在10k以上,薪資在30k-40k的比例也有近20%。對工作經驗要求還是比較高,大部分的企業要求工作經驗要達到3年以上。總體來說,就我個人而言會覺得全棧是個吃力多薪水少的崗位。

學歷要求

工作月薪

工作經驗要求

運維開發技能
關鍵詞解析:
- 學歷:本科
- 工作月薪:10k-30k
- 工作經驗:3-5年
- 技能:SVN、Git、Linux、框架、shell編程、mysql,redis,ansible、前端框架
綜合:運維開發這個崗位在學歷要求上不高,除開佔一大半的本科,就是專科了。工作經驗上還是有一些要求,大多數要求有3-5年工作經驗。從工資上看的話,不高也不低,20k以上也佔有62%左右。要學習的東西也比較多,前端、後端、數據庫、操作系統等等。

學歷要求

工作月薪

工作經驗要求

高級開發工程師技能
關鍵詞解析:
- 學歷:本科
- 工作月薪:20k左右
- 工作經驗:3-5年
- 技能:WEB後端、MySQL、MongoDB、Redis、Linux系統(CentOS)、CI/CD 工具、GitHub
綜合:高級開發工程師這個崗位在學歷要求上與運維開發差不多,薪資也相差不大,22%以上的企業開出了30k以上的薪資,65%左右企業給出20k以上的薪資。當然,對工作經驗上還是要求較高,有近一半的企業要求工作經驗要達到3年以上。

學歷要求

工作月薪

工作經驗要求

大數據技能
關鍵詞解析:
- 學歷:本科(碩士也佔比很大)
- 工作月薪:30k以上
- 工作經驗:3-5年
- 技能:前端開發、 MySQL、Mongo、Redis、Git 、Flask、Celery、Hadoop/HBase/Spark/Hive、Nginx
綜合:現在是大數據時代,大數據這個崗位也是相當火熱,在學歷要求上幾乎與運維開發一模一樣。當然,可能數據上出現了巧合,本科居多,工作經驗上1-5年佔據一大半,薪資上也基本上在20k以上,該崗位薪資在20k以上的企業佔了55%左右。

學歷要求

工作月薪

工作經驗要求

機器學習技能
關鍵詞解析:
- 學歷:本科(碩士也佔比很大)
- 工作月薪:30k以上
- 工作經驗:3-5年
- 技能:Machine Learning,Data Mining,Algorithm 研發,算法,Linux,決策樹,TF,Spark+MLlib,Cafe
綜合:機器學習這個崗位在學歷要求上比較嚴格,雖然看起來是本科居多,但對於剛畢業或畢業不久的同學,如果只是個本科,應聘還是很有難度的。當然機器學習崗位薪資特高,60%在30k以上,近90%在20k以上,97%在10k以上。除開對學歷要求比較高外,對工作經驗要求也比較高,有近一半的企業要求工作經驗要達到3年以上。

學歷要求

工作月薪

工作經驗要求

架構師技能
關鍵詞解析:
- 學歷:本科
- 工作月薪:30k以上
- 工作經驗:5-10年
- 技能:Flask,Django,MySQL,Redis,MongoDB,Hadoop,Hive,Spark,ElasticSearch,Pandas,Spark/MR,Kafka/rabitmq
綜合:架構師這個崗位單從學歷上看不出什麼來,但在薪資上幾乎與機器學習一樣,甚至比機器學習還要高,機器學習中月薪40k以上的佔23.56%,架構師中月薪40k以上的佔30.67%。在學歷要求上比機器學習要略低,本科居多,但在工作經驗上一半以上的企業要求工作經驗在5-10年。在必要技能上也要求特別嚴格,比之前說過的全棧開發師有過之而無不及。
看着這月薪,我是超級想去了,你呢?
從上文可以看出,Python相關的各個崗位薪資還是不錯的,基本上所有崗位在10k以上的佔90%,20k以上的也基本都能佔60%左右。而且學歷上普遍來看,本科學歷佔70%以上。唯一的是需要工作經驗,一般得有個3-5年工作經驗,也就是如果24歲本科畢業,27歲就有很大機會拿到月薪20k以上。有沒有很心動?
整個系列下來,詞雲分析雖不完全正確,但大家不難發現,有兩個詞在每個崗位要求的詞雲圖中都有出現,那就是——經驗和熟悉。的確,不論我們做什麼,都必須認認真真的去做、去學,在不斷的實踐中積累經驗。
到這裡,本系列就結束了,本系列一共爬取了拉鉤網10個不同Python相關崗位,每個崗位450條招聘信息,共計4500條。爬取拉鉤網其實是個挺簡單的事情,只要知道了怎麼去分析頁面加載即可,獲取到數據也不過就是直接返回的json數據,或者正則匹配。我覺得比較有趣也是比較難的是數據清理和可視化分析。後面我會繼續學習,也希望大家一起學習,多多交流。