午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

Python開發(fā)在北京的就業(yè)現(xiàn)狀分析

 天建中林 2020-11-12

Python開發(fā)在北京的就業(yè)現(xiàn)狀分析

宇亮 Python中文社區(qū) 2018-12-26

相信各位同學(xué)多多少少在拉鉤上投過簡歷,今天突然想了解一下北京Python開發(fā)的薪資水平、招聘要求、福利待遇以及公司地理位置。既然要分析那必然是現(xiàn)有數(shù)據(jù)樣本。本文通過爬蟲和數(shù)據(jù)分析為大家展示一下北京Python開發(fā)的現(xiàn)狀,希望能夠在職業(yè)規(guī)劃方面幫助到大家!!!

爬蟲

爬蟲的第一步自然是從分析請(qǐng)求和網(wǎng)頁源代碼開始。從網(wǎng)頁源代碼中我們并不能找到發(fā)布的招聘信息。但是在請(qǐng)求中我們看到這樣一條POST請(qǐng)求

如下圖我們可以得知

url:https://www.lagou.com/jobs/positionAjax.json?city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false

請(qǐng)求方式:post

result:為發(fā)布的招聘信息

totalCount:為招聘信息的條數(shù)

通過實(shí)踐發(fā)現(xiàn)除了必須攜帶headers之外,拉勾網(wǎng)對(duì)ip訪問頻率也是有限制的。一開始會(huì)提示 '訪問過于頻繁',繼續(xù)訪問則會(huì)將ip拉入黑名單。不過一段時(shí)間之后會(huì)自動(dòng)從黑名單中移除。

針對(duì)這個(gè)策略,我們可以對(duì)請(qǐng)求頻率進(jìn)行限制,這個(gè)弊端就是影響爬蟲效率。

其次我們還可以通過代理ip來進(jìn)行爬蟲。網(wǎng)上可以找到免費(fèi)的代理ip,但大都不太穩(wěn)定。付費(fèi)的價(jià)格又不太實(shí)惠。 

具體就看大家如何選擇了

1
思路

    通過分析請(qǐng)求我們發(fā)現(xiàn)每頁返回15條數(shù)據(jù),totalCount又告訴了我們?cè)撀毼恍畔⒌目倵l數(shù)。

向上取整就可以獲取到總頁數(shù)。然后將所得數(shù)據(jù)保存到csv文件中。這樣我們就獲得了數(shù)據(jù)分析的數(shù)據(jù)源!

post請(qǐng)求的Form Data傳了三個(gè)參數(shù)

first : 是否首頁(并沒有什么用)

pn:頁碼

kd:搜索關(guān)鍵字

2
no bb, show code
# 獲取請(qǐng)求結(jié)果
# kind 搜索關(guān)鍵字
# page 頁碼 默認(rèn)是1
def get_json(kind, page=1,):
    # post請(qǐng)求參數(shù)
    param = {
        'first''true',
        'pn': page,
        'kd': kind
    }
    header = {
        'Host''www.lagou.com',
        'Referer''https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
        'User-Agent''Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
    }
    # 設(shè)置代理
    proxies = [
        {'http''140.143.96.216:80''https''140.143.96.216:80'},
        {'http''119.27.177.169:80''https''119.27.177.169:80'},
        {'http''221.7.255.168:8080''https''221.7.255.168:8080'}
    ]
    # 請(qǐng)求的url
    url = 'https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false'
    # 使用代理訪問
    # response = requests.post(url, headers=header, data=param, proxies=random.choices(proxies))
    response = requests.post(url, headers=header, data=param, proxies=proxies)
    response.encoding = 'utf-8'
    if response.status_code == 200:
        response = response.json()
        # 請(qǐng)求響應(yīng)中的positionResult 包括查詢總數(shù) 以及該頁的招聘信息(公司名、地址、薪資、福利待遇等...)
        return response['content']['positionResult']
    return None

接下來我們只需要每次翻頁之后調(diào)用 get_json 獲得請(qǐng)求的結(jié)果 再遍歷取出需要的招聘信息即可

if __name__ == '__main__':
    # 默認(rèn)先查詢第一頁的數(shù)據(jù)
    kind = 'python'
    # 請(qǐng)求一次 獲取總條數(shù)
    position_result = get_json(kind=kind)
    # 總條數(shù)
    total = position_result['totalCount']
    print('{}開發(fā)職位,招聘信息總共{}條.....'.format(kind, total))
    # 每頁15條 向上取整 算出總頁數(shù)
    page_total = math.ceil(total/15)

    # 所有查詢結(jié)果
    search_job_result = []
    #for i in range(1, total + 1)
    # 為了節(jié)約效率 只爬去前100頁的數(shù)據(jù)
    for i in range(1100):
        position_result = get_json(kind=kind, page= i)
        # 每次抓取完成后,暫停一會(huì),防止被服務(wù)器拉黑
        time.sleep(15)
        # 當(dāng)前頁的招聘信息
        page_python_job = []
        for j in position_result['result']:
            python_job = []
            # 公司全名
            python_job.append(j['companyFullName'])
            # 公司簡稱
            python_job.append(j['companyShortName'])
            # 公司規(guī)模
            python_job.append(j['companySize'])
            # 融資
            python_job.append(j['financeStage'])
            # 所屬區(qū)域
            python_job.append(j['district'])
            # 職稱
            python_job.append(j['positionName'])
            # 要求工作年限
            python_job.append(j['workYear'])
            # 招聘學(xué)歷
            python_job.append(j['education'])
            # 薪資范圍
            python_job.append(j['salary'])
            # 福利待遇
            python_job.append(j['positionAdvantage'])

            page_python_job.append(python_job)

        # 放入所有的列表中
        search_job_result += page_python_job
        print('第{}頁數(shù)據(jù)爬取完畢, 目前職位總數(shù):{}'.format(i, len(search_job_result)))
        # 每次抓取完成后,暫停一會(huì),防止被服務(wù)器拉黑
        time.sleep(15)

ok! 數(shù)據(jù)我們已經(jīng)獲取到了,最后一步我們需要將數(shù)據(jù)保存下來

  # 將總數(shù)據(jù)轉(zhuǎn)化為data frame再輸出
    df = pd.DataFrame(data=search_job_result,
                      columns=['公司全名''公司簡稱''公司規(guī)模''融資階段''區(qū)域''職位名稱''工作經(jīng)驗(yàn)''學(xué)歷要求''工資''職位福利'])
    df.to_csv('lagou.csv', index=False, encoding='utf-8_sig')

運(yùn)行main方法直接上結(jié)果:

數(shù)據(jù)分析

通過分析cvs文件,為了方便我們統(tǒng)計(jì),我們需要對(duì)數(shù)據(jù)進(jìn)行清洗

比如剔除實(shí)習(xí)崗位的招聘、工作年限無要求或者應(yīng)屆生的當(dāng)做 0年處理、薪資范圍需要計(jì)算出一個(gè)大概的值、學(xué)歷無要求的當(dāng)成大專

# 讀取數(shù)據(jù)  
df = pd.read_csv('lagou.csv', encoding='utf-8')
# 數(shù)據(jù)清洗,剔除實(shí)習(xí)崗位  
df.drop(df[df['職位名稱'].str.contains('實(shí)習(xí)')].index, inplace=True)  
# print(df.describe())
# 由于CSV文件內(nèi)的數(shù)據(jù)是字符串形式,先用正則表達(dá)式將字符串轉(zhuǎn)化為列表,再取區(qū)間的均值  
pattern = 'd+'  
df['work_year'] = df['工作經(jīng)驗(yàn)'].str.findall(pattern)
# 數(shù)據(jù)處理后的工作年限
avg_work_year = []
# 工作年限
for i in df['work_year']:
   # 如果工作經(jīng)驗(yàn)為'不限'或'應(yīng)屆畢業(yè)生',那么匹配值為空,工作年限為0  
   if len(i) == 0:  
       avg_work_year.append(0)  
   # 如果匹配值為一個(gè)數(shù)值,那么返回該數(shù)值  
   elif len(i) == 1:  
       avg_work_year.append(int(''.join(i)))  
   # 如果匹配值為一個(gè)區(qū)間,那么取平均值  
   else:  
       num_list = [int(j) for j in i]  
       avg_year = sum(num_list)/2  
       avg_work_year.append(avg_year)
df['工作經(jīng)驗(yàn)'] = avg_work_year

# 將字符串轉(zhuǎn)化為列表,再取區(qū)間的前25%,比較貼近現(xiàn)實(shí)  
df['salary'] = df['工資'].str.findall(pattern)
# 月薪
avg_salary = []  
for k in df['salary']:  
   int_list = [int(n) for n in k]  
   avg_wage = int_list[0]+(int_list[1]-int_list[0])/4  
   avg_salary.append(avg_wage)
df['月工資'] = avg_salary

# 將學(xué)歷不限的職位要求認(rèn)定為最低學(xué)歷:大專
df['學(xué)歷要求'] = df['學(xué)歷要求'].replace('不限','大專')

數(shù)據(jù)通過簡單的清洗之后,下面開始我們的統(tǒng)計(jì)

1
繪制薪資直方圖
# 繪制頻率直方圖并保存  
plt.hist(df['月工資'])
plt.xlabel('工資 (千元)')   
plt.ylabel('頻數(shù)')
plt.title("工資直方圖")   
plt.savefig('薪資.jpg')  
plt.show()  

結(jié)論:北京市Python開發(fā)的薪資大部分處于15~25k之間

2
公司分布餅狀圖
# 繪制餅圖并保存  
count = df['區(qū)域'].value_counts()
plt.pie(count, labels = count.keys(),labeldistance=1.4,autopct='%2.1f%%')  
plt.axis('equal')  # 使餅圖為正圓形  
plt.legend(loc='upper left', bbox_to_anchor=(-0.11))  
plt.savefig('pie_chart.jpg')  
plt.show()  

結(jié)論:Python開發(fā)的公司最多的是海淀區(qū)、其次是朝陽區(qū)。準(zhǔn)備去北京工作的小伙伴大概知道去哪租房了吧 

3
學(xué)歷要求直方圖
# {'本科': 1304, '大專': 94, '碩士': 57, '博士': 1}
dict = {}
for i in df['學(xué)歷要求']:
    if i not in dict.keys():
        dict[i] = 0
    else:
        dict[i] += 1
index = list(dict.keys())
print(index)
num = []
for i in  index:
    num.append(dict[i])
print(num)
plt.bar(left=index, height=num, width=0.5)
plt.show()

結(jié)論:在Python招聘中,大部分公司要求是本科學(xué)歷以上。但是學(xué)歷只是個(gè)敲門磚,如果努力提升自己的技術(shù),這些都不是事兒

4
福利待遇詞云圖
# 繪制詞云,將職位福利中的字符串匯總  
text = ''  
for line in df['職位福利']:  
   text += line  
# 使用jieba模塊將字符串分割為單詞列表
cut_text = ' '.join(jieba.cut(text))
#color_mask = imread('cloud.jpg')  #設(shè)置背景圖
cloud = WordCloud(
    background_color = 'white',
    # 對(duì)中文操作必須指明字體
    font_path='yahei.ttf',
    #mask = color_mask,
    max_words = 1000,
    max_font_size = 100
    ).generate(cut_text)

# 保存詞云圖片
cloud.to_file('word_cloud.jpg')
plt.imshow(cloud)
plt.axis('off')
plt.show()

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多