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