大資料時代,計算機行業蓬勃發展,越來越多的人投身計算機事業養家糊口。是以該如何選擇工作,現在社會需要怎麼樣的計算機人才,我們該如何對應的提升自己的本領都是尤為重要的。這篇文章就是對實習吧招聘網站有關python職位資訊的一個簡單分析與可視化。希望通過這些資料,能得到隐藏的資料背後的秘密。讓我們來一起探索吧。
目錄
- 資料爬取
- 資料處理
-
- 讀取檔案
- 删除無意義列
- 删除重複的值
- 資料可視化
-
- 工資資訊可視化
- 城市資訊可視化
- 實習時間資訊可視化
- Jieba分詞對職位描述可視化
- 對于公司的說明詞雲可視化
- 總結
本文就實習吧招聘網站上截止到2020年12月31号有關于python相關的招聘資訊共109條做一個簡單的爬取和資料分析,尚有很多不足。如有任何錯誤或纰漏,歡迎指出讨論。
資料爬取
将實習吧刺猬實習裡面有關python職位的招聘資訊爬取出來,儲存在一個CSV檔案中。檢視招聘網站可以發現,一共有109條資料,其中包含已下架的招聘資訊。雖然這部分下架的招聘資訊看起來是毫無意義,但其實也能通過其中擷取到很多有用的資訊。
爬取後的是儲存在CSV檔案中,檔案部分内容如下圖所示,爬取的内容主要包含了工作名稱、公司名稱、公司所在城市、招聘需求學曆、實習工資、實習時間、職位描述、公司其他職位以及公司的一下說明:
就這些資料我們就可以對其進行分析可視化,獲得資料背後隐藏的秘密
資料爬取部分的代碼如下所示:
import requests
from bs4 import BeautifulSoup
import os.path
import json
import os
import csv
import io
import sys
import jieba
import wordcloud
import traceback
import cgitb
#要加上這一句和import 否則後續一直會報'gbk'的錯誤
sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')#'gb18030'
class shixi():
#發爬蟲機制,加Headers,異常處理URLError類,用try-except語句來包圍并捕獲相應的異常
def get_html(self,url):
try:
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36'}#僞裝爬蟲
resp = requests.get(url, headers = headers)
return resp.text
except:
print ('url is wrong') #異常後輸出語句
#将爬取資訊存入CSV操作
def dict2cvs(self,dic,filename):
file_exists=os.path.isfile(filename)
#a通路方式為追加,newline=''是為了防止寫入的檔案總有空行的問題
with open(filename,'a',encoding='utf-8',newline='') as f:
headers=dic.keys()
w =csv.DictWriter(f,delimiter=',', lineterminator='\n', fieldnames=headers)
if not file_exists :
w.writeheader()
#writerow()逐行寫入,writerrow()是多行寫入
w.writerow(dic)
print('目前行寫入csv成功!')
#爬取職位資訊頁面
def draw_base_list(self,url):
html = self.get_html(url)
##json.loads 實作json字元串轉化為python的資料類型
data = json.loads(html)
try:
#json的文法 "[]"疊代器标示(可以在裡邊做簡單的疊代操作,如數組下标,根據内容選值等)這樣就将lists選擇出來
news = data['data']['lists']
for n in news:
jobid=n['jobid']
#二級頁面的URL,這個網址就用來爬取職位描述,因為這一部分是靜态的
url2='https://www.ciwei.net/internship/job/'+str(jobid)
#這個網址是用來爬其他職位的網址,這是一個動态的,是以雖然和上面都在一個網頁,但是網址不一樣
company_id=n['company_id']
url3='https://www.ciwei.net/api/Shixi_V2_Job/getJobByCid?page=1&pageSize=10&company_id='+str(company_id)
title = n['title']
comfullname = n['comfullname']
comname = n['comname']
cityName = n['cityName']
education = n['education']
salary = n['salary']
fulltime_type_string = n['fulltime_type_string']
label= n['label']
dat2={
'city':cityName
}
self.dict2cvs(dat2,'城市資訊.csv')
self.draw_detail_list(url2,url3,jobid,title,comname,cityName,education,salary,fulltime_type_string,label)
except Exception as e:
# except Exception,e:#這樣會報錯,SyntaxError: invalid syntax,因為except Exception, e: 這個文法需要用python2版本去運作,我們使用的是python3。是以要換成except Exception as e:
print(repr(e))
print('draw_base_list is wrong')
pass
#爬取二級詳情頁
def draw_detail_list(self,url,url1,jobid,title,comname,cityName,education,salary,fulltime_type_string,label):
# def draw_detail_list(self,url):
#職位描述部分
html = self.get_html(url)
soup=BeautifulSoup(html,'lxml')
#爬取職位描述的部分
try:
lilist=soup.find('ul',{'class':'job-desc___3cBCa'})
l=lilist.find_all('span')
l2=lilist.find_all('h5')#是ResultSet類型不能寫'.text'# print(type(l[0]))可疊代 類型Tag 就可以寫'.text'
s=''
s4=''
for i in range(len(lilist)):
s=l2[i].text.strip()+l[i].text.strip()+'\n'+'\n'
s4=s4+s
#爬取其他職位部分,因為是動态網頁,是以要重新用json解析一下
html1 = self.get_html(url1)
data1 = json.loads(html1)
news1 = data1['data']['jobList']
t=''
for n in news1:
tit=n['title']+'\n'
t=tit+t
print(t)
dat={
'jobid':jobid,
'工作名稱':title,
'公司名稱':comname,
'城市':cityName,
'要求學曆':education,
'工資':salary,
'實習時間':fulltime_type_string,
'職位描述':s4,
'其他職位':t,
'說明':label
}
dat1={
'職位描述':s4,
}
#将資訊存入CSV檔案
self.dict2cvs(dat1,'職位描述.csv')
self.dict2cvs(dat,'所有資訊.csv')
#捕捉異常并輸出錯誤資訊
except Exception as e:
print(repr(e))
print('draw_detail_list is wrong')
pass
s=shixi()
if __name__ == '__main__':
print('爬取實習吧')
for page in range(1,12):
url='https://www.ciwei.net/api/Shixi_Pc/search?city=0&getCount=1&key=Python&s_c=1&page='+str(page)+'&source=pc'
print(url)
s.draw_base_list(url)
pass
資料處理
爬取後儲存在CSV檔案中的樣式就是如最上面那個圖一樣,然後我們就對這些資料來進行處理,因為不是所有的資料都是有用的,我們可以選擇性的對資料先處理一遍,使之成為我們需要的東西,在對資料進行可視化分析
對資料處理使用的是jupyter notebook。
讀取檔案
import pandas as pd
import random
import ipywidgets as widegts
data=pd.read_csv(r'C:\Users\DELL\Desktop\Python\答辯\所有資訊.csv',encoding='utf8')
data
删除無意義列
檔案存儲裡的jobid列是網頁擷取時的一個關鍵id,根據jobid我們就可以構造網頁進而進行後續的爬取,但是對于我們現在的有關招聘資訊的資料分析來說是沒有意義的,是以我們就将其删除掉。對于其他職位來列來說也是,因為我們是分析跟python有關的這些招聘資訊,是以對于這個公司還招聘的其他職位我們目前不做分析,也就将這一行删除掉
删除使用的是drop()方法;最後就留下了工作名稱、公司名稱、城市、要求學曆、工資、實習時間、職位描述、說明這幾列資料
#删除jobid和其他職位列
data=data.drop(columns=["jobid","其他職位"])#這兩種都是删除列的方法
data
删除重複的值
因為有些公司可能釋出重複的招聘資訊,是以将職位名稱和公司名稱相同的招聘資訊删除掉
運用data.duplicated(subset=[])方法,首先查詢一共有多少個重複的行,得到的結果是有19行是重複的資料
#檢查是否有重複的行
duplicated_data=data.duplicated(subset=['工作名稱','公司名稱'])
data=data[duplicated_data]
len(data)
#19
然後就将重複的行删除掉,一共有109行把重複的19行删除掉那麼就剩下90行資料
# 删除掉重複的行,隻保留最開始出現的
data.drop_duplicates(subset=['工作名稱','公司名稱'], keep='first', inplace=True)
data
len(data)
#90
資料可視化
工資資訊可視化
對于工資,各個公司提供的工資表示範圍不完全不同,有些是以天為機關,有些是以月為機關,有些是面議,故不能直接比較大小判斷工資水準,是以我選擇了餅圖來展示,對所有出現了的工資情況總體畫一個餅圖,根據工資的占比情況來分析各個公司的招聘工資情況
首先是将所有的工資情況和每個工資出現了多少次計算出來生成data2
data1=data.drop_duplicates(subset=['工資'])
data2=pd.DataFrame(data1['工資'],columns=['工資'])
data2['工資數']=[len(data[data['工資']=='200-300元/天']),len(data[data['工資']=='120-180元/天']),
len(data[data['工資']=='150-200元/天']),len(data[data['工資']=='150-300元/天']),
len(data[data['工資']=='面議']),len(data[data['工資']=='300-500元/天']),
len(data[data['工資']=='100-180元/天']),len(data[data['工資']=='100-150元/天']),
len(data[data['工資']=='1-2K/月']),len(data[data['工資']=='2-4K/月']),
len(data[data['工資']=='4-6K/月']),len(data[data['工資']=='60-100元/天'])]
data2
一共有12種薪資情況,再根據次數畫出餅圖如下:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
#解決漢字亂碼問題
matplotlib.rcParams['font.sans-serif']=['SimHei'] #使用指定的漢字字型類型(此處為黑體)
plt.figure(figsize=(6,6))
label=data2['工資'].values.tolist()
explode=[0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01]
plt.pie(x=data2['工資數'].values.tolist(),explode=explode,labels=label,autopct='%1.1f%%')
plt.title('工資分布情況')
plt.savefig('餅圖.png')
plt.show()
注意一點如果在圖中是有漢字的話,要對編碼進行處理,否則漢字是顯示不出來的,例如matplotlib.rcParams[‘font.sans-serif’]=[‘SimHei’]這個就是将指定漢字為黑體
折線圖:
# 定義畫圖的資料
x = data2.工資
y = data2.工資數
# 定義顔色
color1 = '#0085c3'
color2 = '#7ab800'
color3 = '#dc5034'
# 設定圖像大小
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111)
# 繪制折線圖
ax.plot(x, y, marker='o', color=color1)
150-200元/天換算過來即為4500-6000/月,是以可以看出工資占比4-6K/月是占比最多的,剩下200-300元/天即6-9K/月
的工資也比其他占比大一些,由圖也可以看出面議的占比也不算少數,是以也會有較多公司選擇面議的方式來決定工資,
也就是取決于個人的水準了
城市資訊可視化
一樣的先統計所有招聘資訊出現的城市,并且統計次數
data1=data.drop_duplicates(subset=['城市'])
data2=pd.DataFrame(data1['城市'],columns=['城市'])
data2['城市數']=[len(data[data['城市']=='上海']),len(data[data['城市']=='深圳']),len(data[data['城市']=='杭州']),len(data[data['城市']=='北京']),
len(data[data['城市']=='廣州']),len(data[data['城市']=='無錫']),len(data[data['城市']=='廈門']),len(data[data['城市']=='武漢']),
len(data[data['城市']=='南京']),len(data[data['城市']=='沈陽']),len(data[data['城市']=='長沙']),len(data[data['城市']=='大連']),
len(data[data['城市']=='西安']),len(data[data['城市']=='成都'])]
data2
得到的結果:
将這些情況畫成柱狀圖
plt.rcParams['figure.figsize']=[13,8]#這是這個表的大小
lable=data2['城市'].values.tolist()#刻度标簽
plt.bar(range(14),data2['城市數'].values.tolist(),width=0.5)#14根柱子,對應值,寬度
#下面兩個是x軸,y軸的表是的是啥
plt.ylabel('城市數',fontsize=15)
plt.xlabel("城市",fontsize=15)
#每一個柱子代表的城市
plt.xticks(range(14),lable)
plt.title('招聘城市情況')
plt.show()
畫成散點圖:
折線圖:
# 定義畫圖的資料
x = data2.城市
y = data2.城市數
# 定義顔色
color1 = '#0085c3'
color2 = '#7ab800'
color3 = '#dc5034'
# 設定圖像大小
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111)
# 繪制折線圖
ax.plot(x, y, marker='o', color=color1)
清楚的可以看到對于python相關職業的招聘,北上廣這樣的大城市是更多的。尤其是北京,是以如果想找
有關與python方面的工作的話,北上廣是不錯的選擇,其次就是武漢、深圳、南京這三個城市,就業機會
也相對多一點。有想從事這方面的工作的夥伴們,這幾個城市是不錯的選擇呀。
同時對與城市資訊也可用詞雲圖來分析,在爬取的時候就順便将城市資訊單獨儲存了一個CSV檔案,是以直接讀取檔案生成詞雲即可
f=open('C:/Users/DELL/Desktop/Python/答辯/城市資訊.csv',encoding='utf-8')
t=f.read()
f.close()
l=jieba.lcut(t)
string=' '.join(l)
w=wordcloud.WordCloud(background_color='white',font_path='C:/Windows/Fonts/STKAITI.TTF',width=1000,height=900,)#font_path是字型,
w.generate(string)#向wordcloud對象w中加載文本txt
w.to_file(r"城市.png")#将詞雲輸出為圖像檔案
圖檔生成如下
由詞雲圖檔看到的資訊也跟上面的柱狀圖是一樣的。北京是就業機會最多的。其次是上海、廣州,在就是深圳、武漢、南京。
是以想要從事這方面的夥伴們也要沖沖沖。北上廣機會多,但是挑戰也多。是以還是要豐富自己了才能找到好的工作。
實習時間資訊可視化
先對實習時間總體做一個統計,得到這樣一個結果
然後将其畫成餅圖
plt.figure(figsize=(6,6))
label=data2['實習時間'].values.tolist()
explode=[0.01,0.01,0.01]
plt.pie(x=data2['實習時間數'].values.tolist(),explode=explode,labels=label,autopct='%1.1f%%')
plt.title('實習時間分布情況')
plt.show()
結果如下
由圖我們可以看出,對于所有的招聘,實習時間都是要求至少3或4或5天,對于要求至少4天、5天的公司占多數
把實習時間和城市做一個撒點圖來看一下之間的關系:
得到的圖就如下所示:
同樣的,通過散點圖也可以看到選擇實習至少4天和5天的公司占大多數。選擇三天的城市都比較少了。通俗來說一般實習
公司還是希望你能實習久一點,那些幹幾天就放棄的人公司一般來說是不會喜歡的。
Jieba分詞對職位描述可視化
首先我們來對Jieba做一個簡單的介紹
(1) jieba庫概述:jieba是優秀的中文分詞第三方庫
- 中文文本需要通過分詞獲得單個的詞語
- jieba是優秀的中文分詞第三方庫,需要額外安裝
- jieba庫提供三種分詞模式,最簡單隻需掌握一個函數
(2) jieba分詞的原理: Jieba分詞依靠中文詞庫
- 利用一個中文詞庫,确定漢字之間的關聯機率
- 漢字間機率大的組成詞組,形成分詞結果
- 除了分詞,使用者還可以添加自定義的詞組
(3) jieba分詞的三種模式:精确模式、全模式、搜尋引擎模式
- 精确模式:把文本精确的切分開,不存在備援單詞
- 全模式:把文本中所有可能的詞語都掃描出來,有備援
- 搜尋引擎模式:在精确模式基礎上,對長詞再次切
(4) jieba庫常用函數
注意到有.cut()和.lcut()這兩種方法。lcut()就是傳回的清單類型,對于我們後續在進行一下操作來說會更加友善一點。
在本文就是用的就是Jieba._lcut(a)進行分詞。在進行分詞時由于需要分詞的句子或者段落中包含一些語氣助詞、副詞、介詞、連接配接詞等通常自身并無明确意義卻大量存在的詞語,如的、在、于是、是以、一般、無論等等之類的詞語,稱之為停用詞,需要在分詞的時候将這些停用詞處理掉。本文在進行分詞處理的時候也将句子進行了去停用詞的處理。同時在這些招聘資訊上經過反複的提取檢視也發現了很多在句子中沒有實際意義且還頻繁出現的詞語,例如具有、深入、熟悉、良好、較好、使用、描述、獲得、職位、任職等詞語。這些無意義的都添加進入停用詞表。
然後通過stopwords = [line.strip() for line in open(‘C:/Users/DELL/Desktop/stopwords.txt’,encoding=‘UTF-8’).readlines()]這樣去除停用詞。
在分詞的時候還需要添加自定義的詞表以便包含 Jieba 詞庫裡沒有的詞,像開源架構、設計模式、MySQL、RTOS、GitHub、GitLab、DevOps、Linux、shell、STM32、大資料等一些不希望在分詞的時候被分隔開,是以将這些詞語添加到自定義詞表中去,再通過 jieba.load_userdict(“C:/Users/DELL/Desktop/自定義.txt”)加載自定義詞表。這樣在進行分詞的時候就不會将這些詞語分開,雖然 Jieba 有新詞識别能力,但是自行添加新詞可以得到更好的分詞效果。
這是我整理好的停用詞表和自定義檔案:連結(百度網盤):https://pan.baidu.com/s/12Lkb7kLahKm8h_ilnAXmhQ
提取碼:k9xh
有需要的可以自取。這個停用詞表也是參考了其他人已經做好的。後續根據需要在自行添加了一些。
這是這一部分的完整代碼,職位描述已經提前儲存好到CSV檔案中。
import jieba
import wordcloud
from jieba import load_userdict
jieba.load_userdict("C:/Users/DELL/Desktop/自定義.txt")#載入自定義詞典:每一行包括詞語、詞頻(可省略)、詞性(可省略)
import jieba.posseg as pseg
# 建立停用詞清單
def stopwordslist():
stopwords = [line.strip() for line in open('C:/Users/DELL/Desktop/stopwords.txt',encoding='UTF-8').readlines()]
return stopwords
f1=open('C:/Users/DELL/Desktop/Python/答辯/職位描述.csv',encoding='utf-8')
t1=f1.read()
stopwords = stopwordslist()
l1=jieba.lcut(t1)
outstr = ''
for word in l1:
print(word)
print('------------')
for word in l1:
if word not in stopwords:
if word != '\t':
outstr += word
outstr += " "
w1=wordcloud.WordCloud(background_color='white',font_path='C:/Windows/Fonts/STKAITI.TTF',width=1200,height=1200,)#font_path是字型,
w1.generate(outstr)
w1.to_file(r"職位描述1.png")
得到的詞雲圖檔為:
我們來仔細看一下這個詞雲圖檔,Python當然是重中之重,既然是要找有關與python的工作。那麼python的技術一定要過硬
再來看其他幾個醒目的單詞有維護、溝通、設計、資料分析、程式設計、大學以上學曆、強、Linux等這些。說明找工作首先還是要自身本領過硬,同時工作更多的還是一個團隊合作的事情,溝通能力等也是要較好的。
是以說要想找到好的工作我們還是要自身本領強硬,隻有身上有本領就不會愁沒飯吃
對于公司的說明詞雲可視化
還是按照上述一樣的方法運用停用表和自定義詞表來生成詞雲圖檔。
得到的結果如下圖所示:
可以看到,對于大多數公司來說招攬人才都會選擇有職業發展機會有更高的發揮空間、有助于職業幫助的這樣語句。
因為對于招聘的人們來說,這些才是更有助于職業道路後續發展的“真材實料”,是以大多數公司都會給出這樣的招聘資訊。
當然在真正招聘的時候不能隻是看這些,還是要對公司進行一個更全面的了解再做打算
總結
對于實習吧招聘網站的資訊分析可視化就到此告一段落。
總的來說,現在是一個大資料時代,對于計算機方面的工作充滿機遇與挑戰。
越來越多的人投身入計算機行業,就上述的各個招聘資訊可視化來看可以知道,對于像北上廣那樣的大城市,對于這方面的工作就會相對多一些,從工資資訊可視化來看有關Python相關的職業的工資也是較為可觀的。當然通過招聘資訊的職位描述可視化能更清晰明了的知道現在的市場需要什麼樣的人才,首先一定是自身有關python方面的本領過硬,其次很多項目都是團隊合作的,對于團隊相處有優勢的人群也會更容易受到青睐,總的來說隻要我們自身的本領過硬,那麼在面對就業時也能相對輕松很多。
對于向我們這些即将畢業即将走入社會走進職場的學子們來說,通過這樣的可視化可以直覺的看到很多我們想要知道的資訊,能知道市場需要什麼樣的人才,我們也能相應的根據這些内容來提升自己、來豐富自己,讓自己能在走入社會的時候不那麼迷茫,多一份籌碼。其實還是一句老話,隻有身上有真本事就不怕沒飯吃。隻要我們踏踏實實的勤勞的工作,我相信一定會有更美好的未來。隻有自身的本領強悍,才能讓别人折服,才能找到理想的工作。
同時這可視化不僅僅能讓求職者得到很多資訊,對于招聘者來說,通過這些可視化,也能知道求職市場大部分都是怎麼進行招聘的,那麼自己的公司有什麼樣的方面能更受到求職者的青睐怎麼能招聘到更優秀的求職者呢。這些都可以通過可視化看到,比如說從薪資方面、從公司福利方面等。都有可以改進以期找到更多更優秀求職者的東西。
隻有不停學習不停進步才不會被社會淘汰,一起努力的小夥伴們沖沖沖!
本文還有很多不足,如果有什麼錯誤和遺漏,歡迎到評論區一起讨論呀。創作不易、小豬歎氣,如果喜歡我的文章就點贊評論留下痕迹吧。嘿嘿嘿