我用Python又爬蟲(chóng)了拉鉤招聘,給你們看看2019市場(chǎng)行情
本文轉(zhuǎn)載自公號(hào)Python攻城獅,作者:Python攻城獅
數(shù)據(jù)采集
事情的起源是這樣的,某個(gè)風(fēng)和日麗的下午… 習(xí)慣性的打開(kāi)知乎準(zhǔn)備劃下水,看到一個(gè)問(wèn)題剛好邀請(qǐng)回答
于是就萌生了采集下某招聘網(wǎng)站Python崗位招聘的信息,看一下目前的薪水和崗位分布,說(shuō)干就干。
先說(shuō)下數(shù)據(jù)采集過(guò)程中遇到的問(wèn)題,首先請(qǐng)求頭是一定要偽裝的,否則第一步就會(huì)給你彈出你的請(qǐng)求太頻繁,請(qǐng)稍后再試,其次網(wǎng)站具有多重反爬策略,解決方案是每次先獲取session然后更新我們的session進(jìn)行抓取,最后拿到了想要的數(shù)據(jù)。
Chrome瀏覽器右鍵檢查查看network,找到鏈接https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false
?
可以看到返回的數(shù)據(jù)正是頁(yè)面的Python招聘詳情,于是我直接打開(kāi)發(fā)現(xiàn)直接提示{"status":false,"msg":"您操作太頻繁,請(qǐng)稍后再訪問(wèn)","clientIp":"124.77.161.207","state":2402}
,機(jī)智的我察覺(jué)到事情并沒(méi)有那么簡(jiǎn)單
真正的較量才剛剛開(kāi)始,我們先來(lái)分析下請(qǐng)求的報(bào)文,
可以看到請(qǐng)求是以post
的方式傳遞的,同時(shí)傳遞了參數(shù)
datas?=?{????????????'first':?'false',????????????'pn':?x,????????????'kd':?'Python',????????}
同時(shí)不難發(fā)現(xiàn)每次點(diǎn)擊下一頁(yè)都會(huì)同時(shí)發(fā)送一條get
請(qǐng)求
經(jīng)過(guò)探索,發(fā)現(xiàn)這個(gè)get
請(qǐng)求和我們post
請(qǐng)求是一致的,那么問(wèn)題就簡(jiǎn)單許多,整理一下思路
關(guān)鍵詞:Python
?
搜索范圍:全國(guó)
數(shù)據(jù)時(shí)效:2019.05.05
#!/usr/bin/env?Python3.4#?encoding:?utf-8"""Created?on?19-5-05@title:?''@author:?Xusl"""import?jsonimport?requestsimport?xlwtimport?time#?獲取存儲(chǔ)職位信息的json對(duì)象,遍歷獲得公司名、福利待遇、工作地點(diǎn)、學(xué)歷要求、工作類型、發(fā)布時(shí)間、職位名稱、薪資、工作年限def?get_json(url,?datas):????my_headers?=?{????????"User-Agent":?"Mozilla/5.0?(Macintosh;?Intel?Mac?OS?X?10_13_6)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/72.0.3626.119?Safari/537.36",????????"Referer":?"https://www.lagou.com/jobs/list_Python?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=",????????"Content-Type":?"application/x-www-form-urlencoded;charset?=?UTF-8"????}????time.sleep(5)????ses?=?requests.session()????#?獲取session????ses.headers.update(my_headers)??#?更新????ses.get("https://www.lagou.com/jobs/list_Python?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=")????content?=?ses.post(url=url,?data=datas)????result?=?content.json()????info?=?result['content']['positionResult']['result']????info_list?=?[]????for?job?in?info:????????information?=?[]????????information.append(job['positionId'])??#?崗位對(duì)應(yīng)ID????????information.append(job['city'])??#?崗位對(duì)應(yīng)城市????????information.append(job['companyFullName'])??#?公司全名????????information.append(job['companyLabelList'])??#?福利待遇????????information.append(job['district'])??#?工作地點(diǎn)????????information.append(job['education'])??#?學(xué)歷要求????????information.append(job['firstType'])??#?工作類型????????information.append(job['formatCreateTime'])??#?發(fā)布時(shí)間????????information.append(job['positionName'])??#?職位名稱????????information.append(job['salary'])??#?薪資????????information.append(job['workYear'])??#?工作年限????????info_list.append(information)????????#?將列表對(duì)象進(jìn)行json格式的編碼轉(zhuǎn)換,其中indent參數(shù)設(shè)置縮進(jìn)值為2????????#?print(json.dumps(info_list,?ensure_ascii=False,?indent=2))????#?print(info_list)????return?info_listdef?main():????page?=?int(input('請(qǐng)輸入你要抓取的頁(yè)碼總數(shù):'))????#?kd?=?input('請(qǐng)輸入你要抓取的職位關(guān)鍵字:')????#?city?=?input('請(qǐng)輸入你要抓取的城市:')????info_result?=?[]????title?=?['崗位id',?'城市',?'公司全名',?'福利待遇',?'工作地點(diǎn)',?'學(xué)歷要求',?'工作類型',?'發(fā)布時(shí)間',?'職位名稱',?'薪資',?'工作年限']????info_result.append(title)????for?x?in?range(1,?page+1):????????url?=?'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'????????datas?=?{????????????'first':?'false',????????????'pn':?x,????????????'kd':?'Python',????????}????????try:????????????info?=?get_json(url,?datas)????????????info_result?=?info_result?+?info????????????print("第%s頁(yè)正常采集"?%?x)????????except?Exception?as?msg:????????????print("第%s頁(yè)出現(xiàn)問(wèn)題"?%?x)????????????????#?創(chuàng)建workbook,即excel????????workbook?=?xlwt.Workbook(encoding='utf-8')????????#?創(chuàng)建表,第二參數(shù)用于確認(rèn)同一個(gè)cell單元是否可以重設(shè)值????????worksheet?=?workbook.add_sheet('lagouzp',?cell_overwrite_ok=True)????????for?i,?row?in?enumerate(info_result):????????????#?print(row)????????????for?j,?col?in?enumerate(row):????????????????#?print(col)????????????????worksheet.write(i,?j,?col)????????workbook.save('lagouzp.xls')if?__name__?==?'__main__':????main()
當(dāng)然存儲(chǔ)于excel當(dāng)然是不夠的,之前一直用matplotlib
做數(shù)據(jù)可視化,這次換個(gè)新東西pyecharts
。
了解pyecharts
pyecharts是一款將Python與echarts結(jié)合的強(qiáng)大的數(shù)據(jù)可視化工具,包含多種圖表
- Bar(柱狀圖/條形圖)
- Bar3D(3D 柱狀圖)
- Boxplot(箱形圖)
- EffectScatter(帶有漣漪特效動(dòng)畫(huà)的散點(diǎn)圖)
- Funnel(漏斗圖)
- Gauge(儀表盤(pán))
- Geo(地理坐標(biāo)系)
- Graph(關(guān)系圖)
- HeatMap(熱力圖)
- Kline(K線圖)
- Line(折線/面積圖)
- Line3D(3D 折線圖)
- Liquid(水球圖)
- Map(地圖)
- Parallel(平行坐標(biāo)系)
- Pie(餅圖)
- Polar(極坐標(biāo)系)
- Radar(雷達(dá)圖)
- Sankey(桑基圖)
- Scatter(散點(diǎn)圖)
- Scatter3D(3D 散點(diǎn)圖)
- ThemeRiver(主題河流圖)
- WordCloud(詞云圖)
用戶自定義
- Grid 類:并行顯示多張圖
- Overlap 類:結(jié)合不同類型圖表疊加畫(huà)在同張圖上
- Page 類:同一網(wǎng)頁(yè)按順序展示多圖
- Timeline 類:提供時(shí)間線輪播多張圖
另外需要注意的是從版本0.3.2 開(kāi)始,為了縮減項(xiàng)目本身的體積以及維持 pyecharts 項(xiàng)目的輕量化運(yùn)行,pyecharts 將不再自帶地圖 js 文件。如用戶需要用到地圖圖表(Geo、Map),可自行安裝對(duì)應(yīng)的地圖文件包。
- 全球國(guó)家地圖: echarts-countries-pypkg (1.9MB): 世界地圖和 213 個(gè)國(guó)家,包括中國(guó)地圖
- 中國(guó)省級(jí)地圖: echarts-china-provinces-pypkg (730KB):23 個(gè)省,5 個(gè)自治區(qū)
- 中國(guó)市級(jí)地圖: echarts-china-cities-pypkg (3.8MB):370 個(gè)中國(guó)城市
也可以使用命令進(jìn)行安裝
pip?install?echarts-countries-pypkgpip?install?echarts-china-provinces-pypkgpip?install?echarts-china-cities-pypkg
數(shù)據(jù)可視化(代碼+展示)
- 各城市招聘數(shù)量
from?pyecharts?import?Barcity_nms_top10?=?['北京',?'上海',?'深圳',?'成都',?'杭州',?'廣州',?'武漢',?'南京',?'蘇州',?'鄭州',?'天津',?'西安',?'東莞',?'珠海',?'合肥',?'廈門(mén)',?'寧波',??????????????????'南寧',?'重慶',?'佛山',?'大連',?'哈爾濱',?'長(zhǎng)沙',?'福州',?'中山']city_nums_top10?=?[149,?95,?77,?22,?17,?17,?16,?13,?7,?5,?4,?4,?3,?2,?2,?2,?1,?1,?1,?1,?1,?1,?1,?1,?1]bar?=?Bar("Python崗位",?"各城市數(shù)量")bar.add("數(shù)量",?city_nms,?city_nums,?is_more_utils=True)#?bar.print_echarts_options()?#?該行只為了打印配置項(xiàng),方便調(diào)試時(shí)使用bar.render('Python崗位各城市數(shù)量.html')??#?生成本地?HTML?文件
- 地圖分布展示(這個(gè)場(chǎng)景意義不大,不過(guò)多分析)
from?pyecharts?import?Geocity_datas?=?[('北京',?149),?('上海',?95),?('深圳',?77),?('成都',?22),?('杭州',?17),?('廣州',?17),?('武漢',?16),?('南京',?13),?('蘇州',?7),?????('鄭州',?5),?('天津',?4),?('西安',?4),?('東莞',?3),?('珠海',?2),?('合肥',?2),?('廈門(mén)',?2),?('寧波',?1),?('南寧',?1),?('重慶',?1),?????('佛山',?1),?('大連',?1),?('哈爾濱',?1),?('長(zhǎng)沙',?1),?('福州',?1),?('中山',?1)]geo?=?Geo("Python崗位城市分布地圖",?"數(shù)據(jù)來(lái)源拉勾",?title_color="#fff",??????????????????title_pos="center",?width=1200,??????????????????height=600,?background_color='#404a59')attr,?value?=?geo.cast(city_datas)geo.add("",?attr,?value,?visual_range=[0,?200],?visual_text_color="#fff",????????????????symbol_size=15,?is_visualmap=True)geo.render("Python崗位城市分布地圖_scatter.html")geo?=?Geo("Python崗位城市分布地圖",?"數(shù)據(jù)來(lái)源拉勾",?title_color="#fff",??????????????????title_pos="center",?width=1200,??????????????????height=600,?background_color='#404a59')????????attr,?value?=?geo.cast(city_datas)????????geo.add("",?attr,?value,?type="heatmap",?visual_range=[0,?10],?visual_text_color="#fff",????????????????symbol_size=15,?is_visualmap=True)????????geo.render("Python崗位城市分布地圖_heatmap.html")
- 各個(gè)城市招聘情況
from?pyecharts?import?Piecity_nms_top10?=?['北京',?'上海',?'深圳',?'成都',?'廣州',?'杭州',?'武漢',?'南京',?'蘇州',?'鄭州']city_nums_top10?=?[149,?95,?77,?22,?17,?17,?16,?13,?7,?5]pie?=?Pie()pie.add("",?city_nms_top10,?city_nums_top10,?is_label_show=True)#?pie.show_config()pie.render('Python崗位各城市分布餅圖.html')
北上深的崗位明顯碾壓其它城市,這也反映出為什么越來(lái)越多的it從業(yè)人員畢業(yè)以后相繼奔赴一線城市,除了一線城市的薪資高于二三線這個(gè)因素外,還有一個(gè)最重要的原因供需關(guān)系,因?yàn)橐痪€崗位多,可選擇性也就比較高,反觀二三線的局面,很有可能你跳個(gè)幾次槽,發(fā)現(xiàn)同行業(yè)能呆的公司都待過(guò)了…
- 薪資范圍
由此可見(jiàn),Python的崗位薪資多數(shù)在10k~20k,想從事Python行業(yè)的可以把工作年限和薪資結(jié)合起來(lái)參考一下。
- 學(xué)歷要求 + 工作年限
從工作年限來(lái)看,1-3年或者3-5年工作經(jīng)驗(yàn)的招聘比較多,而應(yīng)屆生和一年以下的寥寥無(wú)幾,對(duì)實(shí)習(xí)生實(shí)在不太友好,學(xué)歷也普遍要求本科,多數(shù)公司都很重視入職人員學(xué)歷這點(diǎn)毋容置疑,雖然學(xué)歷不代表一切,但是對(duì)于一個(gè)企業(yè)來(lái)說(shuō),想要短時(shí)間內(nèi)判斷一個(gè)人的能力,最快速有效的方法無(wú)疑是從學(xué)歷入手。學(xué)歷第一關(guān),面試第二關(guān)。
但是,這不代表學(xué)歷不高的人就沒(méi)有好的出路,現(xiàn)在的大學(xué)生越來(lái)越多,找工作也越來(lái)越難,競(jìng)爭(zhēng)越來(lái)越激烈,即使具備高學(xué)歷,也不能保證你一定可以找到滿意的工作,天道酬勤,特別是it這個(gè)行業(yè),知識(shí)的迭代,比其他行業(yè)來(lái)的更頻密。不斷學(xué)習(xí),拓展自己學(xué)習(xí)的廣度和深度,才是最正確的決定。
就業(yè)寒冬來(lái)臨,我們需要的是理性客觀的看待,而不是盲目地悲觀或樂(lè)觀。從以上數(shù)據(jù)分析,如果愛(ài)好Python,仍舊可以入坑,不過(guò)要注意一個(gè)標(biāo)簽有工作經(jīng)驗(yàn),就算沒(méi)有工作經(jīng)驗(yàn),自己在學(xué)習(xí)Python的過(guò)程中一定要嘗試獨(dú)立去做一個(gè)完整的項(xiàng)目,爬蟲(chóng)也好,數(shù)據(jù)分析也好,亦或者是開(kāi)發(fā),都要嘗試獨(dú)立去做一套系統(tǒng),在這個(gè)過(guò)程中培養(yǎng)自己思考和解決問(wèn)題的能力。持續(xù)不斷的學(xué)習(xí),才是對(duì)自己未來(lái)最好的投資,也是度過(guò)寒冬最正確的姿勢(shì)。
聲明:文章來(lái)源于網(wǎng)絡(luò),侵刪!