劉洋 田儒賢 唐蘭文
摘要:近年來(lái),隨著互聯(lián)網(wǎng)與通信技術(shù)的迅猛發(fā)展,數(shù)據(jù)的快速增長(zhǎng)成了許多行業(yè)共同面對(duì)的嚴(yán)峻挑戰(zhàn)和寶貴機(jī)遇,各種開(kāi)發(fā)網(wǎng)站技術(shù)也呈現(xiàn)出層出不窮的趨勢(shì),異步加載技術(shù)因此得到了廣泛的應(yīng)用。如何高效完整的獲取異步加載數(shù)據(jù)顯得極為重要。以車型CCC證書(shū)網(wǎng)站為研究對(duì)象,采用WebDriver模擬網(wǎng)頁(yè)瀏覽技術(shù)請(qǐng)求網(wǎng)站,能夠?qū)︱?yàn)證碼進(jìn)行識(shí)別,繞過(guò)爬蟲(chóng)檢測(cè),獲取到同Ajax異步加載技術(shù)相同的數(shù)據(jù)。
關(guān)鍵詞:WebDriver;定向爬蟲(chóng);CCC證書(shū)網(wǎng)站
中圖分類號(hào):TP311
文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)03-0034-03
1 概述
隨著“Web 2.0”的概念誕生和不斷發(fā)展,當(dāng)今網(wǎng)站則更注重用戶的交互作用,用戶既是網(wǎng)站內(nèi)容的瀏覽者,也是網(wǎng)站內(nèi)容的制造者[1]。為了與之內(nèi)容相適應(yīng),網(wǎng)站大量采用了Ajax技術(shù),為了使文件的體積變小,經(jīng)常會(huì)引用被壓縮后JavaScript腳本。這些技術(shù)在提高網(wǎng)站開(kāi)發(fā)效率、改善用戶體驗(yàn)的同時(shí),也對(duì)于以靜態(tài)頁(yè)面分析為主的傳統(tǒng)網(wǎng)頁(yè)爬蟲(chóng)提出了新的挑戰(zhàn)。采用Ajax技術(shù)爬蟲(chóng)策略,具有一定的局限性,主要體現(xiàn)在三點(diǎn):1)Ajax請(qǐng)求的url中含有隨機(jī)數(shù),2)Ajax請(qǐng)求的url禁止直接訪問(wèn),必須構(gòu)建請(qǐng)求頭;3)對(duì)敏感信息進(jìn)行加密,每次更改爬取目標(biāo)時(shí)都需要重新分析構(gòu)建Ajax請(qǐng)求的url,無(wú)形之中增加了爬蟲(chóng)重新定向所需的工作量[2]。而WebDriver技術(shù)的出現(xiàn)恰好可以解決這個(gè)難題,能夠在復(fù)雜的網(wǎng)頁(yè)環(huán)境中,獲取到實(shí)際有效的數(shù)據(jù)[3]。
2 WebDriver技術(shù)簡(jiǎn)介
WebDriver是Selenium(-個(gè)瀏覽器自動(dòng)化操作框架)一個(gè)非常重要的工具,針對(duì)各個(gè)瀏覽器而開(kāi)發(fā),支持Firefox(Firefox-Driver)、IE(IntemetExplorerDriver)、Opera(OperaDriver)和Chrome(ChromeDriver)。 它還支持Android(AndroidDriver)和iPhone(IPhoneDriver)的移動(dòng)應(yīng)用瀏覽器。除了來(lái)自瀏覽器廠商的支持,它還提供了各種語(yǔ)言環(huán)境的API,可以采用Python、Ruby、Java、C#等開(kāi)發(fā)人員熟悉的編程語(yǔ)言來(lái)編寫(xiě)應(yīng)用程序。
3 實(shí)驗(yàn)與設(shè)計(jì)
本實(shí)驗(yàn)采用WebDriver技術(shù),模擬用戶瀏覽網(wǎng)站,支持Ajax動(dòng)態(tài)加載技術(shù),執(zhí)行JavaScript腳本,獲取頁(yè)面元素,而無(wú)須網(wǎng)絡(luò)通信、腳本執(zhí)行流程等細(xì)節(jié),借助第三方破解驗(yàn)證碼API對(duì)其進(jìn)行識(shí)別,繞過(guò)機(jī)器檢測(cè),從而獲取到數(shù)據(jù)[4]。具體設(shè)計(jì)流程如圖1所示。
3.1 搭建實(shí)驗(yàn)運(yùn)行環(huán)境
本實(shí)驗(yàn)設(shè)計(jì)的程序所需要的環(huán)境配置如表l所示,電腦的硬件要求為Intel Core i5處理器,運(yùn)行內(nèi)存為16G,使用wm7操作系統(tǒng)。開(kāi)發(fā)工具為MyEclipse2014,采用Java作為開(kāi)發(fā)語(yǔ)言,jdk版本為1.7,數(shù)據(jù)存儲(chǔ)使用Oracle llg,運(yùn)用Chrome瀏覽器作為WebDriver運(yùn)行的載體,除此之外,還需要下載與之對(duì)應(yīng)的Chrome驅(qū)動(dòng),需要注意的是,所用到的瀏覽器必須與驅(qū)動(dòng)相對(duì)應(yīng),否則會(huì)出現(xiàn)無(wú)法啟動(dòng)程序的異常。瀏覽器與驅(qū)動(dòng)版本對(duì)應(yīng)關(guān)系如表2所示,由于篇幅有限,本文只列出部分僅供參考。
3.2 處理驗(yàn)證碼
搭建好環(huán)境之后,便可以借助WebDriver啟動(dòng)瀏覽器,本實(shí)驗(yàn)所爬取的網(wǎng)站,采用了驗(yàn)證碼技術(shù)對(duì)爬蟲(chóng)進(jìn)行檢測(cè)校驗(yàn)。實(shí)驗(yàn)使用名為“超級(jí)鷹”的打碼軟件,對(duì)驗(yàn)證碼進(jìn)行識(shí)別,該軟件對(duì)干擾項(xiàng)較多的驗(yàn)證碼識(shí)別成功率較高,擁有能夠快速集成圖片識(shí)別API,廣泛支持各種編程語(yǔ)言,且支持多種不同類型的驗(yàn)證碼格式,同時(shí)具有比較高的穩(wěn)定性。實(shí)驗(yàn)截取的其中一張驗(yàn)證碼圖片如圖2所示:
WebDriver提供了豐富的元素定位API(完整的API列表可以查看WebDriver的文檔手冊(cè)),首先調(diào)用findElement方法,通過(guò)獲取img標(biāo)簽的id屬性定位到驗(yàn)證碼圖片的元素[5],然后對(duì)目標(biāo)元素進(jìn)行截屏成圖片并保存到本地,最后調(diào)用識(shí)別軟件的PostPic方法,填人格式類型,本地圖片路徑,秘鑰等參數(shù),返回json字符串示例:
f”err_ no”:0,
”err str”:”O(jiān)K”,
”pic_id”:”16622285 16102”,
”pic_str':”8vka”,
"md5”:”35d5c7f6f53223fbdc5b72783dbOc2c0"
J.其中pic_str即為我們所需要獲取到的驗(yàn)證碼數(shù)據(jù)。
3.3 請(qǐng)求網(wǎng)址
拿到驗(yàn)證碼之后,通過(guò)請(qǐng)求地址,返回實(shí)驗(yàn)所需要獲取到的數(shù)據(jù),具體步驟如下。
(1)打開(kāi)指定URL的Web頁(yè)面,關(guān)鍵代碼如下cDriver=new RemoteWebDriver(service.getUrlO,DesiredCapabilities.chromeO);cDriver.get(url),其中cDriver為初始化WebDriver對(duì)象,指定打開(kāi)Chrome瀏覽器,這一步操作和普通爬蟲(chóng)工具相同,沒(méi)有與網(wǎng)站進(jìn)行任何交互,可以獲取到整個(gè)html文件源碼。
(2)定位目標(biāo)元素,由于本實(shí)驗(yàn)背景為某個(gè)車型CCC證書(shū)查詢網(wǎng)站,需要輸入對(duì)應(yīng)的證書(shū)編號(hào),調(diào)用findElement方法查找元素,再調(diào)用sendKeys方法來(lái)模擬用戶輸入所需要查詢的證書(shū)編號(hào),獲取驗(yàn)證碼詳細(xì)方法見(jiàn)步驟3.2。
(3)如果返回的源碼文件中包含“沒(méi)有查詢到數(shù)據(jù)”的字樣,則直接返回message消息,本次循環(huán)結(jié)束,否則執(zhí)行步驟(4)。 (4)執(zhí)行交互操作。調(diào)用上述這些元素定位函數(shù)后,會(huì)返回一個(gè)WebElement對(duì)象,通過(guò)調(diào)用該對(duì)象的成員方法即可實(shí)現(xiàn)針對(duì)此元素的交互操作。通過(guò)xPath,根據(jù)input標(biāo)簽的type屬性,定位到查詢按鈕,調(diào)用click方法去觸發(fā)Ajax向服務(wù)器異步請(qǐng)求數(shù)據(jù),最后再調(diào)用cDriver.getPageSource0獲取到查詢條件后的html源碼,上述步驟的關(guān)鍵部分代碼如下:
WebElement keyword=cDriver. findElement(By. name(”key-word”));keyword.sendKeys(certNumber);
imagePassword.sendKeys (verifyCode);
WebElement button=cDriver. findElement(By. xpath(”//input[@type=submit,]”));
button. click0;
cDriver. manage0. timeouts0. pageLoadTime-out(60, TimeUnit.SECONDS);
String pageSource= cDriver.getPageSource0;,如果驗(yàn)證碼正確,則進(jìn)入步驟(5),否則重復(fù)步驟(2),直到獲取到數(shù)據(jù)。
(5)解析數(shù)據(jù),存人數(shù)據(jù)庫(kù),結(jié)束循環(huán)整個(gè)請(qǐng)求地址的流程如圖3所示:
3.4 解析頁(yè)面存入數(shù)據(jù)庫(kù)
實(shí)驗(yàn)采用Jsoup技術(shù)來(lái)解析獲取到html源碼文件,它是一款Java的HTML解析器,可直接解析某個(gè)URL地址、HTML文本內(nèi)容,提供了非常便利的API,可以通過(guò)操作DOM節(jié)點(diǎn),或者類似于Jquery的操作方法來(lái)解析數(shù)據(jù)[6]。通過(guò)步驟3.3獲取到的部分源碼文件如圖4所示。
拿到html源文件后,調(diào)用Jsoup的parse方法對(duì)源碼進(jìn)行解析,部門關(guān)鍵代碼如下
Document doc= Jsoup.parse(htmlCode);
Element aIITrNode=doc. getElementsByTag(”table”).get(4).getElementsByTag(”tbody”)
.get(O).getElementsByTag(”tr”).get(0);
然后依次獲取tr元素下每個(gè)td元素,便可以取到所有數(shù)據(jù)
4 結(jié)束語(yǔ)
本文以車輛CCC證書(shū)查詢網(wǎng)站為研究背景,分析了傳統(tǒng)爬蟲(chóng)方法存在的弊端,將實(shí)驗(yàn)分為四個(gè)部分:運(yùn)行環(huán)境的搭建,識(shí)別驗(yàn)證碼,采集數(shù)據(jù),解析數(shù)據(jù)并存人數(shù)據(jù)庫(kù),采用Web-Driver技術(shù)啟動(dòng)瀏覽器,模擬用戶完成對(duì)頁(yè)面的交互操作從而獲取到實(shí)驗(yàn)數(shù)據(jù)。本文所設(shè)計(jì)的爬蟲(chóng)程序仍有一些局限性,例如,不能支持多個(gè)證書(shū)編號(hào)同時(shí)運(yùn)行,采集速度上還有待研究,仍然需要對(duì)其不斷完善,便于后期對(duì)該技術(shù)的持續(xù)利用。
參考文獻(xiàn):
[1]賀杰.基于Webdriver爬蟲(chóng)技術(shù)的研究[D].南昌:江西財(cái)經(jīng)大學(xué)軟件與通信學(xué)院,2016.
[2]孫駿雄.基于網(wǎng)絡(luò)爬蟲(chóng)的網(wǎng)站信息采集技術(shù)研究[D].大連:大連海事大學(xué),2014.
[3]時(shí)永坤.基于WebDriver的定向網(wǎng)絡(luò)爬蟲(chóng)設(shè)計(jì)與實(shí)現(xiàn)[D].北京:華北計(jì)算技術(shù)研究所,2016.
[4]李曉堂,詹峰,龍能,基于SNS的社區(qū)網(wǎng)絡(luò)服務(wù)架構(gòu)與設(shè)計(jì)[J].軟件,2014,35(2):23-24.
[5]洪立印,徐蔚然.一種結(jié)構(gòu)化數(shù)據(jù)關(guān)系特征抽取和表示模型[J].軟件,2013,34(12):148-151.