大家好,之前答應健明師兄爬取一下招聘網的信息,今天我就給大家推送一條生物信息行業就業信息的一些信息,數據源來自拉勾網
首先是整個網絡爬蟲的代碼
1.導入相應的庫
import requests import math import pandas as pd import time
2.構造爬取函數
def get_json(url,num): '''''從網頁獲取JSON,使用POST請求,加上頭部信息''' my_headers = { 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language':'zh-CN,zh;q=0.9', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Content-Length': '55', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Cookie': '_ga=GA1.2.765752527.1538018402; user_trace_token=20180927112000-37beaeb4-c204-11e8-bb60-5254005c3644; LGUID=20180927112000-37beb2b2-c204-11e8-bb60-5254005c3644; index_location_city=%E5%85%A8%E5%9B%BD; JSESSIONID=ABAAABAABEEAAJAF72281935F8B1A25C8FD1DCE9FB23CEF; _gid=GA1.2.1024355859.1539227932; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1538034530,1538034547,1538034560,1539227934; TG-TRACK-CODE=search_code; LGSID=20181011152610-ecdb69fd-cd26-11e8-afa8-525400f775ce; _gat=1; LGRID=20181011160410-3c4f1b3c-cd2c-11e8-afac-525400f775ce; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1539245052; SEARCH_ID=0555f2889e5049b09a78dcc9fad252b0', 'Host': 'www.lagou.com', 'Origin': 'https://www.lagou.com', 'Referer': 'https://www.lagou.com/jobs/list_%E7%94%9F%E7%89%A9%E4%BF%A1%E6%81%AF?px=default&city=%E5%85%A8%E5%9B%BD', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', 'X-Anit-Forge-Code': '0', 'X-Anit-Forge-Token': 'None', 'X-Requested-With':'XMLHttpRequest' } my_data = { 'first': 'true', 'pn':num, 'kd':'生物信息' } res = requests.post(url, headers = my_headers, data = my_data) res.raise_for_status() res.encoding = 'utf-8' # 得到包含職位信息的字典 page = res.json() return page def get_page_num(count): '''''計算要抓取的頁數''' # 每頁15個職位,向上取整 res = math.ceil(count/15) # 拉勾網最多顯示30頁結果 if res > 30: return 30 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['city']) 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 url = 'https://www.lagou.com/jobs/positionAjax.json?px=default&needAddtionalResult=false' # 先設定頁數爲1,獲取總的職位數 page_1 = get_json(url,1) total_count = page_1['content']['positionResult']['totalCount'] num = get_page_num(total_count) total_info = [] time.sleep(20) print('職位總數:{},頁數:{}'.format(total_count,num)) 職位總數:57267,頁數:30 for n in range(1,num+1): # 對每個網頁讀取JSON, 獲取每頁數據 page = get_json(url,n) jobs_list = page['content']['positionResult']['result'] page_info = get_page_info(jobs_list) total_info += page_info print('已經抓取第{}頁, 職位總數:{}'.format(n, len(total_info))) # 每次抓取完成後,暫停一會,防止被服務器拉黑 time.sleep(30) #將總數據轉化爲data frame再輸出 df = pd.DataFrame(data = total_info,columns = ['公司全名','公司簡稱','公司規模','融資階段','工作地點','區域','職位名稱','工作經驗','學歷要求','工資','職位福利']) #df.to_csv('lagou_jobs.csv',index = False) #print('已保存爲csv文件.') 已經抓取第1頁, 職位總數:15 已經抓取第2頁, 職位總數:30 已經抓取第3頁, 職位總數:45 已經抓取第4頁, 職位總數:60 已經抓取第5頁, 職位總數:75 已經抓取第6頁, 職位總數:90 已經抓取第7頁, 職位總數:105 已經抓取第8頁, 職位總數:120 已經抓取第9頁, 職位總數:135 已經抓取第10頁, 職位總數:150 已經抓取第11頁, 職位總數:165 已經抓取第12頁, 職位總數:180 已經抓取第13頁, 職位總數:195 已經抓取第14頁, 職位總數:210 已經抓取第15頁, 職位總數:225 已經抓取第16頁, 職位總數:240 已經抓取第17頁, 職位總數:255 已經抓取第18頁, 職位總數:270 已經抓取第19頁, 職位總數:285 已經抓取第20頁, 職位總數:300 已經抓取第21頁, 職位總數:315 已經抓取第22頁, 職位總數:330 已經抓取第23頁, 職位總數:345 已經抓取第24頁, 職位總數:360 已經抓取第25頁, 職位總數:375 已經抓取第26頁, 職位總數:390 已經抓取第27頁, 職位總數:405 已經抓取第28頁, 職位總數:420 已經抓取第29頁, 職位總數:435 已經抓取第30頁, 職位總數:450 df
3.數據可視化展示
df.to_excel("result.xls",index=False,encoding="utf_8") import pandas as pd import numpy as np import matplotlib.pyplot as plt import jieba from wordcloud import WordCloud # 詞雲 import matplotlib as mpl # 配置字體 from pyecharts import Geo # 地理圖
4.繪圖區域設置
plt.rcParams['font.sans-serif']=['SimHei'] # 用來正常顯示中文標籤 plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號 plt.rcParams["axes.labelsize"] = 16. plt.rcParams["xtick.labelsize"] = 14. plt.rcParams["ytick.labelsize"] = 14. plt.rcParams["legend.fontsize"] = 12. plt.rcParams["figure.figsize"] = [15., 15.]
5.讀取數據及繪圖
# 讀入數據 df = pd.read_excel('result.xls') # 查看頭幾行 df.head()
6.學歷要求
很明顯看到,目前來說本科需求量最大,博士就是稀有動物了
df['學歷要求'].value_counts().plot(kind='barh',rot=0) plt.show()
7.工作經驗
接着我們看一下工作經驗,大部分公司要求3-5年的工作經驗,其次是不限工作時間,畢竟生信還是靠經驗吃飯的
df['工作經驗'].value_counts().plot(kind='barh') #繪製條形圖 plt.show()
8.工作地點
工作地點就是北上廣深和杭州呀,推薦一下,建明公司在珠海,哈哈哈
df['工作地點'].value_counts().plot(kind='pie',autopct='%1.2f%%',explode=np.linspace(0,1.5,37)) plt.show()
9.工資圖(這裏圖的展現方式是有問題的)
可以看到大部分工資集中在10K-20K,最高的有35K,畢竟很少
df['工資'].value_counts().plot(kind='barh') #繪製條形圖 plt.show()
#從lambda一直到*1000,是一個匿名函數,*1000的原因是這裏顯示的是幾K幾K的,我們把K切割掉,只要數字,就*1000了 data2 = list(map(lambda x:(df['學歷要求'][x],eval(re.split('k|K',df['工資'][x])[0])*1000),range(len(df)))) #再把data2框架起來 data3 = pd.DataFrame(data2) sort_by_degree['sortby'] = sort_by_degree['degree'].map(degree_mappings) sort_by_degree.sort_values(by='sortby', inplace=True) sort_by_degree
degree | counts | sortby | |
---|---|---|---|
0 | 不限 | 39 | 1 |
2 | 大專 | 110 | 2 |
3 | 本科 | 256 | 3 |
4 | 碩士 | 43 | 4 |
1 | 博士 | 2 | 5 |
10.不同學歷的薪酬
大部分收入相對可觀的是本科生和碩士生,所以生信菜鳥團之前寫過帖子,關於讀博到底應不應該?
說明一點:羣主是博士在讀哦
degree_mappings = {'不限':1, '大專':2, '本科':3, '碩士':4, '博士':5} group_by_degree = data3.groupby([0])[1] df_degree = [] for group in sort_by_degree['degree']: v = group_by_degree.get_group(group).values df_degree.append(v) ax9 = plt.figure(figsize=(10, 8)).add_subplot(111) sns.boxplot(data=df_degree) ax9.set_xticklabels(sort_by_degree['degree'], fontsize=18) ax9.set_title('不同學歷的薪酬分佈', fontsize=22) ax9.set_ylabel('薪酬K/月', fontsize=20) plt.show()