從拉勾網數據看深圳數據分析師的職業前景-36大數據
作者: 真依然很拉風
通過對局部地區某一崗位的總體分析,找出該地區該職位的職業發展前景規律。本文基于拉勾上2016年12月到2017年1月深圳地區數據分析師招聘數據,為這一行業的朋友作為參考;雖然數據略為過時,但變化也不大,規律依然適用。
在深圳,
1、數據分析師主要還是開發類職業。開發類的職位,無論是市場需求還是薪資都是無可撼動的最高。
2、地區方面:如果你要在深圳找數據分析師的崗位,請去南山區,優先去科技園附近。
3、薪資方面,20K是業內中等水平;
4、學歷方面,除非你直接攻讀相關專業的博士,否則本科足矣;
5、技能方面:Hadoop和Spark這類大數據基礎框架是市場最為重視的,因此Java是最為需要的語言。Python是首選的語言。
6、公司選擇方面:數據表明大公司的需求和薪資都顯著性強于小公司。
第一部分:Python拉勾爬蟲
拉勾因其結構化的數據比較多因此過去常常被爬,所以在其多次改版之下變得難爬。不過只要清楚它的原理,依然比較好爬。其機制主要就是AJAX異步加載JSON數據,所以至少在搜索頁面里翻頁url不會變化,而且數據也不會出現在源代碼里。
數據解析
這是 深圳地區的數據分析師頁面 ,用Chrome檢查打開。在XHR中可以看到一個以postionAjax.json開頭的腳本,打開Preview看一下,可以看到:
可以發現這些數據與前端的數據一致,此時我們已經找到了數據入口,就可以開始爬了。
數據爬取
在Headers里可以查看請求方式:
Request Header:
Request URL:
https://www.lagou.com/jobs/positionAjax.json?city=%E6%B7%B1%E5%9C%B3&needAddtionalResult=false
Request Method:POST
Status Code:200 OK
Remote Address:106.75.72.62:443
從Request Header中可以看到,是用POST提交表單方式查詢的(所以如果你直接點開Request URL你會發現數據不對,因為沒有提交表單數據)。
那么我們就可以在Python中構造請求頭以及提交表單數據來訪問:
import
requests
import
time
from
sqlalchemy
import
create_engine
import
pandas
as
pd
from
random
import
choice
import
json
import
numpy
engine=create_engine(
#這里填你自己數據庫的參數#) # 連接數據庫
dl = pd.read_sql(
"proxys"
,engine)
def
get_proxy
(dl)
:
n = choice(range(
1
, len(dl.index)))
proxy = {
"http"
:
"http://%s:%s"
%(dl[
"ip"
][n],dl[
"port"
][n]),
"https"
:
"http://%s:%s"
% (dl[
"ip"
][n], dl[
"port"
][n])}
return
(proxy)
def
get_header
()
:
headers = {
"User-Agent"
:
""
Mozilla/
4.0
(compatible; MSIE
6.0
; Windows NT
5.1
; SV1; AcooBrowser; .NET CLR
1.1
.4322
; .NET CLR
2.0
.50727
)
""
,
"Accept"
:
"application/json, text/javascript, */*; q=0.01"
,
"Content-Type"
:
"application/x-www-form-urlencoded; charset=UTF-8"
,
"Referer"
:
"https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B8%88?px=default&city=%E6%B7%B1%E5%9C%B3&district=%E5%8D%97%E5%B1%B1%E5%8C%BA"
,
"X-Requested-With"
:
"XMLHttpRequest"
,
"Host"
:
"www.lagou.com"
,
"Connection"
:
"keep-alive"
,
"Cookie"
:
"user_trace_token=20160214102121-0be42521e365477ba08bd330fd2c9c72; LGUID=20160214102122-a3b749ae-d2c1-11e5-8a48-525400f775ce; tencentSig=9579373568; pgv_pvi=3712577536; index_location_city=%E5%85%A8%E5%9B%BD; SEARCH_ID=c684c55390a84fe5bd7b62bf1754b900; JSESSIONID=8C779B1311176D4D6B74AF3CE40CE5F2; TG-TRACK-CODE=index_hotjob; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1485318435,1485338972,1485393674,1485423558; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1485423598; _ga=GA1.2.1996921784.1455416480; LGRID=20170126174002-691cb0a5-e3ab-11e6-bdc0-525400f775ce"
,
"Origin"
:
"https://www.lagou.com"
,
"Upgrade-Insecure-Requests"
:
"1"
,
"X-Anit-Forge-Code"
:
"0"
,
"X-Anit-Forge-Token"
:
"None"
,
"Accept-Encoding"
:
"gzip, deflate, br"
,
"Accept-Language"
:
"zh-CN,zh;q=0.8"
}
return
(headers)
def
get_form
(i)
:
data={
"first"
:
"false"
,
"pn"
:i,
"kd"
:
"數據分析師"
}
return
(data)
districts = [
"南山區"
,
"福田區"
,
"寶安區"
,
"龍崗區"
,
"龍華新區"
,
"羅湖區"
,
"鹽田區"
,
"大鵬新區"
]
pagenos = [
22
,
10
,
1
,
4
,
1
,
2
,
1
,
1
]
url_lists = [
"https://www.lagou.com/jobs/positionAjax.json?px=default&city=深圳&district=%s&needAddtionalResult=false"
%area
for
area
in
districts]
s = requests.Session()
s.keep_alive =
False
s.adapters.DEFAULT_RETRIES =
10
def
get_jobinfo
(i,j)
:
# i表區號,j表頁數
if
i >=
8
or
j > pagenos[i]:
return
(
"索引超標!"
)
resp=s.post(url_lists[i], data=get_form(j), headers=get_header())
resp.encoding=
"utf-8"
max_num = len(json.loads(resp.text)[
"content"
][
"positionResult"
][
"result"
])
for
k
in
range(max_num):
try
:
json_data=json.loads(resp.text)[
"content"
][
"positionResult"
][
"result"
][k]
df = pd.DataFrame(dict(
approve=json_data[
"approve"
],
# businessZones=json_data["businessZones"],
companyId=json_data[
"companyId"
],
# companyLabelList=json_data["companyLabelList"],
companyShortName=json_data[
"companyShortName"
],
companySize=json_data[
"companySize"
],
createTime=json_data[
"createTime"
],
education=json_data[
"education"
],
financeStage=json_data[
"financeStage"
],
firstType=json_data[
"firstType"
],
industryField=json_data[
"industryField"
],
jobNature=json_data[
"jobNature"
],
positionAdvantage=json_data[
"positionAdvantage"
],
positionId=json_data[
"positionId"
],
positionName=json_data[
"positionName"
],
salary=json_data[
"salary"
],
secondType=json_data[
"secondType"
],
workYear=json_data[
"workYear"
],
scrapy_time=time.strftime(
'%Y-%m-%d %H:%M:%S'
, time.localtime(time.time()))),index=[
0
])
df.to_sql(con = engine, name =
"job_info"
, if_exists =
'append'
, flavor =
"mysql"
,index=
False
)
except
:
print(
"第%d區,第%d頁,第%d個出錯了!"
%(i,j,k))
以上這個函數就可以通過提交區和頁數,返回當前頁的職位數。
其實AJAX返回JSON數據的方式也有好處,數據都是規整的,不必花太多時間精力在數據清洗上。
至于職位詳情的內容是寫在源代碼里的,這些用常規爬蟲方法即可。
不過注意要加延時,拉勾的反爬蟲措施還是比較嚴的,不加延時爬一小會兒就會被封IP。
第二部分:數據分析報告
區域分析
各區職位數
從拉勾爬取的數據拉勾,在深圳,對數據分析師需求量最大的地區為南山區,其次為福田區。這個當地的互聯網企業分布有很大的關系,眾所周知,深圳的互聯網企業集中在南山區和福田區;
空間分布
各區域板塊職位數
頻數分布
第一類別頻數
第二類別頻數
不同公司階段招聘數量
薪資分布
?全部職位平均薪資總體分布
不同類別職位薪資分布
不同階段公司平均薪資
不同學歷對薪資的影響
公司規模對薪資的影響
技術要求
數據分析師的技術要求
公司排名
高薪崗位top20
結論
在現今的市場認知中, 數據分析師主要還是開發類職業。開發類的職位,無論是市場需求還是薪資都是無可撼動的最高 。因此所以如果你不會編程,或者不想作一個程序員(比如我),那么應該重新思考一下職業規劃。
如果 你要在深圳找數據分析師的崗位,請去南山區,優先去科技園附近 。
如果你去找工作,HR問你期望薪資,你就說20K,因為這是業內的中等水平(這是考慮了最高薪資,不過考慮到大部分的最高薪資只是一個幌子,因此20K當然是虛高:))。30K基本就到了數據分析師的天花板,而這個天花板一般要5年以上的時間達到。
當然要找一個20K的工作也不是那么輕松。你首先要自己具備實力。對于學歷,除非你直接攻讀相關專業的博士,否則本科足矣,讀個碩士作用并不大(尤其是國內的碩士),三年時間轉化成工作經驗價值更大。 至于技術方面,Hadoop和Spark這類大數據基礎框架是市場最為重視的,因此Java是最為需要的語言 (這主要還是因為大部分的公司不知道數據工程師和數據分析師的區別,或者大部分的公司仍處于基礎建設階段,離數據挖掘、分析和應用還有不少距離)。 對于懂行的數據分析師來說,Python是首選的語言,畢竟全能;當然R也是越來越流行和被重視;SAS也不錯,金融行業很需要。 無論是工程師還是分析師, 數據庫和SQL始終是重要的基礎技能。
當你足夠牛的時候,就是你來挑選市場了。去大公司還是小公司?去大公司。數據表明大公司的需求和薪資都顯著性強于小公司。在移動互聯網收尾,人工智能興起的大數據時代,沒有數據、沒有資金、沒有技術的小公司實在難有作為。
當然拉勾的數據既不全面,也不一定都靠譜(事實上許多HR的招聘需求都是抄來抄去)。因此,以上所有結論一定有某種程度的偏差,僅供參考。
轉載請注明來自36大數據(36dsj.com): 36大數據 ? 從拉勾網數據看深圳數據分析師的職業前景