賈宗星 馮倩
摘? 要: 研究并設(shè)計(jì)實(shí)現(xiàn)了一個(gè)基于Python的爬蟲,用來(lái)爬取拉勾網(wǎng)數(shù)據(jù)資源。針對(duì)想要的信息數(shù)據(jù)進(jìn)行定向爬取,對(duì)爬取到的信息進(jìn)行存儲(chǔ)、數(shù)據(jù)清洗及可視化分析。最終得到全國(guó)范圍內(nèi)招聘Python工程師的公司以及相關(guān)的待遇及要求。
關(guān)鍵詞: Python; 爬蟲; 數(shù)據(jù)清洗; 可視化分析
中圖分類號(hào):TP399? ? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A? ? ?文章編號(hào):1006-8228(2022)02-05-03
Crawling and analyzing data of lagou.com with Python
Jia Zongxing, Feng Qian
(College of Information Science and Engineering, Shanxi Agricultural University, Taigu, Shanxi 030801, China)
Abstract: In this paper, a Python based crawler is designed and implemented to crawl data resources of lagou.com. Directional crawling is carried out for the desired information data, and the crawling information is stored, cleaned and visually analyzed. Finally, the company that recruits Python engineers nationwide and relevant treatment and requirements is obtained.
Key words: Python; crawler; data cleaning; visual analysis
0 引言
每到畢業(yè)季,畢業(yè)生須對(duì)招聘職位等信息有詳細(xì)地了解,才能更好地應(yīng)聘到心儀的工作。比如,要了解全國(guó)范圍內(nèi)招聘Python工程師的公司以及相關(guān)的待遇及要求,網(wǎng)上有海量招聘信息,靠人工采集數(shù)據(jù)方式速度慢效率低,且容易出錯(cuò)。本文針對(duì)此種情況,設(shè)計(jì)出了一個(gè)基于Python的爬蟲,用來(lái)爬取拉勾網(wǎng)招聘信息,并對(duì)這些數(shù)據(jù)進(jìn)行清洗以及可視化的分析,最后得到想要的信息。
1 相關(guān)技術(shù)介紹
1.1 Python語(yǔ)言
Python 語(yǔ)言作為一種當(dāng)前最為流行的數(shù)據(jù)分析語(yǔ)言, 有著簡(jiǎn)單易學(xué)、 面向?qū)ο蟆?可擴(kuò)展、 庫(kù)豐富等特點(diǎn)[1]。
1.2 網(wǎng)絡(luò)爬蟲技術(shù)
網(wǎng)絡(luò)爬蟲,又稱蜘蛛機(jī)器人,是抓取網(wǎng)頁(yè)數(shù)據(jù)的程序,最終是根據(jù)用戶需求,在一定規(guī)則下,得到用戶需要的數(shù)據(jù)信息[2]。爬蟲模塊的系統(tǒng)框架由解析器、控制管理器、資源庫(kù)這三部分組成??刂破鞯氖滓蝿?wù)是給多線程中的各個(gè)小爬蟲線程確定它們的工作任務(wù)。解析器的主要作用是進(jìn)行網(wǎng)頁(yè)的下載,頁(yè)面的整理。資源庫(kù)的作用是存放下載好的網(wǎng)頁(yè)信息,通常采用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)。
2 拉勾網(wǎng)數(shù)據(jù)爬取與分析
本文選取的目標(biāo)網(wǎng)址為:拉勾網(wǎng)https://www.lagou.com。這是較專業(yè)的互聯(lián)網(wǎng)相關(guān)行業(yè)招聘網(wǎng)站,速度快,職位多。本文要抓取的內(nèi)容是全國(guó)范圍內(nèi)招聘Python工程師的公司相關(guān)的要求信息及待遇,包括崗位id、所在城市、公司全名、工作地點(diǎn)、學(xué)歷要求、職位名稱、薪資以及工作年限等。
本次設(shè)計(jì)將爬取到的信息存到Excel表中,以表格及圖表的形式來(lái)進(jìn)行結(jié)果的展示。
2.1 數(shù)據(jù)的獲取
利用爬蟲獲取數(shù)據(jù)的思路就可以確定為:發(fā)送get請(qǐng)求,獲取session、更新session,發(fā)送post請(qǐng)求、獲取數(shù)據(jù)并存儲(chǔ)。具體實(shí)現(xiàn)如下:
首先設(shè)置要請(qǐng)求的頭文件。請(qǐng)求頭文件是訪問網(wǎng)站時(shí)訪問者的一些信息,如果不設(shè)置頭文件的話,很大程度會(huì)因?yàn)樵L問頻度過(guò)高而被當(dāng)作機(jī)器人封殺。再通過(guò)開發(fā)者工具獲取User-Agent和Referer。將以上內(nèi)容寫入代碼中:
my_headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS
X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36",? ? ? "Referer":https://www.lagou.com/jobs/list_Python?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=","Content-Type":
"application/x-www-form-urlencoded;charset=UTF-8"
}
其次在測(cè)試時(shí)發(fā)現(xiàn)一次最多能爬取1-3頁(yè)爬蟲就會(huì)被中斷,解決辦法是使用time.sleep()間隔爬取。
接下來(lái)就是session的獲取以及兩次請(qǐng)求的發(fā)送,代碼如下:
ses=requests.session() #通過(guò)requests獲取session
ses.headers.update(my_headers)
#對(duì)頭文件中的session進(jìn)行更新
ses.get(
"https://www.lagou.com/jobs/list_python?city=
%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=")
content = ses.post(url=url, data=datas)
這樣就可以得到存儲(chǔ)職位信息的json對(duì)象,先創(chuàng)建一個(gè)空的列表,然后對(duì)json格式的數(shù)據(jù)進(jìn)行編碼轉(zhuǎn)換,遍歷獲得工作地點(diǎn)、學(xué)歷要求、公司名、發(fā)布時(shí)間、職位名稱、工作年限、福利待遇、工作類型、薪資等,這樣數(shù)據(jù)獲取的工作就完成了。
2.2 爬蟲主函數(shù)的編寫
首先確定將要交給爬蟲的工作量,代碼如下:
page=int(input('請(qǐng)輸入你要抓取的頁(yè)碼總數(shù):')),
接下來(lái)設(shè)置一個(gè)空的列表,并設(shè)置好表頭信息,代碼如下:
info_result=[]
title=['崗位id', '城市', '公司全名', '福利待遇', '工作類型',
'工作地點(diǎn)', '學(xué)歷要求','發(fā)布時(shí)間', '職位名稱', '薪資',
'工作年限']
info_result.append(title)
之后利用循環(huán)以及try,except模塊循環(huán)采集信息。代碼如下:
for x in range(1, page+1):
url'https://www.lagou.com/jobs/positionAjax.json?
needAddtionalResult=false'
datas={
'first': 'false',
'pn': x,
'kd': 'python',
}
try:
info=get_json(url, datas)
info_result=info_result + info
print("第%s頁(yè)正常采集" % x)
except Exception as msg:
print("第%s頁(yè)出現(xiàn)問題" % x)
采集好信息后,將采集到的信息存儲(chǔ)在Excel表中以備待用。
3 數(shù)據(jù)的可視化展示
這里主要對(duì)上面爬取到的數(shù)據(jù)進(jìn)行清洗和分析,再通過(guò)Excel表可視化展示。基本步驟為:提出問題,理解數(shù)據(jù),數(shù)據(jù)清洗[4],構(gòu)建模型,數(shù)據(jù)可視化[5]。
3.1 提出問題
本次數(shù)據(jù)分析主要研究的問題為:
⑴ 各個(gè)城市的招聘情況;
⑵ Python工程師招聘對(duì)于學(xué)歷的要求;
⑶ Python工程師招聘對(duì)于工作年限的要求。
3.2 理解數(shù)據(jù)
本次爬取的數(shù)據(jù)一共有10個(gè)字段,如表1所示。
3.3 數(shù)據(jù)清洗
數(shù)據(jù)清洗的步驟為:①選擇子集,②列名重命名,③刪除重復(fù)值,④缺失值處理,⑤一致化處理,⑥數(shù)據(jù)排序,⑦異常值處理。
⑴ 選擇子集
根據(jù)提出的問題,本次分析主要要用到的有positionId、city、district、education、salary以及workYear字段。先將不需要的信息進(jìn)行刪除或隱藏,可以得到清洗結(jié)果,如圖1所示。
⑵ 刪除重復(fù)項(xiàng)
在前面的步驟中列名已經(jīng)設(shè)置好了,所以可以忽略列名的重命名這項(xiàng)工作,直接進(jìn)行刪除重復(fù)項(xiàng)的工作。由于每一個(gè)崗位都有一個(gè)它們獨(dú)特的崗位id,所以可以用該id鍵做主鍵進(jìn)行去重操作,刪除重復(fù)項(xiàng)。
⑶ 缺失值處理
對(duì)刪除過(guò)重復(fù)項(xiàng)的數(shù)據(jù)進(jìn)行查看,發(fā)現(xiàn)不存在缺失值,所以這項(xiàng)操作就可以直接忽略了。如果存在缺失值的話,可以用以下方式進(jìn)行填充。①通過(guò)人工手動(dòng)補(bǔ)全。②刪除缺失數(shù)據(jù)。③用平均數(shù),中位數(shù),眾數(shù)等統(tǒng)計(jì)值進(jìn)行代替。④用機(jī)器學(xué)習(xí)的算法或者是統(tǒng)計(jì)模型來(lái)計(jì)算出相應(yīng)的值,并用該數(shù)據(jù)進(jìn)行填充。
⑷ 一致化處理
對(duì)于薪資列,都是數(shù)字,之后可能會(huì)進(jìn)行排序的操作,而且這部分的數(shù)據(jù)以范圍的形式存在,不好處理。所以將這個(gè)薪水列細(xì)化為:最低月薪[bottom],最高月薪[top],平均月薪三列。
3.4 構(gòu)建模型和數(shù)據(jù)可視化
數(shù)據(jù)清洗的工作做完之后,就開始進(jìn)行模型的構(gòu)建,這部分主要用到的Excel表中的數(shù)據(jù)透視圖來(lái)進(jìn)行關(guān)系之間的建模。根據(jù)提出的問題構(gòu)建模型:Python工程師招聘對(duì)于學(xué)歷的要求(如圖2)。
從圖2可以看出,我國(guó)對(duì)于Python工程師的學(xué)歷并不是很看重。本科生的機(jī)會(huì)崗位有360個(gè),占了總崗位數(shù)量的82%。大專學(xué)歷次之。也就是說(shuō),現(xiàn)階段對(duì)于Python工程師人才需求,準(zhǔn)入的門檻不高。
Python工程師各個(gè)城市的招聘情況如圖3所示。由圖3各個(gè)城市的招聘情況看,北京明顯一枝獨(dú)秀,有148個(gè)崗位機(jī)會(huì),上海和深圳次之,分別有87和75個(gè)。可以看出北上深等城市對(duì)于Python工程師的需求多。
Python工程師招聘對(duì)于工作年限的要求如圖4所示。從圖4可以看出,3-5年工作經(jīng)驗(yàn)的機(jī)會(huì)崗位比較多,幾乎占據(jù)了總崗位的一半。接下來(lái)是1-3年工作經(jīng)驗(yàn)的,有137個(gè)。而招聘應(yīng)屆生和工作經(jīng)驗(yàn)在一年以下的幾乎沒有。
4 結(jié)論
本文設(shè)計(jì)了一個(gè)基于Python的爬蟲,爬取拉勾網(wǎng)招聘信息,對(duì)數(shù)據(jù)進(jìn)行清洗以及可視化的分析。通過(guò)可視化的圖表分析得出:北上深等一線城市對(duì)Python工程師的需求較多,對(duì)于Python工程師的學(xué)歷要求不高,但對(duì)工作經(jīng)驗(yàn)要求較高。
參考文獻(xiàn)(References):
[1] 宋超,華臻.電腦編程技巧與維護(hù)[J].2021.2
[2] 郭鋒鋒.基于python的網(wǎng)絡(luò)爬蟲研究[J].佳木斯大學(xué)學(xué)報(bào)
(自然科學(xué)版),2020.3
[3] 張懿源,武帥等.基于Python的疫情后就業(yè)影響分析[J].
計(jì)算機(jī)時(shí)代,2021(1)
[4] 戴瑗,鄭傳行.基于Python的南京二手房數(shù)據(jù)爬取及分析[J].
計(jì)算機(jī)時(shí)代,2021(1)
[5] 魏程程.基于Python的數(shù)據(jù)信息爬蟲技術(shù)[J].電子世界,
2018(11):208-209