上一篇介紹了職友集職位數(shù)據(jù)的網(wǎng)頁(yè)源碼文件的爬取辣苏,得到了170個(gè)網(wǎng)頁(yè)。
這篇文章將介紹如何從網(wǎng)頁(yè)數(shù)據(jù)中解析數(shù)據(jù)摧茴,并進(jìn)行可視化展示绵载。
從文件夾中讀取數(shù)據(jù)
#讀取所有文件列表
import os
keyw='python'
files=os.listdir('/Users/zhyuzh/Desktop/Jupyter/tutor/jobui/{}/'.format(keyw))
#files=os.listdir(r'C:\user\...\{}'.format(keyw)) #win下注意用r轉(zhuǎn)義,不要用斜杠結(jié)尾
files
files的結(jié)果大致如下:
讀取一個(gè)文件提取職位數(shù)據(jù)苛白,轉(zhuǎn)化為dict字段
readjob函數(shù)接收一個(gè)fname參數(shù)尘分,就是上面files列表的單個(gè)元素。
讀取html文件數(shù)據(jù)丸氛,用BeautifulSoup解析培愁,提取職位標(biāo)題title、城市city缓窜、pay薪資定续,details詳情等信息,并把薪資拆分為起薪pay_low和上限pay_hig兩個(gè)數(shù)值禾锤。
注意這里使用了find私股、find_all、contents恩掷、text等方法
函數(shù)最后返回整個(gè)job的字典對(duì)象倡鲸。
#讀取一個(gè)文件,返回一個(gè)job字典
from bs4 import BeautifulSoup
def readjob(fname):
with open('./jobui/{}/{}'.format(keyw,fname),'r') as f: #'r'在win下改為‘rb',byte
html=f.read()
#html=html.decode('utf-8') #win下打開(kāi)此行
soup=BeautifulSoup(html)
jobtag=soup.find('div','jk-box jk-matter j-job-detail')
title=jobtag.find('h1',{'title':True}).text
city=jobtag.find('ul').find_all('li')[0].contents[1]
pay=jobtag.find('span','fs16 fwb f60').text
pay_li=pay.replace('¥','').split('-')
pay_low=pay_li[0].strip()
pay_hig=pay_li[0].strip() if len(pay_li)>1 else pay_low
details=jobtag.find('div','hasVist cfix sbox fs16').text.strip()
job={
'title':title,
'city':city,
'pay_low':pay_low,
'pay_hig':pay_hig,
'details':details
}
return job
將所有文件轉(zhuǎn)為job字典黄娘,并放入jobs_all列表
注意由于原本職友集網(wǎng)站的職位列表頁(yè)面就有一些第三方廣告的招聘職位峭状,這樣職位的鏈接link也之前被我們存儲(chǔ)到了文件夾中,但實(shí)際上這些第三方的頁(yè)面完全與職友集標(biāo)準(zhǔn)的職位詳情頁(yè)面不同逼争,我們的readjob函數(shù)也無(wú)法解析优床,所以使用try...except...
方法避免因?yàn)槌鲥e(cuò)而終止。
jobs_all=[]
for file in files:
try:
job=readjob(file)
jobs_all.append(job)
except:
print('Err:',file)
print('OK!')
這時(shí)候所有職位信息都已經(jīng)放入jobs_all列表誓焦,共有上百個(gè)元素胆敞,它看起來(lái)這樣:
從jobs_all統(tǒng)計(jì)城市分布
#統(tǒng)計(jì)城市
cityjobs={}
for job in jobs_all:
city=job['city']
city=city.split('-')[0]
if city in cityjobs:
cityjobs[city]+=1
else:
cityjobs[city]=1
cityjobs
cityjobs看起來(lái)這樣:
使用plotly畫圖表
使用Anaconda的prompt工具,輸入命令conda install plotly
安裝plotly杂伟。
柱狀圖
import plotly.offline as py
import plotly.graph_objs as go
py.init_notebook_mode()
citydata=go.Bar(
x=[key for key in cityjobs],
y=[cityjobs[k] for k in cityjobs]
)
f = go.FigureWidget([citydata])
f
生成圖如下:
餅狀圖
citydata_pie=go.Pie(
labels=[key for key in cityjobs],
values=[cityjobs[k] for k in cityjobs]
)
f = go.FigureWidget([citydata_pie])
f
生成圖如下:
使用結(jié)巴切詞
使用Anaconda的prompt工具移层,輸入命令conda install -c conda-forge jieba
安裝jieba中英文分詞工具。
import jieba
text=' '.join([job['details'].replace('\n','') for job in jobs_all])
seg_list = jieba.cut(text, cut_all=False)
' ' .join(seg_list)
輸出的切詞結(jié)果如下:
使用正則表達(dá)式過(guò)濾掉中文:
import re
pattern = re.compile(r'^[a-zA-Z0-1]+$')
words = [w for w in seg_list if pattern.match(w)]
cuted = ' '.join(words)
print(cuted)
輸出結(jié)果如下:
使用wordcloud生成詞云
使用Anaconda的prompt工具赫粥,輸入命令conda install -c conda-forge wordcloud
安裝詞云工具观话。
需要下載字體文件并放到代碼文件一起,思源中文字體,點(diǎn)擊可以直接下載使用
from wordcloud import WordCloud
fontpath = 'SourceHanSansCN-Regular.otf'
wc = WordCloud(
max_font_size=500,
min_font_size=20,
width=1600, #圖像寬度
height=1200, #圖像高度
font_path=fontpath, #字體文件要放在和代碼一起
background_color='white',
collocations=False,
margin=20
)
wc.generate(cuted)
使用Matplotlib顯示圖片:
import matplotlib.pyplot as plt
plt.figure(dpi=120)
plt.imshow(wc, interpolation="bilinear")
plt.axis('off')
最后輸出結(jié)果:
關(guān)于pay薪資的數(shù)據(jù)處理
因?yàn)樾劫Y可能是4000~6000
傅是,也可能是4k~6k
或者1.2~2.4萬(wàn)/月
之類匪燕,所以要進(jìn)行處理蕾羊,根據(jù)實(shí)際需要可能有不同喧笔,下面代碼僅供參考:
import re
jobs=[{'pay_low':'1.2','pay_hig':'1.5萬(wàn)/月'},{'pay_low':'4.5','pay_hig':'6k'}]
for job in jobs:
if job['pay_hig'].find('萬(wàn)')!=-1:#包含萬(wàn)
job['pay_hig']=re.compile('[0-9\.]+').findall(job['pay_hig'])[0] #提取數(shù)字和小數(shù)點(diǎn)
job['pay_hig']=str(int(float(job['pay_hig'])*10000))
job['pay_low']=str(int(float(job['pay_low'])*10000))
if job['pay_hig'].find('k')!=-1 or job['pay_hig'].find('千')!=-1:#包含千
job['pay_hig']=re.compile('[0-9\.]+').findall(job['pay_hig'])[0] #提取數(shù)字和小數(shù)點(diǎn)
job['pay_hig']=str(int(float(job['pay_hig'])*1000))
job['pay_low']=str(int(float(job['pay_low'])*1000))
jobs
輸出:
幾點(diǎn)說(shuō)明:
-
'1.3萬(wàn)/月'.find('萬(wàn)')
返回3帽驯,即第三個(gè)位置找到萬(wàn)
字,如果找不到就返回-1 -
re.compile('[0-9\.]+').findall('1.3萬(wàn)/月')
可以得到['1.3']
书闸。 -
str(int(float('1.3')*1000))
得到字符串'1300'
每個(gè)人的智能新時(shí)代
如果您發(fā)現(xiàn)文章錯(cuò)誤,請(qǐng)不吝留言指正浆劲;
如果您覺(jué)得有用嫌术,請(qǐng)點(diǎn)喜歡;
如果您覺(jué)得很有用牌借,歡迎轉(zhuǎn)載~
END