付騰達 李衛勇 王士信 許佳 魯春燕



摘要:基于Python爬蟲技術,實現了從BOSS直聘網爬取南昌市與IT行業相關招聘信息的過程。爬蟲程序對BOSS直聘網爬取所需信息,并對爬取的數據進行清洗、整理、分析等操作,確保數據的準確性和一致性,隨后將數據存儲至MySQL數據庫中,供后續分析與使用。該系統后端采用基于Python的輕量級Flask框架,前端使用HTML5、CSS3、JQuery、Bootstrap5等技術,此外,還結合了基于JavaScript的Echarts數據可視化圖表庫,以實現數據到可視化效果的轉換。系統可以為廣大應聘人員提供有利的決策支持,以幫助他們更輕松地找到合適的崗位信息。
關鍵詞:BOSS直聘;網絡爬蟲;Flask;數據可視化;Echarts
中圖分類號:TP393.09? ? ? 文獻標識碼:A
文章編號:1009-3044(2024)07-0077-06
開放科學(資源服務)標識碼(OSID)
0 引言
隨著互聯網進入大數據時代,數據呈指數級增長,由于數據量龐大使查找信息時間周期長、精準度差、效率低,以致想通過網絡快速找到符合自己的崗位信息尤為困難。為此,很多研究者開始對招聘數據進行了相關研究,其中毛遂[1]以51job網為例對崗位占比和企業類型、薪資同學歷與地區之間的關系進行了分析。丁文浩[2]以前程無憂網為例對城市和崗位平均薪資水平、工作經驗、學歷情況等進行了分析。王福成[3]以拉勾網為例對高校程序設計語言類的招聘職位地域分布、職位與薪資、學歷與技能要求等進行了分析;羅燕[4]對人工智能類的招聘崗位、招聘行業、招聘城市等進行了分析。
本文基于Python爬蟲技術,從BOSS直聘網采集南昌市IT行業相關的招聘信息,通過分析與數據可視化圖表的展示,為南昌本地應聘者提供決策支持。
1 相關技術
1.1 網絡爬蟲
網絡爬蟲是一種自動化程序或者腳本,用于在互聯網上自動采集數據。原理是通過HTTP協議向目標服務器發送URL請求,然后根據服務器響應提取所需數據,通常以HTML或JSON等格式呈現。然后使用Python語言結合Pycharm集成開發環境以及一系列庫,包括BeautifulSoup庫、正則表達式re庫、Jieba分詞庫、WordCloud 模塊、JSON模塊、lxml解析器及xlwt庫,來處理和存儲這些數據,以便后續分析。
1.2 Flask框架
Flask是一款輕量級而強大的Python Web框架,專門用于構建Web應用程序和RESTful API。盡管被視為是輕量級Web框架,但它卻提供了出色的靈活性和簡潔性。Flask還允許開發者自定義URL路由,將URL映射到不同的視圖函數,以便處理各種請求。此外,Flask還內置了Jinja2模板引擎,使得HTML模板的渲染變得非常容易,因此備受開發者青睞。
1.3 ECharts可視化庫
ECharts是一款開源JavaScript庫,專注于創建高級數據圖表。它建立在輕量級的Canvas庫ZRender之上,提供了豐富多彩的圖表類型,主要有折線圖、柱狀圖、散點圖、餅圖等多種可視化圖表。ECharts的架構分ZRender層和ECharts層,這為開發者與數據分析人員提供了強大的可視化功能,使他們能夠輕松地在Web頁面中創造引人注目的數據可視化效果。因其強大的功能和易實用性,目前已被眾多知名公司廣泛采用。
1.4 Jieba分詞庫
Jieba分詞庫是一款流行的Python庫,專用于中文文本分詞。它因高效準確的分詞性能而著名,支持多種分詞模式,包括精確模式、全模式和搜索引擎模式。此外,Jieba分詞庫還允許用戶自定義詞典,以適應不同領域的文本分析需求。因此,它常被廣泛應用于中文自然語言處理和文本挖掘任務中。
2 招聘數據爬取與預處理
2.1 招聘數據爬取
設計招聘數據爬蟲系統的流程如下:
步驟1:分析URL。
步驟2:訪問待爬取的招聘數據。該模塊使用requests庫請求數據,然后通過BeautifulSoup庫下載頁面信息,并利用lxml解析器解析數據。
步驟3:將數據存儲到CSV文件中。
步驟4:對爬取的數據進行清洗、整理、分析等預處理操作。
步驟5:將經過預處理得到的數據存儲到MySQL數據庫中。
步驟6:數據分析并可視化展示。
招聘信息爬蟲系統流程圖如圖1所示。
2.2 招聘數據爬分析頁面結構
在BOSS直聘網的搜索框中輸入“Web前端工程師”職位,頁面顯示與該職位相關的崗位信息。接著在源代碼調試界面中使用“審查”選項,發現待爬取的信息缺失,通過在Network選項界面下的Filter搜索框中輸入“JSON”,發現存在名為joblist.json格式的條目。經查看發現,崗位數據存儲在該條目文件的“jobList”鍵對應的值中,其存儲著每一頁30個職位信息,如圖2所示。
2.3 分析URL
通過對頁面結構的分析,發現存儲真實崗位數據的joblist.json文件URL格式為:“https://www.zhipin.com/wapi/zpgeek/search/joblist.json?scene=1&query=Web%E5%89%8D%E7%AB%AF%E5%B7%A5%E5%85%B7&city=101240100&experience=&payType=&partTime=°ree=&industry=&scale=&stage=&position=&jobType=&salary=&multiBusinessDistrict=&multiSubway=&page=1&pageSize=30”。通過翻頁對比分析,發現每頁URL中的page參數值隨頁面變化而變化。
因此,可以構建一個循環來獲取與搜索崗位相關的不同頁面的URL,并將這些URL地址存儲在一個URL列表中,以便進行網址請求和數據爬取操作。
2.4 爬取招聘數據
在進行請求URL過程中,為繞開反扒機制,需要在請求的Headers中添加一個“User-Agent”用戶代理,這樣代碼將會偽裝成瀏覽器的形式獲取數據。接著通過使用requesrts庫的get()方法發送請求并獲取數據,然后使用BeautifulSoup庫以及lxml解析器解析數據,進一步使用json.loads()方法將獲取的數據轉化成JSON格式。經分析發現,真實數據存儲在“jobList”鍵對應的值中,通過以訪問字典的方式獲取這些數據,即data["zpData"]["jobList"]。然而在“jobList”鍵中所需要待爬取的字段主要有jobName、brandName、cityName、areaDistrict、businessDistrict、jobExperience、jobDegree、salaryDesc、brandStageName、brandIndustry、brandScaleName、skills、welfareList,這些字段分別對應為職位、公司名、城市、地區、商業區、工作經驗、教育水平、薪水、品牌舞臺、公司行業、規模人數、技能和福利等數據信息。
2.5 數據保存到CSV文件中
本文將爬取的數據存儲到CSV文件中。數據存儲過程是先使用xlwt庫中的Workbook()方法創建一個工作簿,并且在該工作簿對象下使用add_sheet()方法創建一個工作表,通過使用write()方法將所需數據寫入到該工作表中,最后調用save('文件路徑')將數據保存到CSV文件[5]中。存儲在CSV文件中的招聘數據如圖3所示。
2.6 預解析數據
由于從BOSS直聘網直接爬取的數據可能存在臟數據,直接使用會影響后續數據分析的準確性和數據可視化效果。因此,使用前需要對這些數據進行預解析操作,以將其轉化為有效可靠的數據。預解析數據操作主要包括數據去重、處理空值、數據變換、屬性格式化等操作,經過預處理操作的數據可提高數據分析的精確性和可靠性。
1) 數據去重。企業可能會發布相同職位的招聘信息,因此需對重復的招聘信息進行去重操作。通常情況下,一般將“公司名”與“職位”相同的數據視為重復數據,核心代碼如下:
df.drop_duplicates(inplace=True)
2) 空值處理。爬取的數據中存在許多空值(Nan)數據,為了確保數據的準確性,采取的處理方法是直接刪除包含空值的行數據,核心代碼如下:
df.dropna(axis=0, how=”any”)
3) 數據變換。由于數據中“薪水”屬性列存在格式不統一的情況,如“***-***K”、“***-***K·***薪”與“***-***/天”。為方便數據管理,現對薪水列進行數據變換[6-8],統一成“***×1000/月”的數據格式。
原始“薪水”屬性列是以范圍值“a - b”或“a - b·c”的形式存在。因此,可以構造三個新的屬性列“最低薪資”“最高薪資”和“平均工資”。在這些范圍值前提下,“最低工資”值為a,“最高工資”為b,其中c表示年底多發的薪資部分,即12個月工資+年底多發(c - 12)個月工資,如13薪,表示年底多發1個月的工資。對于按天計算薪水的情況,以一個月工作21天結算工資。對于按小時計算薪水的情況,由于數據量少且對數據分析影響較小,將其刪除。經過數據變換有助于標準化薪水數據,以便后續分析。
4) 屬性格式化。在joblist.json文件中, 存在名為“技能”和“福利”的屬性列,它們以列表的方式存儲數據。以“福利”屬性列為例,由于不同公司提供不同的福利待遇,導致“福利”長度各不相同,這種不規則性給數據分析帶來了一些挑戰。因此,需要對“福利”屬性列進行數據的規范化處理,以將其轉化為更適合進行數據分析的數據格式。
“福利”列屬性格式化前,形式如下:
lst = ['員工旅游','定期體檢', '餐補','年終獎','住房補貼','節日福利','帶薪年假', '免費班車','交通補助','五險一金']
“福利”列屬性格式化后,形式如下:
lst = ['員工旅游、定期體檢、餐補、年終獎、住房補貼、節日福利、帶薪年假、免費班車、交通補助、五險一金']
預解析得到的最終數據如圖4所示。
5) 數據保存到MySQL中。系統使用MySQL數據庫存儲預解析后的數據,創建一個名為“boss”的數據庫,用于存儲招聘信息,數據庫結構見表1。
3 數據可視化
系統最后實現了對BOSS直聘網南昌市與IT類招聘數據的可視化,并將分析結果以圖表的形式在前端頁面上進行展示。本系統的主要工具包括基于Python Web框架Flask以及開源可視化庫Echarts,通過該系統觀察招聘數據的相關可視化圖表,應聘者可以更加方便瀏覽招聘信息,為求職者提供了更好的招聘信息可視化平臺。
3.1 區域數據分析
通過對南昌市各行政區和這些行政區內各區域的公司數量進行了詳細分析,發現一些引人注目的趨勢。首先,較為繁華的行政區往往擁有更多的企業,反之企業數量較少。其次,由于交通便捷程度、距離市中心的遠近等因素,如進賢縣、安義縣的公司數量相對較少。
基于上述發現,可以得知,若應聘者選擇在繁華的區域或者離市中心較近區域的企業投遞簡歷,擁有更多的機會獲得面試資格,并且被錄用的概率也會大大增加。該分析結果可以幫助求職者更有針對性地選擇投遞位置,提高他們的就業機會。如圖5所示。
3.2 學歷數據分析
通過對青山湖區各個區學歷要求的數量分析,可知青山湖區企業對求職者學歷層次的需求情況。分析結果顯示,對學歷要求最多的是大專與本科學歷,主要原因是大專與本科生的數量相對較多,企業有更多的選擇余地。其次,大專與本科生對薪資要求相對較低,企業可節約一定的投入成本。
此外,企業非常重視求職者的專業技能和實際操作能力,而初中及以下學歷的人很難滿足相關需求。對于碩士、博士學歷的人要求相對較高,企業難以滿足這些要求,因此,對高學歷要求的企業數量也相對較少。
分析結果有助于求職者更好地了解企業對學歷的要求,從而更有針對性地提升自己的就業競爭力。具體如圖6所示。
3.3 工資數據分析
1) 青山湖區企業最低工資統計數量分析。通過圖7數據分析可知,可知在該區域,提供最低月薪在3K到8K之間的企業數量相對較多,而提供10K以上月薪的企業數量占比相對較少。其原因可能是企業控制投入成本考慮、市場因素、行業標準、經濟狀況以及員工的教育和技能水平等因素的影響。這些因素共同作用下,導致不同薪資水平的企業數量分布不均。
2) 青山湖區企業最高工資統計數量分析。通過圖8中數據分析可知,該區提供最高月薪在8K到12K之間的企業數量占比相對較大。可能是因為這些企業希望吸引行業頂級人才,因此愿提供較高的薪資待遇。此外,某些崗位可能需要特定的專業技能、豐富的經驗或高學歷背景的人才,這些因素也會導致薪資水平相對較高。因此,這些企業提供了較高薪資的工作機會,吸引了有著較高技能水平和經驗的求職者。
3.4 詞云分析
詞云是一種用來展示詞匯出現頻率的圖形,先使用Jieba庫對商業區、公司行業、福利進行分詞,以了解它們在數據中的使用頻率。接著使用WordCloud庫創建詞云圖呈現詞匯統計結果,以更清晰地觀察數據。通過對圖9的詞云分析發現,在求職過程中,應聘者特別關注一些因素,如城市區域、所屬行業以及公司待遇。南昌市因其高吸引力而備受青睞,尤其在計算機軟件、集成電路和半導體行業。此外,一些新興地區,如艾溪湖、紅角洲和瑤湖也備受關注。福利待遇也是應聘者重點考慮的內容,包括節假日、福利和五險一金等。這些因素在求職中發揮著重要作用,應聘者通過層層篩選,最終找到符合自己需求和興趣的職位。
4 結論
本文運用Python的Flask框架,構建了一個可視化平臺,用于展示從BOSS直聘網獲取南昌市與IT行業相關的招聘信息,并進行深入的數據分析。這次分析包括了南昌市各個區域的企業數量、青山湖區各區對學歷的要求、最高和最低工資水平、企業所屬行業以及提供的福利待遇等多個方面。最終,通過可視化手段將這些分析結果生動地展示,為南昌市IT行業的求職者提供了一個便捷的平臺,以幫助他們更輕松地找到適合自己的職位。
參考文獻:
[1] 毛遂,毛紅霞.基于51job網站招聘信息的爬取與分析——以Python技術崗位為例[J].網絡安全技術與應用,2021(4):47-49.
[2] 丁文浩,朱齊亮.基于Python的招聘數據爬取與分析[J].網絡安全技術與應用,2022(1):43-45.
[3] 王福成,齊平.基于招聘數據的高校程序設計語言類教育研究[J].池州學院學報,2020,34(6):147-149.
[4] 羅燕.基于Python對人工智能類招聘信息的爬取與分析[J].石家莊職業技術學院學報,2022,34(6):9-17.
[5] 馬寧,陳曦,張李銘.基于Selenium與Openpyxl的Web腳本自動化設計研究[J].電腦知識與術,2020,16(1):51-53,70.
[6] 殷麗鳳,張浩然.基于Python網上招聘信息的爬取和分析[J].電子設計工程,2019,27(20):22-26.
[7] 張嘉威,關成斌.基于Python和Selenium的智聯招聘數據的爬取與分析[J].軟件,2022,43(8):170-175.
[8] 程俊英.基于Python語言的數據分析處理研究[J].電子技術與軟件工程,2022(15):236-239.
【通聯編輯:王 力】