主頁 >  其他 > 厲害了!打工人用Python分析西安市職位資訊

厲害了!打工人用Python分析西安市職位資訊

2020-12-10 18:29:17 其他

在上一篇博客中,我和大家分享了整個11月份找作業的心路歷程,而在找作業的程序中,博主發現西安大小周、單休這種變相“996”的公司越來越多,感慨整個行業越來越“內卷”的同時,不免會對未來的人生有一點迷茫,因為深圳已經開始試運行“996”了,如果有一天“996”被合法化并成為一種常態,那么,我們又該如何去面對“人會一天天衰老,總有一天肝不動”的客觀規律呢?我注意到Boss直聘移動端會展示某個公司的作息時間,所以,我有了抓取西安市職位和公司資訊并對其進行資料分析的想法,我想知道,這到底是我一個人的感受呢?還是整個世界的確是這樣子的呢?帶著這樣的想法,博主有了今天這篇博客,所以,在今天這篇博客里,博主會從Boss直聘、智聯招聘以及前程無憂上抓取職位和公司資訊,并使用MongoDB對資料進行持久化,最終通過pyecharts對結果進行可視化展示,雖然不大確定2021年會不會變得更好,可生活最迷人的地方就在于它的不確定性,正如資料分析唯一可以做的,就是幫助我們從變化的事物中挖掘出不變的規律一樣,

爬蟲撰寫

其實,這種類似的資料分析,博主此前做過挺多的啦,譬如 基于Python實作的微信好友資料分析 以及 基于新浪微博的男女性擇偶觀資料分析(下) 這兩篇博客,總體上來說,大部分學習Python的朋友都是從撰寫爬蟲開始的,而在博主看來,資料分析是最終的目的,撰寫爬蟲則是達到這一目的的手段,而從始至終,“爬”與“反爬”的較量從未停止過,Requests、BeautifulSoup、Selenium、Phantom等等的技術層出不窮,考慮到現在撰寫爬蟲存在風險,所以,我不會在博客里透露過多的“爬蟲”細節,換言之,我不想成為一個教別人寫爬蟲的人,因為這篇博客的標簽是資料分析,關于爬蟲的部分,我點到為止,不再過多地去探討它的實作,希望大家理解,而之所以要從這三個招聘網站上抓取,主要還是為了增加樣本的多樣性,因為Boss直聘上西安市的職位居然只有3頁,這實在是太讓人費解了!

Boss直聘

通過抓包,我們可以分析出Boss直聘的地址:https://www.zhipin.com/job_detail/?query={query}&city={cityCode}&industry=&position=&page={page},其中,query為待查詢關鍵詞,cityCode為待查詢城市代碼,page為待查詢的頁數,可以注意到,industryposition兩個引數沒有維護,它們分別表示待查詢的行業和待查詢的職稱,因為我們面向的是更一般的“打工人”,所以,這些都可以進行簡化,對于cityCode這個引數,我們可以通過下面的介面獲得:https://www.zhipin.com/wapi/zpCommon/data/city.json,這里,簡單定義一個方法extractCity()來提取城市代碼:

def extractCity(self, cityName=None):
    if (os.path.exists('bossCity.json') and cityName != None):
        with open('bossCity.json', 'rt', encoding='utf-8') as fp:
            cityList = json.load(fp)
            for city in cityList:
                if (city['name'] == cityName):
                    return city['code']
    else:
        response = requests.get(self.cityUrl)
        response.raise_for_status()
        json_data = response.json();
        if (json_data['code'] == 0 and json_data['zpData'] != None):
            cityList = []
            for level in json_data['zpData']['cityList']:
                cityList.extend(self.unfoldLevel(level))
            with open('bossCity.json', 'wt', encoding='utf-8') as fp:
                json.dump(cityList, fp)
            if (cityName != None):
                for city in cityList:
                    if (city['name'] == cityName):
                        return city['code']
            else:
                return json_data['zpData']['locationCity']['code']

接下來,我們可以撰寫searchJobs()方法來實作職位的檢索:

def searchJobs(self, cityName, query, page=1):
    cityCode = self.extractCity(cityName)
    if (cityCode  != None):
        searchUrl = 'https://www.zhipin.com/job_detail/?query={query}&city={cityCode}&industry=&position=&page={page}'.format(cityCode=cityCode, query=query, page=str(page))
        html = self.makeRequest(searchUrl)
        soup = BeautifulSoup(html)
        details = soup.find_all(name='div',attrs={'class','job-primary'})
        jobItems = []
        companyItems = []
        for detail in details:
            jobItem = self.extractJob(detail)
            if (jobItem == None):
                continue
            else:
                jobItems.append(jobItem)
            companyItem = self.extractCompany(detail)
            if (companyItem == None):
                continue
            else:
                jobItem['company'] = companyItem['title']
                jobItem['industry'] = companyItem['industry']
                companyItems.append(companyItem)
        return (jobItems,companyItems)

這里我們會用到requestsfake_useragent以及BeautifulSoup,如果你經常撰寫爬蟲的話,對它們應當不會感到陌生,唯一需要注意的有兩點:第一,Boss直聘會封殺爬蟲的IP,所以,可以考慮從互聯網上抓取免費的代理IP作為代理池,每次發起請求時隨機選取一個IP作為代理IP,這樣可以有效地減少被封殺的可能,第二,Boss直聘的Cookie最多只能使用4次,超過4次后就需要重新獲取Cookie, 目前,我沒有找到好的解決方案,有興趣的朋友可以參考 2019年末逆向復習系列之Boss直聘Cookie加密欄位__zp_stoken__逆向分析 這篇博客做一點逆向方面的研究,或者考慮使用PyExecJS載入前端JavaScript腳本來生成Cookie,因為逆向并不是我這篇博客的重點,在解決了這兩個問題后,我們就可以提取出每一頁的崗位和公司資訊,而這些都可以通過BeautifulSoup解決,這里不再贅述,關于Boss直聘部分的源代碼,請參考:https://github.com/qinyuanpei/job-analyse/blob/master/Spider/bossSpider.py,

智聯招聘

智聯招聘相對于Boss直聘要簡單一點,通過抓包分析,我們可以找到這樣一個地址:https://fe-api.zhaopin.com/c/i/sou?at={at}&_v={v}&x-zp-page-request-id={x-zp-page-request-id}&x-zp-client-id={v}&MmEwMD={MmEwMD},通過這個介面可以直接獲得JSON格式的資料,可想要構造這幾個引數出來,實在是有一點困難,因為它遇到和Boss直聘一樣的問題,基本都需要一定的逆向功底,而如果嘗試去決議DOM,你會發現它的前端使用了Vue.js,換句話說,這個網站是由前端完成渲染的,這意味著,如果我直接訪問https://sou.zhaopin.com/?jl=854這個地址,是無法拿到可以決議的DOM結構的,這就多少會有一點尷尬,所以,實際上博主最后沒有實作智聯招聘的爬蟲,因為在這上面投入太多的精力,實在有一點得不償失,這里簡單說一下思路,基本上我們需要以POST方式呼叫這個介面,然后在Body中寫入下面的結構:

{"pageSize":"30","cityId":854,"workExperience":"-1","companyType":"-1","employmentType":"-1","jobWelfareTag":"-1","kt":"3","at":"20673d42d62d48c38add329318fb9e2c","rt":"84a950e77e054854b4d2f9d90826d063","_v":"0.97312845","userCode":662040894,"eventScenario":"pcSearchedSouIndex","cvNumber":"JM620408945R90500002000"}

這里依然要解決Cookie的問題,它這個Cookie簡直不能更惡心,因為引數實在是太多了:

這個Cookie相當變態
那么,我放棄了,感興趣的朋友可以順著這個思路繼續探索,加油!

前程無憂

相對于Boss直聘和智聯招聘,前程無憂要更簡單一點,這種簡單是從心智體驗上來講,經過分析,它的地址為:https://search.51job.com/list/200200,000000,0000,00,9,99,+,2,{page}.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=,它的簡單體現在,可以直接通過修改page這個引數來達到抓取某一頁資料的目的,它本身沒有特別強大的反爬機制,所以,事實上,它是整個資料分析主要的資料來源,在這個地址里可能有一點大家看不懂的東西,沒關系,博主一樣看不懂,我們只需要知道它表示西安就可以了,如果想抓取某個城市的職位資訊,可以直接在前程無憂上搜索,地址欄會告訴你這一切是如何變化的,需要說明的是,前程無憂的職位資訊是存盤在window.__SEARCH_RESULT__這個變數里的,所以,我們通過這個正則直接去匹配它即可,不需要再去決議DOM,這再次體現出了它的簡單:

def searchJobs(self, cityName, query, page=1):
    cityCode = cityName
    if (cityCode   != None):
        searchUrl = 'https://search.51job.com/list/200200,000000,0000,00,9,99,+,2,{page}.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='.format(page=str(page))
        html = self.makeRequest(searchUrl)
        data = re.findall('window.__SEARCH_RESULT__ =(.+)}</script>', str(html))[0] + "}"
        details = json.loads(data)['engine_search_result']
        jobItems = []
        companyItems = []
        for detail in details:
            jobItem = self.extractJob(detail)
            if (jobItem == None):
                continue
            else:
                jobItems.append(jobItem)
            companyItem = self.extractCompany(detail)
            if (companyItem == None):
                continue
            else:
                companyItems.append(companyItem)
            return (jobItems,companyItems)

因為這里真正起作用的實際上只有page這個引數,所以,我們只需要回圈每一頁就可以了,博主就是通過這個方法抓取了大量的職位資訊,同樣地,我們通過extractJob()extractCompany()兩個方法來組裝職位和公司的資訊,最終通過元組的形式回傳,由呼叫者自己決定要如何去處理這些資料,雖然,我們選擇了MongoDB這樣的資料庫,它不像關系型資料庫那樣重視Schema,可為了我們最終分析資料的時候方便一點,還是建議使用一致的資料結構,關于前程無憂部分的源代碼,請參考:https://github.com/qinyuanpei/job-analyse/blob/master/Spider/job51Spider.py,

資料分析

在開始今天的資料分析前,首先向大家展示下爬蟲抓取到的資料,截止到寫這篇的博客的時間,博主一共收集了20000個左右的職位/公司資訊,如下圖所示:

職位資訊展示

公司資訊展示

接下來,我們從資料庫中讀取這些資料以開始下面的分析:

store = Store.mongoStore.MongoStore('default')
jobs = list(store.find('job',{}))
companies = list(store.find('company',{}))

行業結構分析

俗話說,“男怕入錯行,女怕嫁錯郎”,我們今天的社會是一個非常“苛刻”的社會,它要求每一個人在“合適”的年齡做“該做”的事情,可要達到這樣一個“標準”則是非常不容易的,在綜藝節目《令人心動的Offer》里,“大齡”、“裸辭”、“背水一戰”的丁輝,受到了來自紅圈律所的“精英”們的區別對待,仿佛一個人的人生不能有一丁點的差錯,或許人生的“試錯”成本真的非常高,高到人們在30歲左右的時候紛紛遭遇中年危機,所以,我們實在有必要去了解一個行業,它目前的求職現狀到底是什么樣的,這里以西安市為例:

def analyse_industry():
    industries = list(map(lambda x:x['industry'],companies))
    counter = Counter(industries)
    counter = sorted(counter.items(),key = lambda x:x[1],reverse = True)[0:15]
    counter = dict(counter)
    c = (
        Pie()
        .add("",[list(z) for z in zip(counter.keys(), counter.values())],label_opts=opts.LabelOpts(is_show=True, position="center"),)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="西安市求職招聘行業結構分析(Top15)",pos_left=325),
            legend_opts=opts.LegendOpts(type_="scroll", pos_left="left", orient="vertical"),
        )
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
        .render("./Reports/西安市求職招聘行業結構分析(Top15).html")
    )

下面是整個西安市求職招聘排名前15位的行業結構:

西安市求職招聘行業結構分析(Top15)

可以注意到,其中占據份額較大的行業主要有:房地產、建筑/建材/工程、計算機軟體、電子技術/半導體/集成電路、教育/培訓/院校等,

學歷結構分析

作為一個“西漂”,博主對西安最深的一個印象就是,西安有著非常豐富的高校資源,正因為如此,博主一度認為西安遍歷都是研究生,因為在過去的四年里,的確接觸過不少研究生學歷的同事,相比之下,博主這樣一個普通211、非科班的本科生,著實顯得有點相形見絀,我在之前的博客里有提到去中興面試的經歷,這個經歷讓我第一次意識到,學歷和非科班的出身,終究有一天會成為你進入國企或者大廠的門檻,所以,博主在考慮要不要去讀一個在職的研究生,這種認識到底是不是幸存者偏差呢,我們來看看資料分析的結果:

def analyse_education():
    eduInfos = list(map(lambda x:x['eduInfo'], jobs))
    counter = Counter(eduInfos)
    counter = sorted(counter.items(),key = lambda x:x[1],reverse = True)
    counter = dict(counter)
    c = (
        Pie()
        .add("",[list(z) for z in zip(counter.keys(), counter.values())])
        .set_global_opts(
            title_opts=opts.TitleOpts(title="西安市求職招聘學歷結構分析",pos_left=325),
            legend_opts=opts.LegendOpts(type_="scroll", pos_left="left", orient="vertical"),
        )
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
        .render("./Reports/西安市求職招聘學歷結構分析.html")
    )

我承認我在胡說八道,因為結果非常的Amazing啊,非常的畢導啊:

西安市求職招聘學歷結構分析

我沒有想到研究生以上的比例這么低,可能是因為我身邊這些同事的層次都比較高吧,哈哈!可當學歷逐漸成為一種門檻,即使你比本科生多上三年學,最后一樣要在這世界上顛沛流離的時候,是不是會和博主有一樣的疑問,為什么IT行業會變成勞動密集型產業?是因為門檻低讓這個行業劣幣驅逐良幣呢,還是擁有高學歷的人才一樣要去擰螺絲?

薪資待遇分析

有時候,我會忍不住想,是不是在任何一個城市里,人們工資增長永遠都趕不上房價增長?如果真的是這樣,我們為什么又要從三線小城市出來呢?可能是覺得大城市有更好的機會吧,可轉眼到了2020年,上大學時一心想從事這個行業的我,當時無論如何都想不到若干年后要面對“35歲”這個問題,當“996”作為一種“福報”的聲音越來越強烈,曾經我們認為的那“一點點”機會,真的就是只剩下“一點點”,人有時候就是在靠著那點“不切實際”過日子,譬如固執的認為收入會越來越高,可其實任何作業都是有天花板的存在的,以大多數普通人的努力程度,一輩子連天花板都可能觸碰不到,真實的薪資水平到底是什么樣的呢?年薪30萬果真如此尋常等閑?我們一起來看:

def analyse_salary():
    salaries = list(map(lambda x:x['avgSalary'], list(filter(lambda x:x['avgSalary'] != 0, jobs))))
    counter = Counter(salaries)
    counter = sorted(counter.items(),key = lambda x:x[1],reverse = True)
    records = {'3000元以下':0, '3000元-5000元':0, '5000元-8000元':0, '8000元-12000元':0, '12000元-15000元':0, '15000元以上':0}
    for (k,v) in counter:
        if (k < 3000):
            records['3000元以下'] += v
        if (k >= 3000 and k < 5000):
            records['3000元-5000元'] += v
        if (k >= 5000 and k < 8000):
            records['5000元-8000元'] += v
        if (k >= 8000 and k < 12000):
            records['8000元-12000元'] += v
        if (k >= 12000 and k < 15000):
            records['12000元-15000元'] += v
        if (k >= 15000):
            records['15000元以上'] += v
    counter = dict(records)
    c = (
        Pie()
        .add("",[list(z) for z in zip(counter.keys(), counter.values())])
        .set_global_opts(
            title_opts=opts.TitleOpts(title="西安市求職招聘平均工資分析",pos_left=325),
            legend_opts=opts.LegendOpts(type_="scroll", pos_left="left", orient="vertical"),
        )
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
        .render("./Reports/西安市求職招聘平均工資分析.html")
    )

由此,我們得到了整個西安市的收入分布情況,顯然,**5000~8000*這個收入區間才是大多數普通人的真實寫照:

西安市求職招聘平均工資分析

我們繼續分析,哪些行業的平均工資更高一點,因為這樣你會找到同齡人的參考物件:

def analyse_industry_salary():
    filtered = list(filter(lambda x:x['avgSalary'] != 0, jobs))
    salaries = {}
    for job in filtered:
        if (job['industry'] == ''):
            continue
        if salaries.get(job['industry']) == None:
            salaries[job['industry']] = [job['avgSalary']]
        else:
            salaries[job['industry']].append(job['avgSalary'])
    counter = {}
    for (industry, data) in salaries.items():
        counter[industry] = int(sum(data) / len(data))
    counter = sorted(counter.items(),key = lambda x:x[1],reverse = True)[0:15]
    counter = dict(counter)
    c = (
        Bar()
        .add_xaxis(list(counter.keys()))
        .add_yaxis("平均工資", list(counter.values()))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="西安市求職招聘行業工資分析(Top15)", pos_left=325),
            legend_opts=opts.LegendOpts(type_="scroll", pos_left="left", orient="vertical"),
        )
        .render("./Reports/西安市求職招聘行業工資分析(Top15).html")
    )

類似地,我們這里取排名前15位的行業進行分析:

西安市求職招聘行業工資分析

可以注意到,工資收入靠前的行業主要集中在:互聯網/移動互聯網/計算機軟體/電子商務、信托/拍賣/典當/擔保、 智能硬體、法律、學術/科研、保險、房地產、金融/投資/證券、美容/保健等行業,可惜,從一名IT行業從業者的角度來看,西安實際上并沒有真正的互聯網公司,這個世界常常如此,每個月掙15K的人感慨自己買不起房,可還有那么多收入在8K以下的人群,還能再說什么呢?

學歷與薪資關系分析

通常大家都認為,學歷越高,薪資就會越高,那么,這個是否符合實際情況呢,我們一起來看一下:

def analyse_eduInfo_salary(industry=None):
    filtered = list(filter(lambda x:x['avgSalary'] != 0, jobs))
    if (industry != None):
        filtered = list(filter(lambda x:x['industry'] == industry, filtered))
    salaries = {}
    for job in filtered:
        if (job['eduInfo'] == ''):
            continue
        eduInfo = job['eduInfo']
        if (eduInfo in ['學歷不限','不限']):
            eduInfo = '學歷不限'
        if salaries.get(eduInfo) == None:
            salaries[eduInfo] = [job['avgSalary']]
        else:
            salaries[eduInfo].append(job['avgSalary'])
    counter = {}
    for (eduInfo, data) in salaries.items():
        counter[eduInfo] = int(sum(data) / len(data))
    c = (
        Bar()
        .add_xaxis(list(counter.keys()))
        .add_yaxis("平均工資", list(counter.values()))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="西安市求職招聘學歷與薪資關系分析", pos_left=325),
            legend_opts=opts.LegendOpts(type_="scroll", pos_left="left", orient="vertical"),
        )
        .render("./Reports/西安市求職招聘學歷與薪資關系分析.html")
    )

下面給出可視化以后的結果:

西安市求職招聘學歷與薪資關系分析

可以發現,整體上學歷和薪資是呈正比的,甚至“不限學歷”比“高中”的工資還要高一點,可如果有那么多“不限學歷”的作業,為什么今年還有那么多人找不到作業呢?我想,這就是我們常說的選擇,我們之所以付出努力,無非是想比別人多一點選擇,可正如納什均衡理論所言,如果我們大家都去選擇相同的東西,最后的結果可能是大家都得不到這樣東西,可話又說回來,明明都知道那個行業熱門,如果不做這個選擇,反而才是最奇怪的吧…

經驗與薪資關系分析

如果說學歷與薪資呈正比,那么經驗與薪資則不一定滿足這樣的關系,因為經驗其實是一個不準確的“度量”單位,以IT行業為例,在一家公司里,老員工的薪資被新員工的薪資“倒掛”是經常發生的事情,所以,人們似乎達成了某種共識,即期待公司主動漲薪是非常困難的,你唯一能做的就是在面試時爭取更多的薪資,這就要說到經驗這個話題,IT行業技術日新月異的特點,實在很難讓經驗變成一個“褒義詞”,因為經驗在積累的同時同樣在“過期”,更不用說那些一直在“重復”的人了,所以,我覺得掌握通用型的知識譬如演算法、資料結構等會更重要,

def analyse_exps_salary(industry=None):
    filtered = list(filter(lambda x:x['avgSalary'] != 0, jobs))
    if (industry != None):
        filtered = list(filter(lambda x:x['industry'] == industry, filtered))
    salaries = {}
    for job in filtered:
        if (job['exps'] == ''):
            continue
        exps = job['exps']
        exps = exps.replace('經驗','')
        if (exps in ['1年','1年以內','2年','1-3年']):
            exps = '1-3年'
        if (exps in ['不限','經驗不限']):
            exps = '經驗不限'
        if (exps in ['3到4年','3到5年','3-4年','3-5年']):
            exps = '3-5年'
        if (exps in ['8到9年','5到10年','5到7年','8-9年','5-10年','5-7年']):
            exps = '5-10年'
        if salaries.get(exps) == None:
            salaries[exps] = [job['avgSalary']]
        else:
            salaries[exps].append(job['avgSalary'])
    counter = {}
    for (industry, data) in salaries.items():
        counter[industry] = int(sum(data) / len(data))
    c = (
        Bar()
        .add_xaxis(list(counter.keys()))
        .add_yaxis("平均工資", list(counter.values()))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="西安市求職招聘作業經驗與薪資關系分析", pos_left=325),
            legend_opts=opts.LegendOpts(type_="scroll", pos_left="left", orient="vertical"),
        )
        .render("./Reports/西安市求職招聘作業經驗與薪資關系分析.html")
    )

一切都會向著我們期待的方向發展嗎?我們拭目以待:

西安市求職招聘作業經驗與薪資關系分析

可以發現,整體上,經驗越豐富,薪資待遇會越高,前提是你真的識訓了經驗,而不是在歲月的蹉跎里單單識訓了皺紋和滄桑,這是我們每個人都應該去反思的一個問題,如果一切的經驗都有過時的那一天,至少你真的擁有過它們,就像愛情這種東西一樣,

招聘熱詞分析

在招聘網站上,一般都會以標簽的方式,對職位要求、公司福利等進行描述,譬如五險一金、彈性打卡等等,通過這些標簽,我們就能對職位以及公司有個基本印象,所以,我們可以通過分析這些標簽,來展示在求職程序中求職者和招聘方各自關注哪些因素,下面,我們將以詞云的形式來展示這些標簽:

# 提取崗位關鍵字
job_tags = []
for item in map(lambda x:x['tags'], jobs):
    if (item != None):
        job_tags.extend(item)

# 提取公司關鍵字
company_tags = []
for item in map(lambda x:x['tags'], companies):
    if (item != None):
        company_tags.extend(item)

def analyse_extract_tags(words,title):
    words = list(filter(lambda x:x!='', words))
    data = Counter(words)
    c= (
        WordCloud()
        .add(series_name="熱門詞匯", data_pair=data.items(), word_size_range=[6, 66])
        .set_global_opts(
            title_opts=opts.TitleOpts(
                title=title, title_textstyle_opts=opts.TextStyleOpts(font_size=23)
            ),
            tooltip_opts=opts.TooltipOpts(is_show=True),
        )
        .render('.\Reports\{title}.html'.format(title=title))
    )

analyse_extract_tags(
    words=job_tags,
    title='西安市求職者熱詞分析'
)
analyse_extract_tags(
    words=company_tags,
    title='西安市招聘者熱詞分析'
)

西安市求職者熱詞分析

西安市招聘者熱詞分析

可以注意到,五險一金、年終獎金、專業培訓、績效獎金、節日福利、帶薪年假是大家普遍關注的點,

本文小結

本文主要抓取了Boss直聘、智聯招聘、前程無憂三個招聘網站的職位資訊和公司資訊,并在此基礎上對西安市的求職招聘進行了資料分析,主要從行業結構、學歷結構、薪資待遇、學歷與薪資關系、經驗與薪資關系、招聘熱詞等方面入手,經分析,針對西安市的求職招聘的求職招聘,我們可以得出下面的結論:(1)西安市排名相對靠前的行業主要有:房地產、建筑/建材/工程、計算機軟體、電子技術/半導體/集成電路、教育/培訓/院校等;(2)西安市招聘的職位中大專和本科學歷約占總職位的75%左右,碩士以及博士學歷相對較低;(3)西安市的平均薪資中,5000~8000這個收入區間是大多數普通人的真實寫照,工資收入靠前的行業主要集中在:互聯網/移動互聯網/計算機軟體/電子商務、信托/拍賣/典當/擔保、 智能硬體、法律、學術/科研、保險、房地產、金融/投資/證券、美容/保健等行業;(4)擁有高學歷的人更有可能擁有高薪資;(5)整體上,經驗越豐富,薪資待遇會越高,前提是你真的識訓了經驗,而不是在歲月的蹉跎里單單識訓了皺紋和滄桑;(6)在整個求職招聘中,無論是求職者還是招聘者,普遍看重的因素有:五險一金、年終獎金、專業培訓、績效獎金、節日福利、帶薪年假等,雖然一開始的目的是想知道西安有多少“996”的公司,不過在后續的實作程序中,發現從Boss直聘上抓取不到這些資訊,所以,最終呈現出的結果就變成了現在這個樣子,考慮到篇幅,關于公司規模、公司型別的分析,沒有在這里寫出來,如果大家感興趣,可以參考:https://github.com/qinyuanpei/job-analyse/tree/master,以上就是這篇博客的全部內容啦,謝謝大家!

qinyuanpei CSDN認證博客專家 .NET Python 偽·全堆疊攻城獅
謝謝你,在這世界的角落,找到我,一個即將進入而立之年的中年大叔,常年以 飛鴻踏雪 的花名混跡江湖,在現實生活中,我是一名 偽·全堆疊攻城獅,因為我覺得,什么都略懂一點,生活會更多彩一些,目前,主要關注.NET、.NET Core、Python、資料分析、微服務、Web 等技術方向,日常行為:讀書、寫作、電影、烹飪、洞簫等,喜歡看日劇/紀錄片/科普、刷B站、刷LeetCode等,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/232636.html

標籤:AI

上一篇:Netty4 ChannelHandler 概述

下一篇:【12月8日更新】如何入門 TensorFlow ? “開發者出道計劃”第一期話題精華內容匯總

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more