歡迎光臨
每天分享高質量文章

用Python爬蟲拉勾招聘,來看看2019市場行情

來自公眾號:Python攻城獅

資料採集

事情的起源是這樣的,某個風和日麗的下午… 習慣性的開啟知乎準備劃下水,看到一個問題剛好邀請回答

於是就萌生了採集下某招聘網站Python崗位招聘的資訊,看一下目前的薪水和崗位分佈,說乾就乾。

先說下資料採集過程中遇到的問題,首先請求頭是一定要偽裝的,否則第一步就會給你彈出你的請求太頻繁,請稍後再試,其次網站具有多重反爬策略,解決方案是每次先獲取session然後更新我們的session進行抓取,最後拿到了想要的資料。

Chrome瀏覽器右鍵檢查檢視network,找到連結https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false

可以看到傳回的資料正是頁面的Python招聘詳情,於是我直接開啟發現直接提示{"status":false,"msg":"您操作太頻繁,請稍後再訪問","clientIp":"124.77.161.207","state":2402},機智的我察覺到事情並沒有那麼簡單

真正的較量才剛剛開始,我們先來分析下請求的報文,

 

可以看到請求是以post的方式傳遞的,同時傳遞了引數

datas = {
            'first''false',
            'pn': x,
            'kd''python',
        }

同時不難發現每次點選下一頁都會同時傳送一條get請求

這裡我點了兩次,出現兩條get請求

 

經過探索,發現這個get請求和我們post請求是一致的,那麼問題就簡單許多,整理一下思路

 

關鍵詞:python
搜尋範圍:全國
資料時效:2019.05.05

#!/usr/bin/env python3.4
# encoding: utf-8
"""
Created on 19-5-05
@title: ''
@author: Xusl
"""
import json
import requests
import xlwt
import time


# 獲取儲存職位資訊的json物件,遍歷獲得公司名、福利待遇、工作地點、學歷要求、工作型別、釋出時間、職位名稱、薪資、工作年限
def get_json(url, datas):
    my_essay-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.essay-headers.update(my_essay-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'])  # 崗位對應ID
        information.append(job['city'])  # 崗位對應城市
        information.append(job['companyFullName'])  # 公司全名
        information.append(job['companyLabelList'])  # 福利待遇
        information.append(job['district'])  # 工作地點
        information.append(job['education'])  # 學歷要求
        information.append(job['firstType'])  # 工作型別
        information.append(job['formatCreateTime'])  # 釋出時間
        information.append(job['positionName'])  # 職位名稱
        information.append(job['salary'])  # 薪資
        information.append(job['workYear'])  # 工作年限
        info_list.append(information)
        # 將串列物件進行json格式的編碼轉換,其中indent引數設定縮排值為2
        # print(json.dumps(info_list, ensure_ascii=False, indent=2))
    # print(info_list)
    return info_list


def main():
    page = int(input('請輸入你要抓取的頁碼總數:'))
    # kd = input('請輸入你要抓取的職位關鍵字:')
    # city = input('請輸入你要抓取的城市:')

    info_result = []
    title = ['崗位id''城市''公司全名''福利待遇''工作地點''學歷要求''工作型別''釋出時間''職位名稱''薪資''工作年限']
    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頁正常採集" % x)         except Exception as msg:             print("第%s頁出現問題" % x)                  # 建立workbook,即excel         workbook = xlwt.Workbook(encoding='utf-8')         # 建立表,第二引數用於確認同一個cell單元是否可以重設值         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()
日誌記錄

當然儲存於excel當然是不夠的,之前一直用matplotlib做資料視覺化,這次換個新東西pyecharts

瞭解pyecharts

 

pyecharts是一款將python與echarts結合的強大的資料視覺化工具,包含多種圖表

  • Bar(柱狀圖/條形圖)
  • Bar3D(3D 柱狀圖)
  • Boxplot(箱形圖)
  • EffectScatter(帶有漣漪特效動畫的散點圖)
  • Funnel(漏斗圖)
  • Gauge(儀錶盤)
  • Geo(地理坐標系)
  • Graph(關係圖)
  • HeatMap(熱力圖)
  • Kline(K線圖)
  • Line(折線/面積圖)
  • Line3D(3D 折線圖)
  • Liquid(水球圖)
  • Map(地圖)
  • Parallel(平行坐標系)
  • Pie(餅圖)
  • Polar(極坐標系)
  • Radar(雷達圖)
  • Sankey(桑基圖)
  • Scatter(散點圖)
  • Scatter3D(3D 散點圖)
  • ThemeRiver(主題河流圖)
  • WordCloud(詞雲圖)

使用者自定義

  • Grid 類:並行顯示多張圖
  • Overlap 類:結合不同型別圖表疊加畫在同張圖上
  • Page 類:同一網頁按順序展示多圖
  • Timeline 類:提供時間線輪播多張圖

另外需要註意的是從版本0.3.2 開始,為了縮減專案本身的體積以及維持 pyecharts 專案的輕量化執行,pyecharts 將不再自帶地圖 js 檔案。如使用者需要用到地圖圖表(Geo、Map),可自行安裝對應的地圖檔案包。

  1. 全球國家地圖: echarts-countries-pypkg (1.9MB): 世界地圖和 213 個國家,包括中國地圖
  2. 中國省級地圖: echarts-china-provinces-pypkg (730KB):23 個省,5 個自治區
  3. 中國市級地圖: echarts-china-cities-pypkg (3.8MB):370 個中國城市

也可以使用命令進行安裝

pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg
資料視覺化(程式碼+展示)
  • 各城市招聘數量

 

from pyecharts import Bar

city_nms_top10 = ['北京''上海''深圳''成都''杭州''廣州''武漢''南京''蘇州''鄭州''天津''西安''東莞''珠海''合肥''廈門''寧波',
                  '南寧''重慶''佛山''大連''哈爾濱''長沙''福州''中山']
city_nums_top10 = [1499577221717161375443222111111111]

bar = Bar("Python崗位""各城市數量")
bar.add("數量", city_nms, city_nums, is_more_utils=True)
# bar.print_echarts_options() # 該行只為了列印配置項,方便除錯時使用
bar.render('Python崗位各城市數量.html')  # 生成本地 HTML 檔案
  • 地圖分佈展示(這個場景意義不大,不過多分析)

 

 

from pyecharts import Geo

city_datas = [('北京'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)]
geo = Geo("Python崗位城市分佈地圖""資料來源拉勾", 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=[0200], visual_text_color="#fff",
                symbol_size=15, is_visualmap=True)
geo.render("Python崗位城市分佈地圖_scatter.html")


geo = Geo("Python崗位城市分佈地圖""資料來源拉勾", 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=[010], visual_text_color="#fff",
                symbol_size=15, is_visualmap=True)
        geo.render("Python崗位城市分佈地圖_heatmap.html")
  • 各個城市招聘情況

 

 

from pyecharts import Pie

city_nms_top10 = ['北京''上海''深圳''成都''廣州''杭州''武漢''南京''蘇州''鄭州']
city_nums_top10 = [1499577221717161375]
pie = Pie()
pie.add("", city_nms_top10, city_nums_top10, is_label_show=True)
# pie.show_config()
pie.render('Python崗位各城市分佈餅圖.html')

北上深的崗位明顯碾壓其它城市,這也反映出為什麼越來越多的it從業人員畢業以後相繼奔赴一線城市,除了一線城市的薪資高於二三線這個因素外,還有一個最重要的原因供需關係,因為一線崗位多,可選擇性也就比較高,反觀二三線的局面,很有可能你跳個幾次槽,發現同行業能獃的公司都待過了…

  • 薪資範圍

 

由此可見,python的崗位薪資多數在10k~20k,想從事Python行業的可以把工作年限和薪資結合起來參考一下。

  • 學歷要求 + 工作年限

 

從工作年限來看,1-3年或者3-5年工作經驗的招聘比較多,而應屆生和一年以下的寥寥無幾,對實習生實在不太友好,學歷也普遍要求本科,多數公司都很重視入職人員學歷這點毋容置疑,雖然學歷不代表一切,但是對於一個企業來說,想要短時間內判斷一個人的能力,最快速有效的方法無疑是從學歷入手。學歷第一關,面試第二關。

但是,這不代表學歷不高的人就沒有好的出路,現在的大學生越來越多,找工作也越來越難,競爭越來越激烈,即使具備高學歷,也不能保證你一定可以找到滿意的工作,天道酬勤,特別是it這個行業,知識的迭代,比其他行業來的更頻密。不斷學習,拓展自己學習的廣度和深度,才是最正確的決定。

就業寒冬來臨,我們需要的是理性客觀的看待,而不是盲目地悲觀或樂觀。從以上資料分析,如果愛好Python,仍舊可以入坑,不過要註意一個標簽有工作經驗,就算沒有工作經驗,自己在學習Python的過程中一定要嘗試獨立去做一個完整的專案,爬蟲也好,資料分析也好,亦或者是開發,都要嘗試獨立去做一套系統,在這個過程中培養自己思考和解決問題的能力。持續不斷的學習,才是對自己未來最好的投資,也是度過寒冬最正確的姿勢。

已同步到看一看
贊(0)

分享創造快樂