爬取拉鉤崗位信息生成圖表和詞雲

1.環境準備

py版本:python3.6.7python

須要使用的包列表文件: requirements.txtjson

certifi==2018.10.15
chardet==3.0.4
cycler==0.10.0
idna==2.7
jieba==0.39
kiwisolver==1.0.1
matplotlib==3.0.1
numpy==1.15.4
pandas==0.23.4
Pillow==5.3.0
pyparsing==2.3.0
python-dateutil==2.7.5
pytz==2018.7
requests==2.20.1
scipy==1.1.0
six==1.11.0
urllib3==1.24.1
wordcloud==1.5.0

製做詞雲的圖片一張:cloud.jpgwindows

建立一個目錄:JobPostion 用來存放爬取的csv文件格式的數據緩存

用來解決詞雲中的亂碼的字體文件   Arial Unicode MS.ttfapp

2.爬取拉勾數據代碼 

#!/usr/bin/python
# -*- coding: utf-8 -*-
# @Time    : 2018/11/16/016 21:44
# @Author  : BenjaminYang
# @FileName: lagou.py
# @Software: PyCharm
# @Blog    :http://cnblogs.com/benjamin77

import requests
import math
import time
import pandas as pd

def get_json(url, num):
   '''從網頁獲取JSON,使用POST請求,加上頭部信息'''
   headers = {
       'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
       'Host': 'www.lagou.com',
       'Referer':'https://www.lagou.com/jobs/list_python%E5%BC%80%E5%8F%91?labelWords=&;fromSearch=true&suginput=',
       'X-Anit-Forge-Code': '0',
       'X-Anit-Forge-Token': 'None',
      'X-Requested-With': 'XMLHttpRequest'
   }


   data = {
       'first': 'true',
       'pn': num,
       'kd': '運維工程師'}
   res = requests.post(url, headers=headers, data=data)
   res.raise_for_status()
   res.encoding = 'utf-8'
   # 獲得包含職位信息的字典
   page = res.json()
   return page

def get_page_num(count):
    '''經過崗位總數與除以每頁顯示數15,若是超過17頁就顯示17頁,不超過就顯示計算的頁數'''
    res=math.ceil(count/15)
    if res >17:
        return 17
    else:
        return res

def get_page_info(jobs_list):
    page_info_list = []
    for i in jobs_list:
        job_info = []
        job_info.append(i['companyFullName'])        # 公司全名
        job_info.append(i['companyShortName'])       # 公司簡稱
        job_info.append(i['companySize'])             # 公司規模
        job_info.append(i['financeStage'])            # 融資階段
        job_info.append(i['district'])                 # 區域
        job_info.append(i['positionName'])            # 職位名稱
        job_info.append(i['workYear'])                 # 工做經驗
        job_info.append(i['education'])                # 學歷要求
        job_info.append(i['salary'])                   # 工資
        job_info.append(i['positionAdvantage'])       # 職位福利
        page_info_list.append(job_info)
    return page_info_list


if __name__=='__main__':
    url='https://www.lagou.com/jobs/positionAjax.json?city=%E6%9D%AD%E5%B7%9E&needAddtionalResult=false'
    page_one=get_json(url,1)#獲取一頁的json數據
    total_count=page_one['content']['positionResult']['totalCount']#崗位總數
    num=get_page_num(total_count)#當前總頁數
    print('職位總數:{},當前總頁數:{}'.format(total_count,num))
    time.sleep(20)
    print(page_one)

    total_info=[]
    for n in range(1,num+1):#獲取每一頁的json數據
        page =get_json(url,n)
        jobs_list=page_one['content']['positionResult']['result']
        page_info=get_page_info(jobs_list)
        total_info+=page_info
        time.sleep(30)
    df=pd.DataFrame(data=total_info,columns=['公司全名','公司簡稱','公司規模','融資階段','區域','職位名稱','工做經驗','學歷要求','工資','職位福利'])
    df.to_csv('./JobPosition/運維工程師.csv',index=False)
    print('已保存csv文件')

執行完會在 JobPostion目錄下生成一個 csv文件運維

3.繪圖代碼

#!/usr/bin/python
# -*- coding: utf-8 -*-
# @Time    : 2018/11/17/017 13:39
# @Author  : BenjaminYang
# @FileName: data_analysis.py
# @Software: PyCharm
# @Blog    :http://cnblogs.com/benjamin77

import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from scipy.misc import imread
import jieba
from pylab import mpl


#設置字體樣式
mpl.rcParams['font.family']='sans-serif'
mpl.rcParams['font.sans-serif']='simhei'

# 1.計算薪資,生成直方圖,25%
def get_salary_chart(df):
    df['salary']=df['工資'].str.findall('\d+')
    avg_salary=[]
    for k in df['salary']:
        int_list=[int(n) for n in k]
        # 10k-16k  正常要工資是 10+(16-10)/4=11.5
        avg_wage=int_list[0]+(int_list[1]-int_list[0])/4
        avg_salary.append(avg_wage)
    df['月工資']=avg_salary
    df.to_csv('draft.csv',index=False)

    print('崗位工資比例: \n{}'.format(df['月工資'].describe()))



    plt.xticks(fontsize=12)
    plt.yticks( fontsize=12)
    plt.xlabel('工資(K)', fontsize=14)
    plt.ylabel('次數', fontsize=14)
    plt.hist(df['月工資'],bins=12)
    plt.title(filename+'薪資直方圖', fontsize=14)
    plt.savefig('histogram.jpg')
    plt.show()

    #餅圖
def get_region_chart():
    count=df['區域'].value_counts()
    print(count)
    plt.pie(count,labels=count.keys(),labeldistance=1.4,autopct='%2.1f%%')
    plt.axis('equal')
    plt.title(filename+'崗位區域分佈圖', fontsize=14 )
    plt.legend(loc='upper left',bbox_to_anchor=(-0.1,1))
    plt.savefig('pie_chart.jpg')
    plt.show()

def get_cloud_chart():
    text = ''
    for line in df['職位福利']:
        text += line

    # 5.1 使用jieba模塊將字符串分割爲單詞列表
    cut_text = ' '.join(jieba.cut(text))  # 字符串分詞
    cloud = WordCloud(
        font_path='Arial Unicode MS.ttf',
        background_color='white',  # 背景設置成(white)白色
        mask=imread('./cloud.jpg'),  # 設置背景圖
        max_words=1000,
        max_font_size=100
    )

    word_cloud = cloud.generate(cut_text)
    # 5.2 保存詞雲圖片
    word_cloud.to_file('word_cloud.jpg')
    plt.imshow(word_cloud)
    plt.axis('off')
    plt.show()

if __name__ == '__main__':
    filename='運維工程師'
    f=open('./JobPosition/'+filename+'.csv',encoding='utf-8')
    df=pd.read_csv(f)
    get_salary_chart(df)
    get_region_chart()
    get_cloud_chart()

4.效果展現

4.1draft.csv

4.2直方圖

 

 

 

4.3餅圖

 

4.4詞雲圖

 

 

5.填坑記

 在生成詞雲的時候,因爲沒有將字體文件  Arial Unicode MS.ttf 放在當前工做目錄中,致使生成詞雲圖片一致失敗且亂碼。post

OSError: cannot open resource字體

解決方法: 將ttf字體文件放在當前工做目錄便可ui

 

matplotlib 畫圖亂碼url

UserWarning:
findfont: Font family ['sans-serif'] not found.
Falling back to DejaVu Sans
(prop.get_family(), self.defaultFamily[fontext]))

 

解決方法,複製一個windows字體目錄下的 Arial Unicode MS.ttf 文件到matlib的包目錄的ttf目錄下

圈起來的部分根據本身環境更改。

 

經過命令找到 matplotlib的配置目錄

 將這個json文件刪除,他是一個字體的緩存文件,而後從新run腳本就會生成新的緩存文件。將剛剛複製過去的字體加載到緩存文件裏。

不刪除緩存文件從新生成的話,就會提示上面的報錯 找不到那個字體。

 

相關文章
相關標籤/搜索