生信職位拉勾網爬取-附生信行業職業發展交流羣

大家好,之前答應健明師兄爬取一下招聘網的信息,今天我就給大家推送一條生物信息行業就業信息的一些信息,數據源來自拉勾網
首先是整個網絡爬蟲的代碼

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()

相信聰明的你看到這個圖應該是就明白了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章