項(xiàng)博良, 唐淳淳, 錢 前, 曹健東
(上海工程技術(shù)大學(xué) 機(jī)械與汽車工程學(xué)院, 上海 201620)
隨著人工智能的概念逐步的深入展開(kāi),人工智能因其高效性和實(shí)用性受到越來(lái)越多的重視。作為人工智能的重要組成部分,大數(shù)據(jù)也開(kāi)始在社會(huì)生產(chǎn)中發(fā)揮巨大作用,同時(shí)還帶動(dòng)了社會(huì)生活質(zhì)量的全面提升,并提供了以往不曾有過(guò)的便利性。在國(guó)內(nèi)對(duì)高等教育改革正邁向更深層次的時(shí)候,各校的畢業(yè)生規(guī)模也逐年增加。臨近畢業(yè)時(shí),或多或少都會(huì)存在許多迷茫。而在招聘、應(yīng)聘的過(guò)程中,互聯(lián)網(wǎng)作為當(dāng)下承載海量招聘信息的重要載體,則給畢業(yè)生的擇業(yè)提供了一條便捷途徑。只是互聯(lián)網(wǎng)的信息檢索中卻會(huì)面臨許多用戶并不需要的信息,只有通過(guò)人工篩選、再經(jīng)總結(jié)對(duì)比后,才能得到最終想要的信息。
為了幫助高校畢業(yè)生在擇業(yè)時(shí)能夠快速獲取特定的需求信息,并且通過(guò)快速數(shù)據(jù)分析得到自身?yè)駱I(yè)的準(zhǔn)確定位,從而做出更好的選擇,為此本文設(shè)計(jì)研發(fā)了一套針對(duì)于招聘就業(yè)的專用爬蟲(chóng)。這里即以BOSS直聘作為實(shí)例,對(duì)如何開(kāi)發(fā)爬蟲(chóng)獲取信息,及對(duì)獲取的信息快速分析進(jìn)行了深入探討與研究。對(duì)此擬展開(kāi)剖析論述如下。
網(wǎng)絡(luò)爬蟲(chóng)系統(tǒng)的開(kāi)發(fā)是否成功取決于確保系統(tǒng)能夠?qū)崿F(xiàn)用戶定制功能,達(dá)到預(yù)期設(shè)計(jì)目的。因此,在網(wǎng)絡(luò)爬蟲(chóng)系統(tǒng)開(kāi)發(fā)之前,就需要對(duì)該系統(tǒng)需求加以詳盡分析,從而對(duì)整體的設(shè)計(jì)有一個(gè)清晰的思路。時(shí)下,普遍適用的爬蟲(chóng)系統(tǒng)都是模塊化的,模塊化的程序設(shè)計(jì)有利于代碼塊的測(cè)試與維護(hù),而且也進(jìn)一步增加了代碼的適用性。在此基礎(chǔ)上,只要對(duì)各個(gè)模塊進(jìn)行組合,就能夠構(gòu)建出一個(gè)完整的爬蟲(chóng)系統(tǒng)。本次研究即以BOSS直聘為例,開(kāi)展模塊化的編程設(shè)計(jì)。因?yàn)檠芯恐荚谕ㄟ^(guò)爬蟲(chóng)系統(tǒng)對(duì)當(dāng)前就業(yè)做出科學(xué)分析,故而針對(duì)此需求就要從BOSS直聘網(wǎng)站中獲取全部的崗位信息,以及從每個(gè)崗位中獲得包括各崗位名稱、工作地點(diǎn)、薪水、公司規(guī)模性質(zhì)、工作要求在內(nèi)的各種關(guān)鍵信息。至此,在接下來(lái)的功能、模塊設(shè)計(jì)中,就具備了較強(qiáng)的針對(duì)性。
1.2.1 爬蟲(chóng)整體設(shè)計(jì)思路
爬蟲(chóng)系統(tǒng)的設(shè)計(jì)思路為:首先,需要獲得所有包括崗位信息網(wǎng)頁(yè)的源碼;其次,在每一頁(yè)的網(wǎng)頁(yè)源碼中尋找出與需求相匹配的信息,此時(shí)就需要連接爬蟲(chóng)系統(tǒng)和數(shù)據(jù)庫(kù),將每次成功匹配到的信息均存入數(shù)據(jù)庫(kù)中,直至所有網(wǎng)頁(yè)檢索完畢。在數(shù)據(jù)爬取的整個(gè)過(guò)程中,針對(duì)BOSS直聘的高度反爬,還要在各個(gè)模塊中引入適當(dāng)?shù)姆窗遣呗?,以此保證數(shù)據(jù)爬取的連續(xù)性。研究可得整體設(shè)計(jì)框架如圖1所示。
圖1 整體設(shè)計(jì)框圖
1.2.2 爬蟲(chóng)的網(wǎng)頁(yè)抓取模塊
網(wǎng)頁(yè)抓取模塊作為爬蟲(chóng)系統(tǒng)中最重要的部分,也是起始的模塊。但是從實(shí)際爬取的情況來(lái)看,針對(duì)同一個(gè)IP在短時(shí)間內(nèi)的多次爬取,會(huì)被網(wǎng)站屏蔽IP地址,因此在這里采用代理IP池的技術(shù)去訪問(wèn)。為了避免被對(duì)方發(fā)現(xiàn),還需要加入U(xiǎn)ser-Agent將自己偽裝成代理服務(wù)器。通過(guò)構(gòu)造代理IP池以及由眾多用戶代理組成的代理池,每次隨機(jī)選擇訪問(wèn)IP與用戶代理的搭配,據(jù)此而將自己偽裝成來(lái)自不同IP的用戶訪問(wèn),大大降低了被反爬蟲(chóng)的概率。接下來(lái)采用Requsets庫(kù)的API去解析當(dāng)前第一層的URL。如:
resp=requests.get(url,headers=headers,proxies=proxies,timeout=5)
1.2.3 網(wǎng)頁(yè)源碼分析模塊
在提取好第一層URL的源碼后,分析當(dāng)前文本,尋找用戶需要的關(guān)鍵信息,根據(jù)用戶的需求,還需要了解每一類工作的名稱與對(duì)應(yīng)網(wǎng)頁(yè)鏈接,通過(guò)對(duì)ELEMENTS的尋找,發(fā)現(xiàn)在標(biāo)簽a-href下存在著用戶需要的信息,將所有的工作名稱存入JOB列表,將所有的工作鏈接構(gòu)造成完整的URL存入與JOB列表對(duì)應(yīng)的JOBURL列表。
1.2.4 信息獲取模塊
由于BOSS直聘網(wǎng)站每一類工作的鏈接數(shù)最多不超過(guò)10頁(yè),在構(gòu)造具體到每一頁(yè)鏈接的時(shí)候,page的數(shù)不應(yīng)超過(guò)10,且當(dāng)鏈接無(wú)效,即已經(jīng)檢測(cè)超出最后一頁(yè)的時(shí)候,便自動(dòng)退出了。構(gòu)造規(guī)則如下:
urlbase=link+ ’?page=’ +str(i) +’&ka=page-’ +str(i)
接下來(lái)便用requests庫(kù)去實(shí)現(xiàn)當(dāng)前網(wǎng)頁(yè)解析,同樣也可以運(yùn)用代理IP池加上用戶代理池隨機(jī)選擇與搭配的方法以便能夠更加流暢地爬取信息。一個(gè)工作崗位對(duì)于求職人員最關(guān)心的應(yīng)為崗位、薪水、公司信息,工作要求這些關(guān)鍵信息。用Beautifulsoup庫(kù)去解析好的網(wǎng)頁(yè)提取這些信息,此時(shí)將用到如下設(shè)計(jì)代碼:
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ù)庫(kù)的聯(lián)合使用
研究遍歷完BOSS直聘網(wǎng)站上每一個(gè)工作崗位獲得的信息相對(duì)來(lái)說(shuō)是一個(gè)比較大的數(shù)據(jù),在這里選擇MySQL數(shù)據(jù)庫(kù)對(duì)爬取的數(shù)據(jù)進(jìn)行存儲(chǔ),因?yàn)镸ySQL數(shù)據(jù)庫(kù)開(kāi)源,易操作、并且速度、可靠性以及適應(yīng)性都適宜。使用MySQL Server8.0,并通過(guò)pymysql庫(kù)去對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,在程序開(kāi)端,利用API建立數(shù)據(jù)庫(kù)的鏈接。設(shè)計(jì)研發(fā)代碼參見(jiàn)如下:
conn=pymysql.connect(host=’127.0.0.1’,user=’root’,password=’xnxbl123@qq.com’,db=’bossapply’,charset=’utf8’)
接下來(lái),將基于用戶需要保存的信息建立數(shù)據(jù)表格。設(shè)計(jì)研發(fā)代碼見(jiàn)如下:
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)頁(yè)的分析模塊中提取信息后,將這些數(shù)據(jù)導(dǎo)入所創(chuàng)建的數(shù)據(jù)庫(kù)中的表里面。設(shè)計(jì)研發(fā)代碼見(jiàn)如下:
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))
這樣就能實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作,將研究中爬取到信息成功存入數(shù)據(jù)庫(kù),為下一步的就業(yè)數(shù)據(jù)分析奠定了基礎(chǔ)。文中,利用數(shù)據(jù)庫(kù)可視化工具M(jìn)ySQL WorkBench展示的部分爬取數(shù)據(jù)如圖2所示。
圖2 部分爬取數(shù)據(jù)
通過(guò)設(shè)計(jì)好的網(wǎng)絡(luò)爬蟲(chóng)系統(tǒng),從BOSS直聘網(wǎng)站上爬取了上海地區(qū)13萬(wàn)多的崗位招聘信息數(shù)據(jù),從招聘崗位、工資待遇、工作地點(diǎn)、工作要求、公司性質(zhì)這幾方面的信息,對(duì)上海地區(qū)的就業(yè)數(shù)據(jù)做出研究與分析,對(duì)廣大擇業(yè)人員可起到一個(gè)初步指導(dǎo)的作用。
通過(guò)Navicat Premium將數(shù)據(jù)庫(kù)導(dǎo)出成Excel文件,在Python中通過(guò)pandas庫(kù)對(duì)數(shù)據(jù)進(jìn)行處理,首先將所有的數(shù)據(jù)通過(guò)read_excel的API讀取到處理環(huán)境下,將每一列的數(shù)據(jù)分別提取出來(lái)構(gòu)造出job、salary、requirements、situation四個(gè)列表,通過(guò)遍歷整個(gè)requirements,檢索每一個(gè)元素的字段,可以統(tǒng)計(jì)出上海市每個(gè)地區(qū)大約能夠提供多少個(gè)工作崗位;同理,用上述的方法,可以統(tǒng)計(jì)出上海地區(qū)提供的工作崗位對(duì)學(xué)歷的要求,以及公司規(guī)模的情況。對(duì)于就業(yè)數(shù)據(jù)分析來(lái)說(shuō),至關(guān)重要的就是薪資分析,將提取出來(lái)的salary列表,對(duì)每一個(gè)元素采用正則表達(dá)式匹配前兩個(gè)數(shù)字,也就是這份工作的薪水上下限,求一個(gè)平均值,遍歷整個(gè)列表,對(duì)薪水分布進(jìn)行統(tǒng)計(jì)。同時(shí),通過(guò)定位以及包含字符段的方法,可以將每個(gè)地區(qū)的工作以及相對(duì)應(yīng)的薪水提取出來(lái),再通過(guò)前文對(duì)全上海各地區(qū)的工作崗位統(tǒng)計(jì),對(duì)上海各地區(qū)的平均薪資做出分析。在此基礎(chǔ)上,各行各業(yè)的薪資水平也能夠根據(jù)各行業(yè)的崗位數(shù)以及對(duì)應(yīng)的平均薪資計(jì)算得出。
隨著應(yīng)屆畢業(yè)生的人數(shù)每年不斷上升,帶給社會(huì)的就業(yè)壓力也隨即增大,在這種就業(yè)形勢(shì)競(jìng)爭(zhēng)激烈的就業(yè)市場(chǎng)里面如何做出最佳的選擇即已成為研究的熱點(diǎn)與焦點(diǎn)。
研究可得, 上海地區(qū)提供崗位圖如圖3所示。從圖3可以看出上海每個(gè)地區(qū)提供的崗位數(shù)還是有很大差別的,其中以浦東地區(qū)提供的崗位數(shù)最多,且從圖3可以看出金山、寶山、青浦、奉賢提供的就業(yè)崗位相對(duì)來(lái)說(shuō)較少,大多數(shù)的就業(yè)崗位還是集中在市區(qū)。同時(shí),也可得到,上海各教育程度提供崗位圖如圖4所示。從圖4結(jié)果可以看出招聘當(dāng)前的需求主要還是本科以上,大專以上,對(duì)于部分應(yīng)屆生,則可選擇考研考博,憑此來(lái)提升在未來(lái)就業(yè)市場(chǎng)上的競(jìng)爭(zhēng)實(shí)力。
圖3 上海地區(qū)提供崗位圖
圖4 上海各教育程度提供崗位圖
就業(yè)市場(chǎng)對(duì)各職業(yè)的需求也是各有不同。上海各就業(yè)種類招聘情況如圖5所示。由圖5分析可知,對(duì)技術(shù)崗的需求甚至超過(guò)了其它眾多行業(yè)的需求總和,伴隨著人工智能時(shí)代的來(lái)臨,對(duì)人工智能相關(guān)的技術(shù)崗位缺口還是很大的,是一個(gè)前景可期的就業(yè)方向。在未來(lái)職業(yè)規(guī)劃還未具備清晰認(rèn)知時(shí),可以作為一個(gè)參考方向。另外,市場(chǎng)營(yíng)銷與生產(chǎn)制造行業(yè)也能提供不錯(cuò)的崗位數(shù)。在薪資水平方面,總體還是令人滿意的,主要集中在月薪6~10 K,以及10~20 K之間,月薪在10 K以上和以下的各占大約50%,整體的收入水平保持在一個(gè)比較高的水準(zhǔn)。
圖5 上海各就業(yè)種類招聘情況
圖6 上海招聘收入情況
在前文對(duì)上海市總體的收入水平進(jìn)行了直觀判斷基礎(chǔ)上,繼而得到上海各地區(qū)招聘收入情況如圖7所示,上海各就業(yè)種類招聘收入如圖8所示,以便能夠?qū)蜆I(yè)選擇以及未來(lái)職業(yè)規(guī)劃進(jìn)行準(zhǔn)確及有效判斷。從圖7中可以看出,上海各地區(qū)的收入情況差距不大,但是整體上來(lái)看,徐匯區(qū)還是略高一籌,這樣在選擇就業(yè)時(shí)可以根據(jù)地區(qū)消費(fèi)的不同,以及未來(lái)規(guī)劃選擇工作區(qū)域。從圖8中可以看出,薪資水平處于前三位的行業(yè)分別是產(chǎn)品行業(yè)、管理行業(yè)以及技術(shù)行業(yè)。而在數(shù)據(jù)分析后得出,在提供崗位數(shù)量最多的技術(shù)崗上,工資并不是最高,有些崗位雖然需求量不大,但是薪水很高。而且,從薪資分布來(lái)看,80%以上的行業(yè)的月收入都已經(jīng)達(dá)到10 K或者10 K以上了,這樣人們?cè)谶x擇就業(yè)的時(shí)候,可以更少地受到薪資影響,從而做出更適合自己的選擇。
圖7 上海各地區(qū)招聘收入情況
圖8 上海各就業(yè)種類招聘收入
本文通過(guò)Python加上MySQL Server的配置,創(chuàng)建了一個(gè)基于BOSS直聘網(wǎng)站的網(wǎng)絡(luò)爬蟲(chóng)數(shù)據(jù)收集分析系統(tǒng),該系統(tǒng)能夠登錄到BOSS直聘,并獲取頁(yè)面信息,分析頁(yè)面中的URL,同時(shí)對(duì)篩選構(gòu)造后的URL再一次進(jìn)行數(shù)據(jù)篩選,將用戶獲取到的數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù),在此基礎(chǔ)上將對(duì)數(shù)據(jù)進(jìn)行深層次的挖掘,也就是運(yùn)用一系列的數(shù)據(jù)分析手段,獲得關(guān)于上海各地區(qū)、各崗位的薪資待遇、招聘需求等一系列重要信息,為廣大的就業(yè)人員提供有益的借鑒與參考。