爬蟲:用Python爬取招聘職位資訊&職位需求分析
用Python爬取智聯招聘網站“資料分析”相關崗位資訊
# _*_ coding: utf-8 _*_
from bs4 import BeautifulSoup
import requests
import csv
import json
import pandas as pd
import numpy as np
#定義函式:請求下載頁面原始碼
def download(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}
req=requests.get(url,headers=headers)
return req.text
#定義函式:解析網頁內容,抓取職位資訊
def get_content(html):
soup=BeautifulSoup(html,'lxml')
body=soup.body
data_main=body.find('div',{'class':'newlist_list_content'})#找div標籤的特定屬性
tables=data_main.find_all('table')
zw_list=[]
for i,table in enumerate(tables):
if i==0:
continue
temp=[]
tbs=table.find('tr').find_all('td')#find_all形成的是list
zwmc=tbs[0].find('a').get_text()
gsmc=tbs[2].find('a').get_text()
zwyx=tbs[3].get_text()
gzdd=tbs[4].get_text()
bt_brief=table.find('tr',{'class':'newlist_tr_detail'})
brief=bt_brief.find('li' ,{'class':'newlist_deatil_two'}).get_text()
temp.append(zwmc)
temp.append(gsmc)
temp.append(zwyx)
temp.append(gzdd)
temp.append(xl)
zw_list.append(temp)
return zw_list
#根據智聯招聘URL的特性,使用上述函式迴圈抓取前10頁面
basic_url='http://sou.zhaopin.com/jobs/searchresult.ashx?jl=北京&kw=資料分析&isadv=2&p='#地址一定要寫對好不啦
dataji=[]
for i in range(10):
num=i+1
url=basic_url+str(num)
html=download(url)
print html
data=get_content(html)
dataji.extend(data)#將一個list全部元素新增到另一個list中
#轉換列印格式
datajson=json.dumps(dataji,ensure_ascii=False)#python中包含在列表或字典中的漢字自動以unicode形式輸出,所以需要轉換,type也變了
print datajson
#更改陣列的欄目名稱
datas=pd.DataFrame(dataji,columns=['positionName','companyShortName','salary','city','education'])#將list轉為資料框格式
#生成excel檔案到本地
data=datas.to_excel('D://shujv1.xls')#藉助dataframe的方法匯出excel檔案
生成的excel資料中的“education”欄位資訊過多,不止學歷,需要從中摘取學歷的部分,學歷雖有空值,但都是2個字,所以學歷在excel中可以用以下方法提取:=MID(單元格編號,FIND(“學歷”,單元格編號)+3,2)
資料分析崗位分析&視覺化:
df=pd.read_csv('D://DataAnalyst.csv',encoding='gb2312')
#定義工資上限、工資下限
def cutword(word,method):
position=word.find('-')
lenth=len(word)
if position!= -1:
bottomsalary=word[:position-1]#切片右邊的不是閉合的,所以不包含右邊
topsalary=word[position+1:lenth-1]
else:
bottomsalary=word[:word.upper().find('K')]
topsalary=bottomsalary
if method=='bottom': #無論是'bottom'或‘top’都是自己設定的第二個引數,在呼叫函式的時候選擇其一就好
return bottomsalary
else:
return topsalary
#計算工資上限、工資下限
df_duplicates['topsalary']=df_duplicates.salary.apply(cutword,method='top')
df_duplicates['bottomsalary']=df_duplicates.salary.apply(cutword,method='bottom')
df_duplicates.topsalary=df_duplicates.topsalary.astype('int')
df_duplicates.bottomsalary=df_duplicates.bottomsalary.astype('int')
#計算平均工資
df_duplicates['avgsalary']=df_duplicates.apply(lambda x:(x.bottomsalary+x.topsalary)/2,axis=1) #axis=1表示將函式用在行
df_clean=df_duplicates[['city','companyShortName','companySize','education','positionName','positionLables','avgsalary','workYear']]#都是方括號
df_clean.head()#檢視前五條資料
df_clean.city.value_counts()
#value_counts是計數,統計所有非零元素的個數,以降序的方式輸出Series count是所有非零或零都統計
資料分析方面招聘最多的是北京、上海、深圳、杭州、廣州等一線城市地區。
df_clean.avgsalary.describe()
全國資料分析職位的平均工資為16.898231k,波動在上下9k,差異較大,最高為75k,最低為1k。
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')#R語言中的ggplot2配色作為繪圖風格,純粹為了好看
df_clean.avgsalary.hist()
全國資料分析職位的平均工資主要集中在10-20k左右,10k一下也較多。
df_clean.avgsalary.hist(bins=20)#pandas封裝過的方法作圖
上面的柱狀圖的間隔太大(分為10個區間),不能凸顯平均工資的分佈細節,改進之後,分為20個取值區間,可以看出除了5-15k左右有工資高峰之外,在20k也有取值高峰,大於30k的工資就很少了。
df_clean.boxplot(column='avgsalary',by='city',figsize=(9,7))#matplotlib 中文字型顯示為白框的時候 可以通過設定配置檔案裡的字型,改成微軟雅黑
不同地區工資的箱線圖可以看出,北京的工資全國領先,其次是上海、深圳和杭州,這四個地區的前1/4工資有達到20k,並且上限很高,當地的工資的差異也很大。
df_clean.boxplot(column='avgsalary',by='education',figsize=(9,9))
博士學歷的平均工資高於其它學歷,且最低工資相對其它學歷來說也較高,碩士和本科的學歷工資水平高於大專的學歷。
df_clean.sort_values("workYear")
df_clean.boxplot(column='avgsalary',by='workYear',figsize=(9,7))
資料分析職位很看重工作經驗,隨著工作年限增長,工資水平逐漸提高,10年以上的資料分析師平均工資達30k左右,而應屆生出來,工資一般為小於10k,也有少數大於10k。
df_bj_sh=df_clean[df_clean['city'].isin([u'上海',u'北京'])] #輸入中文執行錯誤,因為是py2.7版本,不是py3.所以需要將中文表示成u"中文"
df_bj_sh.boxplot(column='avgsalary',by=['education','city'],figsize=(9,7))
工資水平最高的上海和北京資料分析師工資對比,發現,無論什麼學歷,北京的待遇還是總體要高於上海,尤其是博士學位,北京的最低工資要高於上海的雖高工資,說明帝都人才十分重視,尤其是高學歷的博士。
df_clean.groupby('companyShortName').avgsalary.agg(['count','mean']).sort_values(by='count',ascending=False)
對該崗位需求最高的企業前5名是美團、滴滴、百度、網易和今日頭條,都是網際網路大公司,說明企業規模越大,對於資料分析的需求越高。
def topN(df,n=5):#先計數,後排序
df_con=df.value_counts()
return df_con.sort_values(ascending=False)[:5]
df_clean.groupby('city').companyShortName.apply(topN)
這裡展示了每個城市招聘資料分析師最多的公司前5名。
df_clean.groupby('city').positionName.apply(topN)
資料分析有不同的側重崗位,這裡展示了每個城市具體需要資料分析哪些崗位的排名。高階資料分析師排名都比較靠後,說明目前我國各地區對資料分析師的需求還處於比較基礎的前期發展階段。
以上為較簡單的頁面抓取程式碼,之後可以嘗試以下不同的情況:
- 比較不同招聘網頁的爬取特徵,拉勾、智聯、等;
- 併發抓取;