上一篇已經統計出了起薪最高的top 10:html
接着玩,把top 10 中全部職位的詳細信息爬取下來。某一職位的詳情是這樣:架構
咱們須要把工做經驗、學歷、職能、關鍵字爬取下來。app
1 from urllib.request import urlopen 2 from urllib.error import HTTPError 3 from bs4 import BeautifulSoup 4 import csv 5 from itertools import chain 6 import threading 7 8 def load_datas(): 9 ''' 10 從joblist.csv中裝載數據 11 :return: 數據集 datas 12 ''' 13 datas = [] 14 with open('high10_url.csv', encoding='utf-8') as fp: 15 r = csv.reader(fp) 16 for row in r: 17 datas.append(row[0]) 18 return datas 19 20 def get_desc(url): 21 ''' 爬取職位的詳細信息,包括:經驗, 學歷, 職位, 技能關鍵字 ''' 22 try: 23 html = urlopen(url) 24 except HTTPError as e: 25 print('Page was not found', e.filename) 26 return [] 27 28 job_desc = [] # 職位詳情 29 try: 30 exp, edu, position, keys = '', '', '', [] # 經驗, 學歷, 職位, 技能關鍵字 31 bsObj = BeautifulSoup(html.read()) 32 contents = bsObj.find('p', {'class': 'msg ltype'}).contents 33 exp = contents[2].strip() # 經驗 34 edu = contents[4].strip() # 學歷 35 print(edu) 36 a_list = bsObj.findAll('a', {'class': 'el tdn'}) 37 for i, a in enumerate(a_list): 38 if i == 0: 39 position = a.get_text() # 職位 40 else: 41 keys.append(a.get_text()) # 技能關鍵字 42 job_desc.append((exp, edu, position, keys)) 43 except AttributeError as e: 44 print(e) 45 job_desc = [] 46 return job_desc 47 48 def crawl(urls): 49 ''' 50 :param urls: 職位詳情 51 ''' 52 print('開始爬取數據...') 53 job_desc = [get_desc(url) for url in urls] 54 print('爬取結束') 55 return job_desc 56 57 def save_data(all_jobs, f_name): 58 ''' 59 將信息保存到目標文件 60 :param all_jobs: 二維列表,每一個元素是一頁的職位信息 61 ''' 62 print('正在保存數據...') 63 with open(f_name, 'w', encoding='utf-8', newline='') as fp: 64 w = csv.writer(fp) 65 # 將二維列表轉換成一維 66 t = list(chain(*all_jobs)) 67 w.writerows(t) 68 print('保存結束,共{}條數據'.format(len(t))) 69 70 urls = load_datas() 71 job_desc = crawl(urls) 72 print(job_desc) 73 save_data(job_desc, 'job_desc.csv')
high10_url.csv中已經預先存儲了top 10的全部64個url。job_desc.csv中的結果以下:學習
學歷列出現了問題,第5行顯示的是「招1人」,實際上這個職位沒有學歷要求,把全部「招x人」的記錄都改爲「無要求」。url
接下來能夠按照經驗、學歷、職能分別統計:spa
import csv import pandas as pd import numpy as np def load_datas(): ''' 從joblist.csv中裝載數據 :return: 數據集 datas ''' datas = [] with open('job_desc.csv', encoding='utf-8') as fp: r = csv.reader(fp) for row in r: datas.append(row) return datas def analysis(datas): ''' 數據分析 ''' df = pd.DataFrame({'exp': datas[:, 0], 'edu': datas[:, 1], 'position': datas[:, 2], 'keys': datas[:, 3]}) count(df, 'exp', '經驗') # 按經驗統計 count(df, 'edu', '學歷') # 按學歷統計 count(df, 'position', '職位') # 按職位統計 def count(df, idx, name): ''' 分組統計 ''' print(('按' + name + '分組').center(60, '-')) c = df[idx].value_counts(sort=True) print(c) if __name__ == '__main__': # 讀取並清洗數據 datas = np.array(load_datas()) analysis(datas)
5~7年經驗果真是最容易找到高薪職位的,並且用人單位大多要求本科學歷。3d
職能的統計比較雜亂,高級軟件工程師和架構師的崗位較多,項目經理這類職位的薪水通常低於工程師,這也和預計的相同:code
技能關鍵字看起來並不友好:orm
第一條記錄很好地反應了技能要求,第二條就沒什麼用了,這是因爲關鍵字信息是HR自行添加的,大多數HR都不太瞭解技術,所以也就出現了像第二條那樣對本次分析沒什麼做用的關鍵字。htm
看來得求助於一些分詞技術,從職位信息中抽取一些關鍵字。
下篇繼續,看看哪些技能是搶手的。
做者:我是8位的
出處:http://www.cnblogs.com/bigmonkey
本文以學習、研究和分享爲主,如需轉載,請聯繫本人,標明做者和出處,非商業用途!
掃描二維碼關注公做者衆號「我是8位的」