[爬蟲+數據分析] 分析北京Python開發的現狀|文末送書5本

相信各位同窗多多少少在拉鉤上投過簡歷,今天忽然想了解一下北京Python開發的薪資水平、招聘要求、福利待遇以及公司地理位置。既然要分析那必然是現有數據樣本。本文經過爬蟲和數據分析爲你們展現一下北京Python開發的現狀,但願可以在職業規劃方面幫助到你們!!!python


爬蟲


爬蟲的第一步天然是從分析請求和網頁源代碼開始。從網頁源代碼中咱們並不能找到發佈的招聘信息。可是在請求中咱們看到這樣一條POST請求web

以下圖咱們能夠得知正則表達式

url:https://www.lagou.com/jobs/positionAjax.json?city=%E5%8C%97%E4%BA%AC&needAddtionalResult=falsejson

請求方式:post服務器

result:爲發佈的招聘信息微信

totalCount:爲招聘信息的條數app




經過實踐發現除了必須攜帶headers以外,拉勾網對ip訪問頻率也是有限制的。一開始會提示 '訪問過於頻繁',繼續訪問則會將ip拉入黑名單。不過一段時間以後會自動從黑名單中移除。less

針對這個策略,咱們能夠對請求頻率進行限制,這個弊端就是影響爬蟲效率。dom

其次咱們還能夠經過代理ip來進行爬蟲。網上能夠找到免費的代理ip,但大都不太穩定。付費的價格又不太實惠。 編輯器

具體就看你們如何選擇了

1
思路

    經過分析請求咱們發現每頁返回15條數據,totalCount又告訴了咱們該職位信息的總條數。

向上取整就能夠獲取到總頁數。而後將所得數據保存到csv文件中。這樣咱們就得到了數據分析的數據源!

post請求的Form Data傳了三個參數

first : 是否首頁(並無什麼用)

pn:頁碼

kd:搜索關鍵字


2
no bb, show code


# 獲取請求結果
# kind 搜索關鍵字
# page 頁碼 默認是1
def get_json(kind, page=1,):
    # post請求參數
    param = {
        'first''true',
        'pn': page,
        'kd': kind
    }
    header = {
        'Host''www.lagou.com',
        'Referer''https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
        'User-Agent''Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
    }
    # 設置代理
    proxies = [
        {'http''140.143.96.216:80''https''140.143.96.216:80'},
        {'http''119.27.177.169:80''https''119.27.177.169:80'},
        {'http''221.7.255.168:8080''https''221.7.255.168:8080'}
    ]
    # 請求的url
    url = 'https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false'
    # 使用代理訪問
    # response = requests.post(url, headers=header, data=param, proxies=random.choices(proxies))
    response = requests.post(url, headers=header, data=param, proxies=proxies)
    response.encoding = 'utf-8'
    if response.status_code == 200:
        response = response.json()
        # 請求響應中的positionResult 包括查詢總數 以及該頁的招聘信息(公司名、地址、薪資、福利待遇等...)
        return response['content']['positionResult']
    return None


接下來咱們只須要每次翻頁以後調用 get_json 得到請求的結果 再遍歷取出須要的招聘信息便可

if __name__ == '__main__':
    # 默認先查詢第一頁的數據
    kind = 'python'
    # 請求一次 獲取總條數
    position_result = get_json(kind=kind)
    # 總條數
    total = position_result['totalCount']
    print('{}開發職位,招聘信息總共{}條.....'.format(kind, total))
    # 每頁15條 向上取整 算出總頁數
    page_total = math.ceil(total/15)

    # 全部查詢結果
    search_job_result = []
    #for i in range(1, total + 1)
    # 爲了節約效率 只爬去前100頁的數據
    for i in range(1100):
        position_result = get_json(kind=kind, page= i)
        # 每次抓取完成後,暫停一會,防止被服務器拉黑
        time.sleep(15)
        # 當前頁的招聘信息
        page_python_job = []
        for j in position_result['result']:
            python_job = []
            # 公司全名
            python_job.append(j['companyFullName'])
            # 公司簡稱
            python_job.append(j['companyShortName'])
            # 公司規模
            python_job.append(j['companySize'])
            # 融資
            python_job.append(j['financeStage'])
            # 所屬區域
            python_job.append(j['district'])
            # 職稱
            python_job.append(j['positionName'])
            # 要求工做年限
            python_job.append(j['workYear'])
            # 招聘學歷
            python_job.append(j['education'])
            # 薪資範圍
            python_job.append(j['salary'])
            # 福利待遇
            python_job.append(j['positionAdvantage'])

            page_python_job.append(python_job)

        # 放入全部的列表中
        search_job_result += page_python_job
        print('第{}頁數據爬取完畢, 目前職位總數:{}'.format(i, len(search_job_result)))
        # 每次抓取完成後,暫停一會,防止被服務器拉黑
        time.sleep(15)


ok! 數據咱們已經獲取到了,最後一步咱們須要將數據保存下來

  # 將總數據轉化爲data frame再輸出
    df = pd.DataFrame(data=search_job_result,
                      columns=['公司全名''公司簡稱''公司規模''融資階段''區域''職位名稱''工做經驗''學歷要求''工資''職位福利'])
    df.to_csv('lagou.csv', index=False, encoding='utf-8_sig')


運行main方法直接上結果:



數據分析


經過分析cvs文件,爲了方便咱們統計,咱們須要對數據進行清洗

好比剔除實習崗位的招聘、工做年限無要求或者應屆生的當作 0年處理、薪資範圍須要計算出一個大概的值、學歷無要求的當成大專

# 讀取數據  
df = pd.read_csv('lagou.csv', encoding='utf-8')
# 數據清洗,剔除實習崗位  
df.drop(df[df['職位名稱'].str.contains('實習')].index, inplace=True)  
# print(df.describe())
# 因爲CSV文件內的數據是字符串形式,先用正則表達式將字符串轉化爲列表,再取區間的均值  
pattern = '\d+'  
df['work_year'] = df['工做經驗'].str.findall(pattern)
# 數據處理後的工做年限
avg_work_year = []
# 工做年限
for i in df['work_year']:
   # 若是工做經驗爲'不限'或'應屆畢業生',那麼匹配值爲空,工做年限爲0  
   if len(i) == 0:  
       avg_work_year.append(0)  
   # 若是匹配值爲一個數值,那麼返回該數值  
   elif len(i) == 1:  
       avg_work_year.append(int(''.join(i)))  
   # 若是匹配值爲一個區間,那麼取平均值  
   else:  
       num_list = [int(j) for j in i]  
       avg_year = sum(num_list)/2  
       avg_work_year.append(avg_year)
df['工做經驗'] = avg_work_year

# 將字符串轉化爲列表,再取區間的前25%,比較貼近現實  
df['salary'] = df['工資'].str.findall(pattern)
# 月薪
avg_salary = []  
for k in df['salary']:  
   int_list = [int(n) for n in k]  
   avg_wage = int_list[0]+(int_list[1]-int_list[0])/4  
   avg_salary.append(avg_wage)
df['月工資'] = avg_salary

# 將學歷不限的職位要求認定爲最低學歷:大專\
df['學歷要求'] = df['學歷要求'].replace('不限','大專')


數據經過簡單的清洗以後,下面開始咱們的統計

1
繪製薪資直方圖
# 繪製頻率直方圖並保存  
plt.hist(df['月工資'])
plt.xlabel('工資 (千元)')   
plt.ylabel('頻數')
plt.title("工資直方圖")   
plt.savefig('薪資.jpg')  
plt.show()  



結論:北京市Python開發的薪資大部分處於15~25k之間

2
公司分佈餅狀圖
# 繪製餅圖並保存  
count = df['區域'].value_counts()
plt.pie(count, labels = count.keys(),labeldistance=1.4,autopct='%2.1f%%')  
plt.axis('equal')  # 使餅圖爲正圓形  
plt.legend(loc='upper left', bbox_to_anchor=(-0.11))  
plt.savefig('pie_chart.jpg')  
plt.show()  

結論:Python開發的公司最多的是海淀區、其次是朝陽區。準備去北京工做的小夥伴大概知道去哪租房了吧 

3
學歷要求直方圖
# {'本科': 1304, '大專': 94, '碩士': 57, '博士': 1}
dict = {}
for i in df['學歷要求']:
    if i not in dict.keys():
        dict[i] = 0
    else:
        dict[i] += 1
index = list(dict.keys())
print(index)
num = []
for i in  index:
    num.append(dict[i])
print(num)
plt.bar(left=index, height=num, width=0.5)
plt.show()



結論:在Python招聘中,大部分公司要求是本科學歷以上。可是學歷只是個敲門磚,若是努力提高本身的技術,這些都不是事兒


4
福利待遇詞雲圖
# 繪製詞雲,將職位福利中的字符串彙總  
text = ''  
for line in df['職位福利']:  
   text += line  
# 使用jieba模塊將字符串分割爲單詞列表
cut_text = ' '.join(jieba.cut(text))
#color_mask = imread('cloud.jpg')  #設置背景圖
cloud = WordCloud(
    background_color = 'white',
    # 對中文操做必須指明字體
    font_path='yahei.ttf',
    #mask = color_mask,
    max_words = 1000,
    max_font_size = 100
    ).generate(cut_text)

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


結論:彈性工做是大部分公司的福利,其次五險一金少數公司也會提供六險一金。團隊氛圍、扁平化管理也是很重要的一方面。


至此,這次分析到此結束。有須要的同窗也能夠查一下其餘崗位或者地區的招聘信息哦~

 但願可以幫助你們定位本身的發展和職業規劃。


一塊兒學習:


另外我創建了一個數據分析羣尋找一塊兒學習的朋友,若是滿100人後,請添加個人

微信:【菜單欄加我我的微信備註:數據分析入羣】,拉你進羣



最後送上福利: 送上5本書. 3本數據分析,2本爬蟲書. 底部抽獎


送2本爬蟲書籍,有興趣也能夠經過連接購買

送3本數據分析書籍,有興趣也能夠經過連接購買,這本書配有視頻光碟,學習無壓力


送書規則: 爲了公平起見,送書使用抽獎助手來選, 由於有2種書籍,因此作了兩個抽獎碼,但太佔空間,因此就不在這裏展現了。

後臺回覆【1024節抽獎送書】2箇中獎碼,提高中獎機率.

注:中獎者必須是鐵粉,之前送過書一些讀者,拿到書就再也沒有看到身影. 此次中獎者在結果揭曉以前若是沒有打賞記錄與留言記錄中獎無效,切記切記!


的Python之旅

長按,識別二維碼,關注公衆號

 相關文章:

數據分析 | Numpy初窺1

數據分析 | Numpy進階

Numpy概括整理

本文分享自微信公衆號 - Python綠色通道(Python_channel)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索