99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀數(shù)據(jù)分析行業(yè)薪資的秘密,你想知道的都在這里(一)
數(shù)據(jù)分析行業(yè)薪資的秘密,你想知道的都在這里(一)
2018-01-03
收藏

數(shù)據(jù)分析行業(yè)薪資的秘密,你想知道的都在這里

第一部分,數(shù)據(jù)分析職位信息抓取

數(shù)據(jù)分析師的收入怎么樣?哪些因素對(duì)于數(shù)據(jù)分析的薪資影響最大?哪些行業(yè)對(duì)數(shù)據(jù)分析人才的需求量最高?我想跳槽,應(yīng)該選擇大公司大平臺(tái)還是初創(chuàng)的小公司?按我目前的教育程度,工作經(jīng)驗(yàn),和掌握的工具和技能,能獲得什么樣水平的薪資呢?

我們使用python抓取了2017年6月26日拉鉤網(wǎng)站內(nèi)搜索“數(shù)據(jù)分析”關(guān)鍵詞下的450條職位信息。通過(guò)對(duì)這些職位信息的分析和建模來(lái)給你答案。

本系列文章共分為五個(gè)部分,分別是數(shù)據(jù)分析職位信息抓取,數(shù)據(jù)清洗及預(yù)處理,數(shù)據(jù)分析職位需求分析,數(shù)據(jù)分析職位薪影響因素分析,以及數(shù)據(jù)分析職位薪資建模及預(yù)測(cè)。這是第一篇:數(shù)據(jù)分析職位信息抓取。

數(shù)據(jù)抓取前的準(zhǔn)備工作

首先我們需要獲取職位信息的數(shù)據(jù),方法是使用python進(jìn)行抓取。整個(gè)抓取過(guò)程分為兩部分,第一部分是抓取拉鉤列表頁(yè)中包含的職位信息,例如職位名稱,薪資范圍,學(xué)歷要求,工作地點(diǎn)等。第二部分是抓取每個(gè)職位詳情頁(yè)中的任職資格和職位描述信息。然后我們將使用結(jié)巴分詞和nltk對(duì)職位描述中的文字信息進(jìn)行處理和信息提取。下面我們開(kāi)始介紹每一步的操作過(guò)程。

首先,導(dǎo)入抓取和數(shù)據(jù)處理所需的庫(kù)文件,這里不再贅述。


  1. #導(dǎo)入抓取所需庫(kù)文件 
  2. import requests 
  3. import numpy as np 
  4. import pandas as pd 
  5. import json 
  6. import time 
  7. from bs4 import BeautifulSoup  


然后設(shè)置頭部信息和Cookie信息。


  1. #設(shè)置頭部信息 
  2. headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', 
  3.     'Accept':'text/html;q=0.9,*/*;q=0.8', 
  4.     'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 
  5.     'Connection':'close', 
  6.     'Referer':'https://www.baidu.com/' 
  7.     } 
  8.   
  9. #設(shè)置Cookie信息 
  10. cookie={'TrackID':'1_VWwvLYiy1FUr7wSr6HHmHhadG8d1-Qv-TVaw8JwcFG4EksqyLyx1SO7O06_Y_XUCyQMksp3RVb2ezA', 
  11.     '__jda':'122270672.1507607632.1423495705.1479785414.1479794553.92', 
  12.     '__jdb':'122270672.1.1507607632|92.1479794553', 
  13.     '__jdc':'122270672', 
  14.     '__jdu':'1507607632', 
  15.     '__jdv':'122270672|direct|-|none|-|1478747025001', 
  16.     'areaId':'1', 
  17.     'cn':'0', 
  18.     'ipLoc-djd':'1-72-2799-0', 
  19.     'ipLocation':'%u5317%u4EAC', 
  20.     'mx':'0_X', 
  21.     'rkv':'V0800', 
  22.     'user-key':'216123d5-4ed3-47b0-9289-12345', 
  23.     'xtest':'4657.553.d9798cdf31c02d86b8b81cc119d94836.b7a782741f667201b54880c925faec4b'}  


抓取職位列表信息

設(shè)置要抓取的頁(yè)面URL,拉鉤的職位信息列表是JS動(dòng)態(tài)加載的,不在所顯示的頁(yè)面URL中。所以直接抓取列表頁(yè)并不能獲得職位信息。這里我們使用Chrome瀏覽器里的開(kāi)發(fā)者工具進(jìn)行查找。具體方法是在商品詳情頁(yè)點(diǎn)擊鼠標(biāo)右鍵,選擇檢查,在彈出的開(kāi)發(fā)者工具界面中選擇Network,設(shè)置為禁用緩存(Disable cache)和只查看XHR類型的請(qǐng)求。然后刷新頁(yè)面。一共有4個(gè)請(qǐng)求,選擇包含positionAjax關(guān)鍵字的鏈接就是我們要抓取的URL地址。具體過(guò)程如下面截圖所示。

這里有一個(gè)問(wèn)題,要抓取的URL地址中只有第一頁(yè)的15個(gè)職位信息,并且URL參數(shù)中也沒(méi)有包含頁(yè)碼。而我們要抓取的是全部30多頁(yè)的職位列表。如何翻頁(yè)呢?后面我們將解決這個(gè)問(wèn)題。


  1. #設(shè)置抓取頁(yè)面的URL 
  2.  
  3. url='https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'  


職位列表中包含了多個(gè)職位相關(guān)的信息,我們先建立一些空l(shuí)ist用于存儲(chǔ)這些信息。


  1. #創(chuàng)建list用于存儲(chǔ)數(shù)據(jù) 
  2. positionName=[] 
  3. workYear=[] 
  4. education=[] 
  5. district=[] 
  6. jobNature=[] 
  7. salary=[] 
  8. city=[] 
  9. businessZones=[] 
  10. companyLabelList=[] 
  11. companySize=[] 
  12. financeStage=[] 
  13. industryField=[] 
  14. secondType=[] 
  15. positionId=[]  


開(kāi)始抓取列表頁(yè)中的職位信息,建立一個(gè)30頁(yè)的循環(huán)然后將頁(yè)碼作為請(qǐng)求參數(shù)與頭部信息和Cookie一起傳給服務(wù)器。獲取返回的信息后對(duì)頁(yè)面內(nèi)容進(jìn)行解碼,然后從json數(shù)據(jù)中提取所需的職位信息,并保存在上一步創(chuàng)建的list中。用于后續(xù)的組表。這里的最后一個(gè)信息是職位id,也就是拉鉤職位詳情頁(yè)URL中的一部分。通過(guò)這個(gè)id我們可以生成與列表頁(yè)職位相對(duì)應(yīng)的詳情頁(yè)URL。并從中提取任職資格和職位描述信息。


  1. #循環(huán)抓取列表頁(yè)信息 
  2. for x in range(1,31): 
  3.         #設(shè)置查詢關(guān)鍵詞及當(dāng)前頁(yè)碼 
  4.         para = {'first': 'true','pn': x, 'kd': "數(shù)據(jù)分析"} 
  5.         #抓取列表頁(yè)信息 
  6.         r=requests.get(url=url,headers=headers,cookies=cookie,params=para) 
  7.         #存儲(chǔ)bytes型頁(yè)面數(shù)據(jù) 
  8.         html=r.content 
  9.         #對(duì)頁(yè)面內(nèi)容進(jìn)行解碼 
  10.         html = html.decode() 
  11.         #將json串轉(zhuǎn)化為dict 
  12.         html_json=json.loads(html) 
  13.         #逐層獲取職位列表信息 
  14.         content=html_json.get('content') 
  15.         positionResult=content.get('positionResult') 
  16.         result=positionResult.get('result') 
  17.         #循環(huán)提取職位列表中的關(guān)鍵信息 
  18.         for i in result: 
  19.             #獲取職位名稱,工作年限,教育程度,城市及薪資范圍等信息。 
  20.             positionName.append(i.get('positionName')) 
  21.             workYear.append(i.get('workYear')) 
  22.             education.append(i.get('education')) 
  23.             district.append(i.get('district')) 
  24.             jobNature.append(i.get('jobNature')) 
  25.             salary.append(i.get('salary')) 
  26.             city.append(i.get('city')) 
  27.             businessZones.append(i.get('businessZones')) 
  28.             companyLabelList.append(i.get('companyLabelList')) 
  29.             companySize.append(i.get('companySize')) 
  30.             financeStage.append(i.get('financeStage')) 
  31.             industryField.append(i.get('industryField')) 
  32.             secondType.append(i.get('secondType')) 
  33.             #獲取職位的Id編碼。 
  34.             positionId.append(i.get('positionId'))  


設(shè)置一個(gè)當(dāng)前的日期字段,用于標(biāo)記數(shù)據(jù)獲取的時(shí)間。


  1. #設(shè)置日期字段 
  2. date=time.strftime('%Y-%m-%d',time.localtime(time.time()))  


將前面抓取到的職位信息,以及當(dāng)前的日期一起組成Dataframe。便于后續(xù)的處理和分析。


  1. #設(shè)置DataFrame表格順序 
  2. columns = ['date','positionName',  
  3.   
  4. 'workYear','education','jobNature','businessZones','salary','city','companyLabelList','companySize','financeStage','industryField','d 
  5.   
  6. istrict','secondType','positionId'] 
  7. #將獲取到的字段信息合并為DataFrame 
  8. table=pd.DataFrame({'date':date, 
  9.                     'positionName':positionName, 
  10.                     'workYear':workYear, 
  11.                     'education':education, 
  12.                     'jobNature':jobNature, 
  13.                     'businessZones':businessZones, 
  14.                     'salary':salary, 
  15.                     'city':city, 
  16.                     'companyLabelList':companyLabelList, 
  17.                     'companySize':companySize, 
  18.                     'financeStage':financeStage, 
  19.                     'industryField':industryField, 
  20.                     'district':district, 
  21.                     'secondType':secondType, 
  22.                     'positionId':positionId}, 
  23.                     columns=columns)  


查看生成的數(shù)據(jù)表,其中包含了我們?cè)诹斜眄?yè)中抓取的信息,以及下一步要使用的職位id信息。


  1. #查看數(shù)據(jù)表 
  2.  
  3. table 


這里你可以保存一個(gè)版本,也可以忽略這一步,繼續(xù)后面的職位詳情頁(yè)信息抓取。


  1. #存儲(chǔ)數(shù)據(jù)表 
  2.  
  3. table.to_csv('lagou_' + date + '.csv')  


抓取職位詳情信息(職位描述)

抓取職位詳情頁(yè)的信息,首先需要通過(guò)拼接生成職位詳情頁(yè)的URL。我們預(yù)先寫好URL的開(kāi)始和結(jié)束部分,這兩部分是固定的,抓取過(guò)程中不會(huì)發(fā)生變化 ,中間動(dòng)態(tài)填充職位的id。


  1. #設(shè)置詳情頁(yè)的URL固定部分 
  2.  
  3. url1='https://www.lagou.com/jobs/' 
  4.  
  5. url2='.html'  


創(chuàng)建一個(gè)list用于存儲(chǔ)抓取到的職位描述信息。


  1. #創(chuàng)建job_detail用于存儲(chǔ)職位描述 
  2.  
  3. job_detail=[]  


從前面抓取的職位id(positionId)字段循環(huán)提取每一個(gè)id信息,與URL的另外兩部分組成要抓取的職位詳情頁(yè)URL。并從中提取職位描述信息。這里的職位信息不是js動(dòng)態(tài)加載的,因此直接抓取頁(yè)面信息保存在之前創(chuàng)建的list中就可以了。


  1. #循環(huán)抓取詳情頁(yè)的職位描述 
  2. for d in positionId: 
  3.     #更改positionId格式 
  4.     d=str(d) 
  5.     #拼接詳情頁(yè)URL 
  6.     url3=(url1 + d + url2) 
  7.     #抓取詳情頁(yè)信息 
  8.     r=requests.get(url=url3,headers=headers,cookies=cookie) 
  9.     #存儲(chǔ)bytes型頁(yè)面數(shù)據(jù)yu 
  10.     detail=r.content 
  11.     #創(chuàng)建 beautifulsoup 對(duì)象 
  12.     lagou_detail=BeautifulSoup(detail) 
  13.     #提取職位描述信息 
  14.     gwzz=lagou_detail.find_all('dd',attrs={'class':'job_bt'})    
  15.     for j in gwzz: 
  16.         gwzz_text=j.get_text() 
  17.         job_detail.append(gwzz_text)  


查看并檢查一下提取到的職位描述信息。然后將職位描述信息拼接到之前創(chuàng)建的Dataframe中。


  1. #查看職位描述信息 
  2.  
  3. job_detail 


完整的職位抓取代碼

以下是完整的抓取代碼,步驟和前面介紹的略有不同,最后生成一個(gè)包含所有職位信息和描述的完整數(shù)據(jù)表。用于下一步的數(shù)據(jù)清洗,預(yù)處理,分析和建模的工作。


  1. def lagou(p): 
  2.     import requests 
  3.     import numpy as np 
  4.     import pandas as pd 
  5.     import json 
  6.     import time 
  7.     from bs4 import BeautifulSoup 
  8.     import jieba as jb 
  9.     import jieba.analyse 
  10.     headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', 
  11.     'Accept':'text/html;q=0.9,*/*;q=0.8', 
  12.     'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 
  13.     'Connection':'close', 
  14.     'Referer':'https://www.jd.com/' 
  15.     } 
  16.     cookie={'TrackID':'1_VWwvLYiy1FUr7wSr6HHmHhadG8d1-Qv-TVaw8JwcFG4EksqyLyx1SO7O06_Y_XUCyQMksp3RVb2ezA', 
  17.     '__jda':'122270672.1507607632.1423495705.1479785414.1479794553.92', 
  18.     '__jdb':'122270672.1.1507607632|92.1479794553', 
  19.     '__jdc':'122270672', 
  20.     '__jdu':'1507607632', 
  21.     '__jdv':'122270672|direct|-|none|-|1478747025001', 
  22.     'areaId':'1', 
  23.     'cn':'0', 
  24.     'ipLoc-djd':'1-72-2799-0', 
  25.     'ipLocation':'%u5317%u4EAC', 
  26.     'mx':'0_X', 
  27.     'rkv':'V0800', 
  28.     'user-key':'216123d5-4ed3-47b0-9289-12345', 
  29.     'xtest':'4657.553.d9798cdf31c02d86b8b81cc119d94836.b7a782741f667201b54880c925faec4b'} 
  30.     url='https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false' 
  31.     positionName=[] 
  32.     workYear=[] 
  33.     education=[] 
  34.     district=[] 
  35.     jobNature=[] 
  36.     salary=[] 
  37.     city=[] 
  38.     businessZones=[] 
  39.     companyLabelList=[] 
  40.     companySize=[] 
  41.     financeStage=[] 
  42.     industryField=[] 
  43.     secondType=[] 
  44.     positionId=[] 
  45.     for x in range(1,31): 
  46.         para = {'first': 'true','pn': x, 'kd': p} 
  47.         r=requests.get(url=url,headers=headers,cookies=cookie,params=para) 
  48.         html=r.content 
  49.         html = html.decode() 
  50.         html_json=json.loads(html) 
  51.         content=html_json.get('content') 
  52.         positionResult=content.get('positionResult') 
  53.         result=positionResult.get('result') 
  54.         for i in result: 
  55.             positionName.append(i.get('positionName')) 
  56.             workYear.append(i.get('workYear')) 
  57.             education.append(i.get('education')) 
  58.             district.append(i.get('district')) 
  59.             jobNature.append(i.get('jobNature')) 
  60.             salary.append(i.get('salary')) 
  61.             city.append(i.get('city')) 
  62.             businessZones.append(i.get('businessZones')) 
  63.             companyLabelList.append(i.get('companyLabelList')) 
  64.             companySize.append(i.get('companySize')) 
  65.             financeStage.append(i.get('financeStage')) 
  66.             industryField.append(i.get('industryField')) 
  67.             secondType.append(i.get('secondType')) 
  68.             positionId.append(i.get('positionId')) 
  69.     url1='https://www.lagou.com/jobs/' 
  70.     url2='.html' 
  71.     job_detail=[] 
  72.     for d in positionId: 
  73.         d=str(d) 
  74.         url3=(url1 + d + url2) 
  75.         r=requests.get(url=url3,headers=headers,cookies=cookie) 
  76.         detail=r.content 
  77.         lagou_detail=BeautifulSoup(detail) 
  78.         gwzz=lagou_detail.find_all('dd',attrs={'class':'job_bt'})    
  79.         for j in gwzz: 
  80.             gwzz_text=j.get_text() 
  81.             job_detail.append(gwzz_text) 
  82.     date=time.strftime('%Y-%m-%d',time.localtime(time.time())) 
  83.     columns = ['date','positionName', 'workYear','education','jobNature','businessZones','salary','city','companyLabelList','companySize','financeStage','industryField','district','secondType','positionId','job_detail'] 
  84.     table=pd.DataFrame({'date':date, 
  85.                         'positionName':positionName, 
  86.                         'workYear':workYear, 
  87.                         'education':education, 
  88.                         'jobNature':jobNature, 
  89.                         'businessZones':businessZones, 
  90.                         'salary':salary, 
  91.                         'city':city, 
  92.                         'companyLabelList':companyLabelList, 
  93.                         'companySize':companySize, 
  94.                         'financeStage':financeStage, 
  95.                         'industryField':industryField, 
  96.                         'district':district, 
  97.                         'secondType':secondType, 
  98.                         'positionId':positionId, 
  99.                         'job_detail':job_detail}, 
  100.                         columns=columns) 
  101.     table.to_csv('lagou_' + p + date + '.csv') 
  102.   
  103. lagou("數(shù)據(jù)分析") 


到這里我們已經(jīng)獲取了拉鉤網(wǎng)的450個(gè)數(shù)據(jù)分析職位信息及職位描述。我們將在后面的文章中對(duì)這450個(gè)職位信息進(jìn)行分析和建模。


數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }