資料處理-拉勾網職位列表和詳情-儲存excel檔案
ofollow,noindex">智慧決策上手系列教程索引
在上一篇,我們讀取了數百條拉勾網關於“人工智慧”職位招聘的資訊,儲存了數百個職位資訊檔案,這一篇我們提取一些有用的資料放到excel檔案進行觀察和整理、分析。
上一篇:網路資料抓取-拉勾網職位列表和詳情-requests案例
確定需要提取的資料
參照上一篇,我們使用下面的程式碼隨便讀取並輸出一個職位資料檔案 xxxxx.json
的資料,注意目錄和檔名可能需要調整:
#cell-1 import json def readJob(fileName): with open(fileName,'r') as f: job=json.load(f) print(json.dumps(job,indent=2,ensure_ascii=False)) readJob('./data/lagou_ai/jobs/2363876.json')
執行得到一個json物件,開始部分類似:

image.png
我們只提取以下幾個內容:
- 職位編號positionId
- 職位名positionName
- 工作經驗workYear
- 學歷要求education
- 釋出時間createTime
- 薪資salary
- 工作地city
- 公司名companyFullName
- 公司規模companySize
- 公司融資financeStage
- 職位分類firstType
- 職位二級分類secondType
- 職位詳情details
處理特殊欄位
在上面工作經驗、薪資、公司規模都是一個範圍,這不太方便分析,我們把它拆開,比如薪資“15k-30k”拆分成 salaryLow=15
和 salaryHigh=30
:
#cell-0.5 def range2two(s, unit): s = s.replace(unit, '')#去掉單位k、年、人 s = s.replace(' ', '')#去掉空格 l = s.split('-') res = { 'low': str(l[0]), 'high': str(l[1]) if len(l) > 1 else 'None' } print(res) range2two('12k-20k','k') range2two('13','k')
最後兩行是測試,執行輸出以下內容表示正常:

image.png
測試成功後整理程式碼:
#cell-0.5 def range2two(s, unit): s = s.replace(unit, '')#去掉單位k、年、人 s = s.replace(' ', '')#去掉空格 l = s.split('-') res = { 'low': str(l[0]), 'high': str(l[1]) if len(l) > 1 else 'None' } return res
完善readJob函式,返回csv的一行字串
修改和完善提取資料的程式碼,把表頭分為可以直接讀取的labels和需要轉化的labels2:
#cell-1 import json labels=['positionId','positionName','workYear','education','createTime','salary','city','companyFullName','companySize','financeStage','firstType','secondType','details'] labels2=['salary_low','salary_high','workYear_low','workYear_high','companySize_low','companySize_high'] def readJob(fileName): with open(fileName,'r') as f: job=json.load(f) line=[] for key in labels: line.append(str(job[key]).replace(',',',')) #新增所有labels的欄位,用中文逗號替換英文逗號,避免分割混亂 salaries=range2two(job['salary'],'k') workYears=range2two(job['workYear'],'年') companySizes=range2two(job['companySize'],'人') line+=[salaries['low'],salaries['high']] line+=[workYears['low'],workYears['high']] line+=[companySizes['low'],companySizes['high']] return ','.join(line) test=readJob('./data/lagou_ai/jobs/2363876.json') print(test)
因為.csv檔案使用英文逗號分割每個表格單元的,所以如果資料裡面有英文逗號就會造成混亂, .replace(',',',')
可以用中文逗號替換掉英文逗號,避免混亂。
最後兩行是測試,注意輸出結果應該有6個單獨的數字:

image.png
讀取並儲存一個職位到csv檔案
測試成功後去掉結尾test那兩行。
新建一個cell編寫儲存.csv檔案的程式碼:
#cell-3 with open('./data/lagou_ai/jobs.csv', 'w', encoding="gb18030") as f: text = '' text += ','.join(labels + labels2) text += '\n' text += readJob('./data/lagou_ai/jobs/2363876.json') f.write(text) f.close() print('>>OK!')
這將生成一個 jobs.csv
檔案,用excel開啟它可以看到有兩行內容,注意檢查最後幾列是否正常:

image.png
讀取全部職位儲存到jobs.csv
首先要取得jobs資料夾下所有的檔名,然後迴圈操作就可以了。
#cell-3 import os files = os.listdir('./data/lagou_ai/jobs/')#獲取所有檔案列表 with open('./data/lagou_ai/jobs.csv', 'w', encoding="gb18030") as f: text = '' text += ','.join(labels + labels2) for fname in files: if not fname.find('.json')==-1: text += '\n' text += readJob('./data/lagou_ai/jobs/' + fname) f.write(text) f.close() print('>>OK!')
程式碼說明:
-
os.listdir('./data/lagou_ai/jobs/')
得到這個資料夾下所有的檔案的列表,甚至包含了隱藏檔案。類似['2178923982.json','237218937.json',...]
-
if not fname.find('.json')==-1:
如果不是xxx.json
格式的檔名就不執行操作,比如對於隱藏檔案就不操作。'123'.find('23')
等於1,左數從0開始,第1位置上就是23,'123'.find('a')
等於-1,因為根本找不到。
執行上面程式碼得到一個excel表,包含了數百行職位資訊。

image.png
清理excel表中錯誤資料
我們看到其實搜尋“人工智慧”得到的很多職位和人工智慧都不相關,甚至有很多銷售、行政類的職位。
我們可以根據firstType和secondType過濾到這些錯誤資料,把它們直接刪除。
點選excel表格列的頂端,然後【開始-排序和篩選】,升序降序任意,彈窗預設【擴充套件選定區域】,然後確定,相同secondType的就會排在一起,根據需要可以把“銷售、運營、推廣、行政”等明顯有問題的職位刪除掉,得到比較有效的內容。

image.png
如果只想保留secondaType是“人工智慧”的職位,可以把它們一起復制剪切出來另存一個.csv表格。
如果你想用程式碼直接實現也可以,需要增加 if job['secondtype']=='人工智慧':
,具體請自己試試看~
回顧總結
總體程式碼(主義資料夾路徑):
# coding: utf-8 # ### 讀取一個檔案 # In[16]: def range2two(s, unit): s = s.replace(unit, '')#去掉單位k、年、人 s = s.replace(' ', '')#去掉空格 l = s.split('-') res = { 'low': str(l[0]), 'high': str(l[1]) if len(l) > 1 else 'None' } return res # In[25]: import json labels = [ 'positionId', 'positionName', 'workYear', 'education', 'createTime', 'salary', 'city', 'companyFullName', 'companySize', 'financeStage', 'firstType', 'secondType', 'details' ] labels2 = [ 'salary_low', 'salary_high', 'workYear_low', 'workYear_high', 'companySize_low', 'companySize_high' ] def readJob(fileName): with open(fileName, 'r') as f: job = json.load(f) line = [] for key in labels: line.append(str(job[key]).replace(',',','))#新增所有labels的欄位,用中文逗號替換英文逗號,避免分割混亂 salaries = range2two(job['salary'], 'k') workYears = range2two(job['workYear'], '年') companySizes = range2two(job['companySize'], '人') line += [salaries['low'], salaries['high']] line += [workYears['low'], workYears['high']] line += [companySizes['low'], companySizes['high']] return ','.join(line) # In[37]: import os files = os.listdir('./data/lagou_ai/jobs/')#獲取所有檔案列表 with open('./data/lagou_ai/jobs.csv', 'w', encoding="gb18030") as f: text = '' text += ','.join(labels + labels2) for fname in files: if not fname.find('.json')==-1: text += '\n' text += readJob('./data/lagou_ai/jobs/' + fname) f.write(text) f.close() print('>>OK!')
總結:
- 首先確定哪些資料需要提取
- 如果有特殊欄位需要單獨處理一下
- cvs是英文逗號和換行符分割組成的
- 要得到全部檔案列表然後迴圈執行操作
智慧決策上手系列教程索引
每個人的智慧決策新時代
如果您發現文章錯誤,請不吝留言指正;
如果您覺得有用,請點喜歡;
如果您覺得很有用,歡迎轉載~
END