項博良, 唐淳淳, 錢 前, 曹健東
(上海工程技術(shù)大學 機械與汽車工程學院, 上海 201620)
隨著人工智能的概念逐步的深入展開,人工智能因其高效性和實用性受到越來越多的重視。作為人工智能的重要組成部分,大數(shù)據(jù)也開始在社會生產(chǎn)中發(fā)揮巨大作用,同時還帶動了社會生活質(zhì)量的全面提升,并提供了以往不曾有過的便利性。在國內(nèi)對高等教育改革正邁向更深層次的時候,各校的畢業(yè)生規(guī)模也逐年增加。臨近畢業(yè)時,或多或少都會存在許多迷茫。而在招聘、應聘的過程中,互聯(lián)網(wǎng)作為當下承載海量招聘信息的重要載體,則給畢業(yè)生的擇業(yè)提供了一條便捷途徑。只是互聯(lián)網(wǎng)的信息檢索中卻會面臨許多用戶并不需要的信息,只有通過人工篩選、再經(jīng)總結(jié)對比后,才能得到最終想要的信息。
為了幫助高校畢業(yè)生在擇業(yè)時能夠快速獲取特定的需求信息,并且通過快速數(shù)據(jù)分析得到自身擇業(yè)的準確定位,從而做出更好的選擇,為此本文設(shè)計研發(fā)了一套針對于招聘就業(yè)的專用爬蟲。這里即以BOSS直聘作為實例,對如何開發(fā)爬蟲獲取信息,及對獲取的信息快速分析進行了深入探討與研究。對此擬展開剖析論述如下。
網(wǎng)絡(luò)爬蟲系統(tǒng)的開發(fā)是否成功取決于確保系統(tǒng)能夠?qū)崿F(xiàn)用戶定制功能,達到預期設(shè)計目的。因此,在網(wǎng)絡(luò)爬蟲系統(tǒng)開發(fā)之前,就需要對該系統(tǒng)需求加以詳盡分析,從而對整體的設(shè)計有一個清晰的思路。時下,普遍適用的爬蟲系統(tǒng)都是模塊化的,模塊化的程序設(shè)計有利于代碼塊的測試與維護,而且也進一步增加了代碼的適用性。在此基礎(chǔ)上,只要對各個模塊進行組合,就能夠構(gòu)建出一個完整的爬蟲系統(tǒng)。本次研究即以BOSS直聘為例,開展模塊化的編程設(shè)計。因為研究旨在通過爬蟲系統(tǒng)對當前就業(yè)做出科學分析,故而針對此需求就要從BOSS直聘網(wǎng)站中獲取全部的崗位信息,以及從每個崗位中獲得包括各崗位名稱、工作地點、薪水、公司規(guī)模性質(zhì)、工作要求在內(nèi)的各種關(guān)鍵信息。至此,在接下來的功能、模塊設(shè)計中,就具備了較強的針對性。
1.2.1 爬蟲整體設(shè)計思路
爬蟲系統(tǒng)的設(shè)計思路為:首先,需要獲得所有包括崗位信息網(wǎng)頁的源碼;其次,在每一頁的網(wǎng)頁源碼中尋找出與需求相匹配的信息,此時就需要連接爬蟲系統(tǒng)和數(shù)據(jù)庫,將每次成功匹配到的信息均存入數(shù)據(jù)庫中,直至所有網(wǎng)頁檢索完畢。在數(shù)據(jù)爬取的整個過程中,針對BOSS直聘的高度反爬,還要在各個模塊中引入適當?shù)姆窗遣呗裕源吮WC數(shù)據(jù)爬取的連續(xù)性。研究可得整體設(shè)計框架如圖1所示。

圖1 整體設(shè)計框圖
1.2.2 爬蟲的網(wǎng)頁抓取模塊
網(wǎng)頁抓取模塊作為爬蟲系統(tǒng)中最重要的部分,也是起始的模塊。但是從實際爬取的情況來看,針對同一個IP在短時間內(nèi)的多次爬取,會被網(wǎng)站屏蔽IP地址,因此在這里采用代理IP池的技術(shù)去訪問。為了避免被對方發(fā)現(xiàn),還需要加入User-Agent將自己偽裝成代理服務器。通過構(gòu)造代理IP池以及由眾多用戶代理組成的代理池,每次隨機選擇訪問IP與用戶代理的搭配,據(jù)此而將自己偽裝成來自不同IP的用戶訪問,大大降低了被反爬蟲的概率。接下來采用Requsets庫的API去解析當前第一層的URL。如:
resp=requests.get(url,headers=headers,proxies=proxies,timeout=5)
1.2.3 網(wǎng)頁源碼分析模塊
在提取好第一層URL的源碼后,分析當前文本,尋找用戶需要的關(guān)鍵信息,根據(jù)用戶的需求,還需要了解每一類工作的名稱與對應網(wǎng)頁鏈接,通過對ELEMENTS的尋找,發(fā)現(xiàn)在標簽a-href下存在著用戶需要的信息,將所有的工作名稱存入JOB列表,將所有的工作鏈接構(gòu)造成完整的URL存入與JOB列表對應的JOBURL列表。
1.2.4 信息獲取模塊
由于BOSS直聘網(wǎng)站每一類工作的鏈接數(shù)最多不超過10頁,在構(gòu)造具體到每一頁鏈接的時候,page的數(shù)不應超過10,且當鏈接無效,即已經(jīng)檢測超出最后一頁的時候,便自動退出了。構(gòu)造規(guī)則如下:
urlbase=link+ ’?page=’ +str(i) +’&ka=page-’ +str(i)
接下來便用requests庫去實現(xiàn)當前網(wǎng)頁解析,同樣也可以運用代理IP池加上用戶代理池隨機選擇與搭配的方法以便能夠更加流暢地爬取信息。一個工作崗位對于求職人員最關(guān)心的應為崗位、薪水、公司信息,工作要求這些關(guān)鍵信息。用Beautifulsoup庫去解析好的網(wǎng)頁提取這些信息,此時將用到如下設(shè)計代碼:
soupxbl=BeautifulSoup(resp1.text,’lxml’)
jobkinds=soupxb1.select(’div.info-primary>h3>a>div.job-title’)
salarys=soupxb1.find_all(’span’,class=’red’)
yaoqius=soupxb1.find_all(’div.info-primary>p’)
names=soupxb1.select(’div.company-text>h3>a’)
situations=soupxb1.select(’div.info-company>div>p’)
1.2.5 MySQL數(shù)據(jù)庫的聯(lián)合使用
研究遍歷完BOSS直聘網(wǎng)站上每一個工作崗位獲得的信息相對來說是一個比較大的數(shù)據(jù),在這里選擇MySQL數(shù)據(jù)庫對爬取的數(shù)據(jù)進行存儲,因為MySQL數(shù)據(jù)庫開源,易操作、并且速度、可靠性以及適應性都適宜。使用MySQL Server8.0,并通過pymysql庫去對數(shù)據(jù)庫進行操作,在程序開端,利用API建立數(shù)據(jù)庫的鏈接。設(shè)計研發(fā)代碼參見如下:
conn=pymysql.connect(host=’127.0.0.1’,user=’root’,password=’xnxbl123@qq.com’,db=’bossapply’,charset=’utf8’)
接下來,將基于用戶需要保存的信息建立數(shù)據(jù)表格。設(shè)計研發(fā)代碼見如下:
cur.execute("DROP TABLE IF EXISTS bossapply")
sql_c="create table bossapply (jobchar(50),salarychar(50),requirementsvarchar (265),company_namechar(100),situationvarchar (265));"
此后,在網(wǎng)頁的分析模塊中提取信息后,將這些數(shù)據(jù)導入所創(chuàng)建的數(shù)據(jù)庫中的表里面。設(shè)計研發(fā)代碼見如下:
sql_insert="insert into bossapply(job,salary,requirements,company_name,situation) values (%s,%s,%s,%s,%s);"
cur.execute(sql_insert,(s1,s2,s3,s4,s5))
這樣就能實現(xiàn)對數(shù)據(jù)庫的操作,將研究中爬取到信息成功存入數(shù)據(jù)庫,為下一步的就業(yè)數(shù)據(jù)分析奠定了基礎(chǔ)。文中,利用數(shù)據(jù)庫可視化工具MySQL WorkBench展示的部分爬取數(shù)據(jù)如圖2所示。

圖2 部分爬取數(shù)據(jù)
通過設(shè)計好的網(wǎng)絡(luò)爬蟲系統(tǒng),從BOSS直聘網(wǎng)站上爬取了上海地區(qū)13萬多的崗位招聘信息數(shù)據(jù),從招聘崗位、工資待遇、工作地點、工作要求、公司性質(zhì)這幾方面的信息,對上海地區(qū)的就業(yè)數(shù)據(jù)做出研究與分析,對廣大擇業(yè)人員可起到一個初步指導的作用。
通過Navicat Premium將數(shù)據(jù)庫導出成Excel文件,在Python中通過pandas庫對數(shù)據(jù)進行處理,首先將所有的數(shù)據(jù)通過read_excel的API讀取到處理環(huán)境下,將每一列的數(shù)據(jù)分別提取出來構(gòu)造出job、salary、requirements、situation四個列表,通過遍歷整個requirements,檢索每一個元素的字段,可以統(tǒng)計出上海市每個地區(qū)大約能夠提供多少個工作崗位;同理,用上述的方法,可以統(tǒng)計出上海地區(qū)提供的工作崗位對學歷的要求,以及公司規(guī)模的情況。對于就業(yè)數(shù)據(jù)分析來說,至關(guān)重要的就是薪資分析,將提取出來的salary列表,對每一個元素采用正則表達式匹配前兩個數(shù)字,也就是這份工作的薪水上下限,求一個平均值,遍歷整個列表,對薪水分布進行統(tǒng)計。同時,通過定位以及包含字符段的方法,可以將每個地區(qū)的工作以及相對應的薪水提取出來,再通過前文對全上海各地區(qū)的工作崗位統(tǒng)計,對上海各地區(qū)的平均薪資做出分析。在此基礎(chǔ)上,各行各業(yè)的薪資水平也能夠根據(jù)各行業(yè)的崗位數(shù)以及對應的平均薪資計算得出。
隨著應屆畢業(yè)生的人數(shù)每年不斷上升,帶給社會的就業(yè)壓力也隨即增大,在這種就業(yè)形勢競爭激烈的就業(yè)市場里面如何做出最佳的選擇即已成為研究的熱點與焦點。
研究可得, 上海地區(qū)提供崗位圖如圖3所示。從圖3可以看出上海每個地區(qū)提供的崗位數(shù)還是有很大差別的,其中以浦東地區(qū)提供的崗位數(shù)最多,且從圖3可以看出金山、寶山、青浦、奉賢提供的就業(yè)崗位相對來說較少,大多數(shù)的就業(yè)崗位還是集中在市區(qū)。同時,也可得到,上海各教育程度提供崗位圖如圖4所示。從圖4結(jié)果可以看出招聘當前的需求主要還是本科以上,大專以上,對于部分應屆生,則可選擇考研考博,憑此來提升在未來就業(yè)市場上的競爭實力。

圖3 上海地區(qū)提供崗位圖

圖4 上海各教育程度提供崗位圖
就業(yè)市場對各職業(yè)的需求也是各有不同。上海各就業(yè)種類招聘情況如圖5所示。由圖5分析可知,對技術(shù)崗的需求甚至超過了其它眾多行業(yè)的需求總和,伴隨著人工智能時代的來臨,對人工智能相關(guān)的技術(shù)崗位缺口還是很大的,是一個前景可期的就業(yè)方向。在未來職業(yè)規(guī)劃還未具備清晰認知時,可以作為一個參考方向。另外,市場營銷與生產(chǎn)制造行業(yè)也能提供不錯的崗位數(shù)。在薪資水平方面,總體還是令人滿意的,主要集中在月薪6~10 K,以及10~20 K之間,月薪在10 K以上和以下的各占大約50%,整體的收入水平保持在一個比較高的水準。

圖5 上海各就業(yè)種類招聘情況

圖6 上海招聘收入情況
在前文對上海市總體的收入水平進行了直觀判斷基礎(chǔ)上,繼而得到上海各地區(qū)招聘收入情況如圖7所示,上海各就業(yè)種類招聘收入如圖8所示,以便能夠?qū)蜆I(yè)選擇以及未來職業(yè)規(guī)劃進行準確及有效判斷。從圖7中可以看出,上海各地區(qū)的收入情況差距不大,但是整體上來看,徐匯區(qū)還是略高一籌,這樣在選擇就業(yè)時可以根據(jù)地區(qū)消費的不同,以及未來規(guī)劃選擇工作區(qū)域。從圖8中可以看出,薪資水平處于前三位的行業(yè)分別是產(chǎn)品行業(yè)、管理行業(yè)以及技術(shù)行業(yè)。而在數(shù)據(jù)分析后得出,在提供崗位數(shù)量最多的技術(shù)崗上,工資并不是最高,有些崗位雖然需求量不大,但是薪水很高。而且,從薪資分布來看,80%以上的行業(yè)的月收入都已經(jīng)達到10 K或者10 K以上了,這樣人們在選擇就業(yè)的時候,可以更少地受到薪資影響,從而做出更適合自己的選擇。

圖7 上海各地區(qū)招聘收入情況

圖8 上海各就業(yè)種類招聘收入
本文通過Python加上MySQL Server的配置,創(chuàng)建了一個基于BOSS直聘網(wǎng)站的網(wǎng)絡(luò)爬蟲數(shù)據(jù)收集分析系統(tǒng),該系統(tǒng)能夠登錄到BOSS直聘,并獲取頁面信息,分析頁面中的URL,同時對篩選構(gòu)造后的URL再一次進行數(shù)據(jù)篩選,將用戶獲取到的數(shù)據(jù)存儲到數(shù)據(jù)庫,在此基礎(chǔ)上將對數(shù)據(jù)進行深層次的挖掘,也就是運用一系列的數(shù)據(jù)分析手段,獲得關(guān)于上海各地區(qū)、各崗位的薪資待遇、招聘需求等一系列重要信息,為廣大的就業(yè)人員提供有益的借鑒與參考。