裴麗麗
(山西機(jī)電職業(yè)技術(shù)學(xué)院,山西 長(zhǎng)治 046011)
隨著互聯(lián)網(wǎng)行業(yè)的蓬勃發(fā)展,網(wǎng)絡(luò)的信息呈現(xiàn)爆炸式的增長(zhǎng),大數(shù)據(jù)時(shí)代隨之而來。如何在海量信息中尋找滿足自己需求的信息,無論是搜索引擎還是個(gè)人或者組織,要獲取目標(biāo)數(shù)據(jù),都要從公開網(wǎng)站爬取數(shù)據(jù),在這樣的需求之下,網(wǎng)絡(luò)爬蟲技術(shù)應(yīng)運(yùn)而生[1]。
本文提出使用Selenium自動(dòng)化測(cè)試工具進(jìn)行Boss直聘網(wǎng)數(shù)據(jù)爬取,可以繞過Boos直聘網(wǎng)設(shè)置的反爬手段,獲取到崗位名稱、工作地點(diǎn)、薪資、工作描述等信息。之后將爬取到的數(shù)據(jù)存儲(chǔ)到boss.csv文件中,并對(duì)數(shù)據(jù)進(jìn)行分析和可視化展示,提高學(xué)生的專業(yè)和職業(yè)認(rèn)同感,同時(shí)為學(xué)生未來就業(yè)提供參考。
網(wǎng)絡(luò)爬蟲是可以自動(dòng)地大量抓取網(wǎng)頁數(shù)據(jù)的計(jì)算機(jī)程序和腳本,別稱:網(wǎng)絡(luò)蠕蟲、spider(網(wǎng)頁蜘蛛)[2]。它可以根據(jù)某種特定的策略去不斷抓取網(wǎng)絡(luò)站點(diǎn)信息,從而完成自動(dòng)抓取目標(biāo)數(shù)據(jù)。使用該技術(shù)可以從網(wǎng)絡(luò)中爬取有效的數(shù)據(jù)信息,以便后續(xù)用于分析研究。目前網(wǎng)絡(luò)爬蟲應(yīng)用最廣泛的語言是Python語言,該語言簡(jiǎn)單易學(xué),具有豐富的庫和框架,常用的庫有requests、re、bs4、lxml等,可以滿足爬蟲的需求。但是使用這些常規(guī)的庫,經(jīng)常會(huì)受到網(wǎng)站反爬機(jī)制的限制,無法獲取到待提取的數(shù)據(jù)。
Selenium是一個(gè)自動(dòng)化測(cè)試的工具,主要用于Web應(yīng)用程序。Selenium測(cè)試直接運(yùn)行在瀏覽器中,本質(zhì)是通過執(zhí)行程序自動(dòng)驅(qū)動(dòng)瀏覽器,并模擬瀏覽器的一系列操作行為,比如元素定位、翻頁、點(diǎn)擊、跳轉(zhuǎn)等,同時(shí)還可以獲取瀏覽器當(dāng)前呈現(xiàn)的頁面的源代碼,做到可見即可爬。可支持多種瀏覽器如Chorme,F(xiàn)ireFox,IE等[3]。使用Python、Selenium和谷歌瀏覽器組合進(jìn)行網(wǎng)絡(luò)爬蟲,可以繞過一些網(wǎng)站設(shè)置的反爬措施,達(dá)到爬取數(shù)據(jù)的目的。
使用Selenium自動(dòng)化爬取Boss直聘網(wǎng)數(shù)據(jù),主要分為四個(gè)步驟:1) 安裝并導(dǎo)入Selenium庫及谷歌瀏覽器對(duì)應(yīng)版本的chromedriver.exe;2) 創(chuàng)建瀏覽器對(duì)象并向網(wǎng)頁發(fā)送請(qǐng)求;3) 調(diào)用瀏覽器對(duì)象,在網(wǎng)頁源碼中進(jìn)行節(jié)點(diǎn)定義和元素提取及模擬瀏覽器進(jìn)行點(diǎn)擊翻頁等操作;4) 數(shù)據(jù)存儲(chǔ)。
導(dǎo)入Selenium庫中的webdriver模塊,創(chuàng)建瀏覽器對(duì)象,通過對(duì)象調(diào)用get方法向Boss直聘網(wǎng)中查找“爬蟲”相關(guān)崗位的網(wǎng)頁發(fā)送請(qǐng)求。
from selenium import webdriver
bro=webdriver. Chrome ()
bro. get(' https://www. zhipin. com/ job_detail/?query=爬蟲&city=100010000&industry=&position=' )
Selenium的webdriver提供了通過id標(biāo)簽值、name標(biāo)簽值、xpath、類名、CSS選擇器、鏈接文本等八類方法來定位頁面上的元素[4],可以定位一個(gè)元素,也可以定位多個(gè)元素。
在實(shí)際的頁面定位時(shí),根據(jù)網(wǎng)頁源碼的格式恰當(dāng)?shù)剡x擇定位頁面元素方法。本系統(tǒng)主要使用CSS選擇器來定位“工作名稱”,“地區(qū)”,“公司名稱”,“薪水”,“公司類型”和“公司福利”六種信息。由于要獲取當(dāng)前一頁的招聘信息,需要先找到包含所有招聘信息的標(biāo)簽,通過觀察發(fā)現(xiàn),每一則信息包含在li標(biāo)簽內(nèi),所有的li標(biāo)簽都包含在div標(biāo)簽
for li in lis:
area=li.find_element_by_css_selector('.job-area' )#地區(qū)
job_name=li.find_element_by_css_selector('.job-name a' )#工作名稱
company_name=li.find_element_by_css_selector('.company-text .name a' )#公司名稱
salary=li.find_element_by_css_selector('.job-limit clearfix .red' )#薪水
company_type=li.find_element_by_css_selector('.false-link' )#公司類型
company_fuli=li.find_element_by_css_selector('.info-desc' )#公司福利
定位到六種待提取的標(biāo)簽之后,通過text屬性即可提取出標(biāo)簽內(nèi)的文本內(nèi)容。輸出后的部分結(jié)果如圖1所示。
圖1 提取元素結(jié)果
獲取到一頁的招聘信息后,可以繼續(xù)通過Selenium實(shí)現(xiàn)自動(dòng)翻頁,繼續(xù)獲取后續(xù)的信息。此時(shí)需要先找到每一頁的翻頁按鈕,點(diǎn)擊進(jìn)行跳轉(zhuǎn),定位到源碼,源碼中有class="next"屬性,代碼為:bro.find_element_by_css_selector('.next' ).click(),將節(jié)點(diǎn)定位元素提取和翻頁操作作為get_job函數(shù)的函數(shù)體,為完整的一頁招聘信息提取過程。通過for循環(huán)語句,即可控制爬取具體頁數(shù),如爬取10頁招聘信息,代碼為:
for i in range(10):
time.sleep(2)
get_job()
本系統(tǒng)將爬取的數(shù)據(jù)存儲(chǔ)到boss.csv文件中,首先需要導(dǎo)入csv模塊,然后寫入表頭,寫入表頭的代碼為:
import csv
f=open(' boss.csv',mode="a",encoding="utf-8",newline="")
csv_writer=csv.DictWriter(f,fieldnames=[' 工作名稱',' 地區(qū)',' 公司名稱',' 薪水',' 公司類型',' 公司福利' ])
csv_writer.writeheader()
寫入表頭后,需要繼續(xù)寫入爬蟲獲取到的招聘信息,由于writerow可以接收字典格式的數(shù)據(jù),在每獲取到一則信息后,需要按行寫入csv文件,代碼為:
dict={"工作名稱":job_name,"地區(qū)":area,"公司名稱":company_name,"薪水":salary,"公司類型":company_type,"公司福利":company_fuli}
csv_writer.writerow(dict)
圖2 部分?jǐn)?shù)據(jù)存儲(chǔ)
數(shù)據(jù)分析前很重要的一個(gè)工作是數(shù)據(jù)清洗,以便于數(shù)據(jù)分析的結(jié)果更為準(zhǔn)確,其中,數(shù)據(jù)清洗主要有處理重復(fù)值、缺失值和臟數(shù)據(jù)。本系統(tǒng)以分析各地區(qū)平均薪資為例,說明數(shù)據(jù)清洗的過程。
首先要通過語句data=pd.read_csv(' boss.csv',encoding="gbk")讀取boss.csv數(shù)據(jù)并查看當(dāng)前數(shù)據(jù)是否存在重復(fù)值和缺失值,如果有,進(jìn)行去重復(fù)值和填充缺失值。其次我們觀察到部分地區(qū)信息太具體,例如“成都·武侯區(qū)·新會(huì)展中心”,需要提取出“成都”城市名,去掉后面的地區(qū)信息。最后針對(duì)當(dāng)前的薪水格式為“12-24 k”或者“12-18 k·15薪”,需要提取出最高和最低值,計(jì)算平均薪水。
通過語句data.duplicated().sum()查看是否有重復(fù)值,結(jié)果顯示存在,通過語句data.drop_duplicates(inplace=True)在原數(shù)據(jù)上進(jìn)行處理。
通過語句data.isnull().sum()查看是否有缺失值,結(jié)果顯示公司福利列有14條缺失值,通過語句data["公司福利"].fillna("無",inplace=True)在原數(shù)據(jù)上進(jìn)行處理。
通過split函數(shù)對(duì)地區(qū)列數(shù)據(jù)進(jìn)行分割,結(jié)果為列表,取出列表中的第一個(gè)元素,即為城市名。語句為data[' 地區(qū)' ]=data[' 地區(qū)' ].apply(lambda x:x.split('·' )[0])通過data[' 地區(qū)' ].unique()查看數(shù)據(jù)集包含的所有城市名。結(jié)果為:
array([’成都’,’長(zhǎng)沙’,’煙臺(tái)’,’西安’,’北京’,’深圳’,’上海’,’寧波’,’合肥’,’鄭州’,’廣州’,杭州’,’佛山’,’蕪湖’,’石家莊’,’武漢’,’天津’,’青島’,’東莞’,’渭南’,’南京’,’運(yùn)城’,’無錫’,’重慶’,’長(zhǎng)春’,’珠?!?,’沈陽’,’廈門’,’南寧’,’保定’,’淄博’,’大連’,’南昌’,’哈爾濱’,’蘇州’,’濟(jì)南’],dtype=object)
通過字符串的字符提取方法extract提取出薪水列的最低薪水和最高薪水,并計(jì)算平均值,代碼和結(jié)果如圖3所示。
圖3 計(jì)算平均薪水
本系統(tǒng)分析各個(gè)地區(qū)的平均薪水,需要對(duì)地區(qū)進(jìn)行分組,計(jì)算各組的平均薪水。結(jié)果顯示爬蟲工程師的薪水都比較高,其中佛山的平均薪水最高22.5 k,深入分析后發(fā)現(xiàn),是由于佛山只有一則招聘信息。平均薪水最高的前10個(gè)地區(qū)結(jié)果如圖4所示。
圖4 各地區(qū)平均薪水
為了使結(jié)果更加直觀,使用pyecharts庫對(duì)平均薪水最高排名前10的地區(qū)進(jìn)行可視化展示,繪制地區(qū)與平均薪水的柱狀圖,代碼與結(jié)果如圖5所示。
圖5 各地區(qū)平均薪水柱狀圖
爬蟲作為獲取數(shù)據(jù)的重要工具之一,廣泛應(yīng)用于各種網(wǎng)站,具有廣闊的應(yīng)用前景[4]。但是大部分的網(wǎng)站都設(shè)置了一些反爬機(jī)制,本系統(tǒng)采用Selenium框架繞過反爬機(jī)制,實(shí)現(xiàn)了Boss直聘網(wǎng)的招聘信息爬取,同時(shí)對(duì)求職者較關(guān)注的薪資進(jìn)行了分析并完成了可視化展示。數(shù)據(jù)分析和可視化適用于繼續(xù)分析其他有價(jià)值的信息。在《數(shù)據(jù)爬取》課程中以此為教學(xué)案例,讓學(xué)生看到本專業(yè)學(xué)生的就業(yè)前景,提升學(xué)生的專業(yè)和職業(yè)認(rèn)同感。