朱麗英, 吳錦晶
(公安部第三研究所 物聯(lián)網(wǎng)技術(shù)研發(fā)中心, 上海 201204)
在過去幾年中,人工智能出現(xiàn)了爆炸式的發(fā)展,其在交通和治安領(lǐng)域中的應(yīng)用場(chǎng)景越來越多元化,其中車輛品牌、款系和年代識(shí)別功能不僅有助于套牌車輛篩查,而且正逐步發(fā)展成為刑偵工作中的重要技術(shù)手段。為實(shí)現(xiàn)車輛品牌、款系和年代識(shí)別功能,需要人工標(biāo)注大量的訓(xùn)練樣本,而人工標(biāo)注過程中需要相應(yīng)的車輛品牌圖片進(jìn)行參考?;诮④囕v品牌參考庫(kù)的迫切需求,本文提出了一種基于自動(dòng)化測(cè)試的定向爬蟲程序的設(shè)計(jì)與實(shí)現(xiàn)。通過自動(dòng)化測(cè)試技術(shù)模擬人瀏覽網(wǎng)頁(yè)的方式,自動(dòng)化地采集指定網(wǎng)頁(yè)的車輛品牌外觀圖片,從而建立一個(gè)款系、年代分類別存儲(chǔ)的車輛品牌參考庫(kù)。
網(wǎng)絡(luò)爬蟲技術(shù)[1]又被稱為網(wǎng)絡(luò)機(jī)器人、網(wǎng)路蜘蛛,是一種按照規(guī)則,自動(dòng)抓取信息的程序或者腳本,是用戶從互聯(lián)網(wǎng)中獲取信息資源的有效工具。通用網(wǎng)絡(luò)爬蟲[2]從一個(gè)或若干初始網(wǎng)頁(yè)的URL開始, 獲得初始網(wǎng)頁(yè)上的URL列表;在抓取網(wǎng)頁(yè)的過程中,不斷從當(dāng)前頁(yè)面上抽取新的URL放入待爬行隊(duì)列,直到滿足系統(tǒng)的停止條件。通用網(wǎng)絡(luò)爬蟲的目標(biāo)就是盡可能多地采集信息頁(yè)面,而在這一過程中它并不太在意頁(yè)面采集的順序和被采集頁(yè)面的相關(guān)主題。
然隨著網(wǎng)絡(luò)的不斷普及,網(wǎng)絡(luò)上的海量信息呈爆炸式增長(zhǎng),用戶的需求也越來越個(gè)性化,定向網(wǎng)絡(luò)爬蟲應(yīng)運(yùn)而生。定向網(wǎng)絡(luò)爬蟲,顧名思義就是定向爬取目標(biāo)網(wǎng)站,該種方法只對(duì)系統(tǒng)指定的網(wǎng)址進(jìn)行數(shù)據(jù)采集,通過在系統(tǒng)中根據(jù)目標(biāo)網(wǎng)站的特點(diǎn)設(shè)定的模板,可以使系統(tǒng)達(dá)到很高的數(shù)據(jù)精度。另外,對(duì)于網(wǎng)頁(yè)更新速度快的數(shù)據(jù)源,采用增量式的采集方法也是尤為必要的[3]。增量式網(wǎng)絡(luò)爬蟲是指對(duì)已下載網(wǎng)頁(yè) 采取增量式更新和只爬行新產(chǎn)生的或者已經(jīng)發(fā)生變化網(wǎng)頁(yè)的爬蟲,它能夠在一定程度上保證所爬行的頁(yè)面是盡可能新的頁(yè)面,可有效減少數(shù)據(jù)下載量,減小時(shí)間和空間上的耗費(fèi)。
本文聚焦車輛品牌外觀圖片的爬取,網(wǎng)絡(luò)爬蟲的過程是以一個(gè)URL為初始點(diǎn),獲取該網(wǎng)頁(yè)上的多個(gè)URL,放入U(xiǎn)RL列表進(jìn)行循環(huán)獲取,直到滿足停止條件。為提高工作效率,通用網(wǎng)絡(luò)爬蟲會(huì)采取一定的爬行策略,常用的爬行策略[4]有深度優(yōu)先策略、廣度優(yōu)先策略。本文采取深度優(yōu)先策略,其基本方法是從根節(jié)點(diǎn)出發(fā),依次訪問下一級(jí)葉子節(jié)點(diǎn)的網(wǎng)頁(yè)鏈接,直到不能再深入為止。爬蟲在完成一個(gè)爬行分支后返回到上一鏈接節(jié)點(diǎn)進(jìn)一步搜索其它鏈接。當(dāng)所有鏈接遍歷完后,爬行任務(wù)結(jié)束。URL爬行模型如圖1所示。
自動(dòng)化測(cè)試[5]是基于手工測(cè)試而存在的,主要通過相應(yīng)的軟件測(cè)試工具、腳本等來實(shí)現(xiàn),具有較好的可操作性、可重復(fù)性和高效率等特點(diǎn)。Selenium是一個(gè)開源的、便攜式的自動(dòng)化軟件測(cè)試工具,提供一套測(cè)試函數(shù),用于支持Web應(yīng)用程序的自動(dòng)化測(cè)試,函數(shù)非常靈活,能夠完成界面元素定位、窗口跳轉(zhuǎn)、結(jié)果比較等,具體有如下特點(diǎn):能在不同的瀏覽器進(jìn)行測(cè)試,如IE、Mozilla Firefox、Mozilla Suite、Safari、Chrome、Android手機(jī)瀏覽器等;支持多種語(yǔ)言,如Java、Python、C#、Ruby等;支持多種操作系統(tǒng),如Windows、Linux、IOS、Android等。
圖1 URL爬行模型
目前網(wǎng)頁(yè)廣泛采用JS加載、Ajax 異步傳輸、前端MVC等動(dòng)態(tài)技術(shù),這些技術(shù)對(duì)于以靜態(tài)頁(yè)面分析為主的傳統(tǒng)網(wǎng)頁(yè)爬蟲提出了新的挑戰(zhàn),解決這種問題唯一的辦法是讓爬蟲自己變成一個(gè)沒有界面的瀏覽器?;赟elenium的網(wǎng)絡(luò)爬蟲能夠繞過某些頁(yè)面對(duì)于爬蟲的檢測(cè)和限制[6],它具有簡(jiǎn)單、靈活、仿真性強(qiáng)等優(yōu)點(diǎn),且可進(jìn)行基于無頭瀏覽器的數(shù)據(jù)抓取和捕獲,本文采用自動(dòng)化測(cè)試框架Selenium,以Python語(yǔ)言編寫網(wǎng)絡(luò)爬蟲程序,模擬人操做瀏覽器的方式,采集車輛品牌外觀圖片。
車輛品牌爬蟲的具體功能是對(duì)汽車之家品牌庫(kù)內(nèi)的所有品牌對(duì)應(yīng)的外觀圖片進(jìn)行抓取,存儲(chǔ)到本地磁盤。圖片存儲(chǔ)時(shí)需按照?qǐng)D片對(duì)應(yīng)的品牌、款系、年份等分類別存儲(chǔ),具體類別格式如“上汽大眾 凌渡 2014款 概念版”、“上汽大眾 凌渡 2015款 230TSI 手動(dòng)風(fēng)尚版”。另外,新車型不斷上市,汽車之家的品牌庫(kù)亦會(huì)不斷更新,為獲得新品牌圖片,需要具有對(duì)網(wǎng)站新變動(dòng)的部分進(jìn)行數(shù)據(jù)分析提取功能,達(dá)到增量式爬取的效果。
車輛品牌爬蟲整體流程如圖2所示。
啟動(dòng)Selenium,以無頭方式打開Chrome瀏覽起器,并加載汽車之家品牌庫(kù)URL。
在頁(yè)面解析,品牌款系URL、圖片數(shù)量提取的過程中,利用了Selenium的如下特性。
1)元素查找
Selenium中元素查找共有八種方法,可通過id、name、className、tagName、linkText、partialLinkText、xpath、cssSelector定位元素,其中的xpath定位具有更大的靈活性,對(duì)于html文檔樹中某個(gè)節(jié)點(diǎn)既可以向前搜索,也可以向后搜索,且可采用絕對(duì)定位方式或相對(duì)定位方式。本系統(tǒng)中主要通過xpath、 id、linkText等方式尋找特定頁(yè)面元素,如下述方法獲取品牌樹下的所有品牌鏈接:driver.find_elements_by_xpath("http://div[@class='cartree']/ul/li/h3/a")。
圖2 整體流程
2)鼠標(biāo)交互
通過Click操作頁(yè)面元素。進(jìn)入子品牌頁(yè)面,“車身外觀”、“下一頁(yè)”、“查看停產(chǎn)車型”等的頁(yè)面切換都是通過模擬鼠標(biāo)點(diǎn)擊操作完成。
3)異常處理
通過頁(yè)面元素查找失敗的異常捕獲,來判斷頁(yè)面上元素是否存在。
4)屬性獲取
通過元素屬性獲取方法get_attribute可獲得元素的各個(gè)屬性,如通過son_brand_ele.get_attribute('href')獲得品牌車款URL。
品牌款系URL提取的過程如圖3所示。
圖3 品牌款系URL提取過程
市面上新的車型不斷上市,汽車之家網(wǎng)站的品牌庫(kù)亦頻繁更新,因此車輛品牌爬蟲需不定期地爬取這一網(wǎng)站。為避免重復(fù)數(shù)據(jù)爬取,提高爬取效率,系統(tǒng)增加了對(duì)網(wǎng)站新變動(dòng)部分的數(shù)據(jù)分析提取功能,在重復(fù)爬取時(shí),僅對(duì)變動(dòng)部分進(jìn)行爬取。
車輛品牌爬蟲系統(tǒng)在爬取過程中對(duì)品牌圖片數(shù)量進(jìn)行了記錄。爬蟲啟動(dòng)后,在車輛品牌款系URL提取時(shí),同時(shí)提取了當(dāng)前網(wǎng)站各車輛品牌款系存在的圖片數(shù)量,而上次爬取時(shí)各車輛品牌款系的圖片數(shù)量則從文件中讀取,比較兩者的一致性,當(dāng)兩者不一致時(shí),才將車輛品牌款系URL加入到URL隊(duì)列。
每個(gè)車輛品牌的圖片數(shù)量多寡不一,每種車款對(duì)應(yīng)的“車身外觀”頁(yè)面,元素“下一頁(yè)”、“查看停產(chǎn)車型”不一定存在,因此,通過頁(yè)面元素查找失敗的異常捕獲,來判斷頁(yè)面上上述元素是否存在。并且,每一圖片的URL是固定不變的,通過URL提取的圖片名稱也是固定不變的,因此,當(dāng)重復(fù)爬取時(shí),可通過與已抓取圖片的名稱比較,來判斷該圖片是否已被抓取,只有本地磁盤中不存在的圖片才進(jìn)行抓取,圖片下載存儲(chǔ)流程如圖4所示。
圖4 圖片下載存儲(chǔ)流程
本文在充分觀察了汽車之家網(wǎng)頁(yè)結(jié)構(gòu)之后,利用自動(dòng)化測(cè)試工具Selenium,設(shè)計(jì)和實(shí)現(xiàn)了基于汽車之家品牌庫(kù)的定向網(wǎng)絡(luò)爬蟲。通過增量式的爬取,使得該爬蟲系統(tǒng)能夠非常高效地抓取目標(biāo)數(shù)據(jù)。通過本爬蟲系統(tǒng),為車輛品牌識(shí)別系統(tǒng)提供了相對(duì)完備的品牌參考庫(kù)。