




摘? 要:網(wǎng)絡(luò)爬蟲是一種按照一定的規(guī)則,自動(dòng)地抓取網(wǎng)頁(yè)信息的程序或者腳本,因此編寫特定的網(wǎng)絡(luò)爬蟲可以用來(lái)對(duì)網(wǎng)頁(yè)進(jìn)行自動(dòng)化處理,從而達(dá)到提升工作效率的目的。文章針對(duì)同一個(gè)任務(wù)清單系統(tǒng),分別使用BeautifulSoup + requests和selenium兩種不同的爬蟲方法實(shí)現(xiàn)了網(wǎng)頁(yè)自動(dòng)化處理功能。并且通過(guò)對(duì)兩種方法的實(shí)現(xiàn)原理和運(yùn)行結(jié)果進(jìn)行分析,對(duì)兩種爬蟲方法進(jìn)行對(duì)比。
關(guān)鍵詞:爬蟲;網(wǎng)頁(yè)自動(dòng)化;BeautifulSoup+requests;selenium
中圖分類號(hào):TP391? ? ? ? ? ? ? ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):2096-4706(2021)16-0010-04
Implementation and Performance Comparison of Crawler Web Page Automatic Processing Based on BeautifulSoup + requests and selenium
LI Chenhao
(Wuhan Branch of China Mobile Hubei Co., Ltd., Wuhan? 430000, China)
Abstract: Web crawler is a program or script that automatically grabs web page information according to certain rules. Therefore, a specific web crawler can be written to process web pages automatically, which provides efficiency improvement. The paper uses two different crawler methods: BeautifulSoup + requests and selenium to implement webpage automatic processing function for the same task list system. By analyzing the implementation principle and operation results of the two methods, the two crawler methods are compared.
Keywords: crawler; webpage automation; BeautifulSoup+requests; selenium
0? 引? 言
網(wǎng)絡(luò)爬蟲是一種按照一定的規(guī)則,自動(dòng)地抓取網(wǎng)頁(yè)信息的程序或者腳本。它的基本工作方式是模擬人工的操作去訪問(wèn)網(wǎng)站,并且在網(wǎng)站查找數(shù)據(jù)或者發(fā)送數(shù)據(jù)。因此爬蟲不但能夠用來(lái)快速獲取網(wǎng)頁(yè)信息,而且能夠?qū)W(wǎng)頁(yè)進(jìn)行自動(dòng)化處理。
在實(shí)際工作中,碰到了一類任務(wù)清單系統(tǒng),需要對(duì)系統(tǒng)里的任務(wù)進(jìn)行處理。處理這些任務(wù)的操作大同小異,平均處理一條任務(wù)大約需要30秒到1分鐘。如果全程依靠人工來(lái)完成,不但耗費(fèi)時(shí)間長(zhǎng),而且還存在著人為誤差。因此,為了加快任務(wù)處理速度、提高任務(wù)處理準(zhǔn)確率、提升工作效率,編寫了python爬蟲腳本來(lái)對(duì)這些任務(wù)進(jìn)行自動(dòng)化處理。
最初版本的爬蟲是基于BeautifulSoup + requests庫(kù)的方法設(shè)計(jì)實(shí)現(xiàn)的,并且達(dá)到了預(yù)期的效果。后期由于新系統(tǒng)使用了遠(yuǎn)程訪問(wèn)模式,網(wǎng)址發(fā)生了變更,使得無(wú)法用原有方法進(jìn)行自動(dòng)化處理。因此重新編寫了一個(gè)新的基于selenium實(shí)現(xiàn)的爬蟲。兩種爬蟲方式雖然最終的都能達(dá)到相同的運(yùn)行效果,但是實(shí)現(xiàn)和性能上存在著不小的差異。
1? 基于BeautifulSoup + Requests的網(wǎng)頁(yè)自動(dòng)化腳本的設(shè)計(jì)與實(shí)現(xiàn)
1.1? 設(shè)計(jì)原理和思路
BeautifulSoup能夠從html/xml中通過(guò)標(biāo)簽很方便地提取數(shù)據(jù)[1]。Requests能夠向目標(biāo)網(wǎng)址發(fā)送http請(qǐng)求[2]。通過(guò)使用BeautifulSoup + requests的模式:先分析網(wǎng)頁(yè)源碼,再提取目標(biāo)網(wǎng)址,并發(fā)送http請(qǐng)求進(jìn)行數(shù)據(jù)傳輸,就能夠?qū)崿F(xiàn)網(wǎng)頁(yè)自動(dòng)化處理的功能。
1.2? 實(shí)現(xiàn)過(guò)程
1.2.1? 基本流程圖
該實(shí)現(xiàn)方法如圖1所示,首先使用requests包模擬用戶登錄,并用BeautifulSoup獲取頁(yè)面源碼。再使用循環(huán)對(duì)所有任務(wù)進(jìn)行遍歷,判斷當(dāng)前任務(wù)是否需要自動(dòng)處理。當(dāng)任務(wù)需要自動(dòng)處理的時(shí)候,使用requests跳轉(zhuǎn)到任務(wù)頁(yè)面鏈接,用BeautifulSoup獲取頁(yè)面源碼,再用requests的post方法模擬任務(wù)提交。
1.2.2? 模擬登錄
原系統(tǒng)登錄頁(yè)面采用的是“用戶名+密碼”的驗(yàn)證模式,驗(yàn)證通過(guò)后直接跳轉(zhuǎn)到系統(tǒng)內(nèi)部頁(yè)面。通過(guò)對(duì)系統(tǒng)登錄時(shí)發(fā)送的http請(qǐng)求進(jìn)行分析,發(fā)現(xiàn)當(dāng)前用戶的用戶名和密碼每次都以相同的密文保存在Request Headers的Cookie屬性中,并直接使用get方法發(fā)送。因此可以將此cookie作為固定值,傳入到get請(qǐng)求的header參數(shù)中,這樣就能夠模擬用戶進(jìn)行登錄。
1.2.3? 遍歷任務(wù)清單
通過(guò)分析網(wǎng)頁(yè)源碼,可以獲取任務(wù)清單的頁(yè)數(shù),而根據(jù)頁(yè)數(shù)就能夠構(gòu)造任務(wù)清單每一頁(yè)的URL。當(dāng)前頁(yè)中的每一條任務(wù)也都有一個(gè)鏈接。因此可以通過(guò)構(gòu)造每一頁(yè)的URL,先對(duì)頁(yè)進(jìn)行遍歷;再對(duì)每一頁(yè)中的任務(wù)進(jìn)行遍歷,達(dá)到對(duì)整個(gè)任務(wù)清單中的任務(wù)進(jìn)行遍歷的效果。
1.2.4? 模擬任務(wù)提交
經(jīng)過(guò)對(duì)任務(wù)頁(yè)面的源碼分析測(cè)試,發(fā)現(xiàn)頁(yè)面中填寫的所有信息都以json形式保存在form data表單中,并通過(guò)post方法提交給系統(tǒng)。因此可以根據(jù)實(shí)際要求制定邏輯,構(gòu)造一個(gè)提交表單form data,傳入到post請(qǐng)求的data參數(shù)中。這樣就能夠模擬用戶進(jìn)行任務(wù)提交。
1.3? 運(yùn)行結(jié)果
腳本中運(yùn)行后會(huì)顯示每次運(yùn)行處理的任務(wù)數(shù)量和總處理時(shí)間。其中處理任務(wù)較多的2次運(yùn)行結(jié)果如表1所示。
可以看出,平均每條任務(wù)處理時(shí)間在5~6秒。而人工處理一條任務(wù)所需要的時(shí)間大約在30秒,因此可以該腳本達(dá)到了提高工作效率的目的。
2? 基于selenium的網(wǎng)頁(yè)自動(dòng)化腳本的設(shè)計(jì)與實(shí)現(xiàn)
2.1? 設(shè)計(jì)原理思路
Selenium是一種基于瀏覽器驅(qū)動(dòng)的爬蟲方式,能夠直接識(shí)別動(dòng)態(tài)頁(yè)面加載后的網(wǎng)頁(yè)[3-5]。Selenium可以通過(guò)對(duì)瀏覽器調(diào)試,模擬鼠標(biāo)點(diǎn)擊等、鍵盤輸入等操作,讓瀏覽器產(chǎn)生響應(yīng)。因此可使用將人工操作步驟直接使用selenium進(jìn)行模擬,從而達(dá)到自動(dòng)化處理的功能。
2.2? 設(shè)計(jì)過(guò)程
2.2.1? 基本流程圖
該實(shí)現(xiàn)方法如圖2所示,首先手動(dòng)登錄外部系統(tǒng),再使用selenium模擬瀏覽器登錄內(nèi)部系統(tǒng);登錄之后遍歷所有任務(wù),判斷當(dāng)前任務(wù)是否需要自動(dòng)處理。當(dāng)任務(wù)需要自動(dòng)處理的時(shí)候,使用selenium對(duì)任務(wù)頁(yè)面中各個(gè)元素進(jìn)行定位和填寫。
2.2.2? 模擬登錄
新系統(tǒng)需要從一個(gè)外部系統(tǒng)跳轉(zhuǎn)之后進(jìn)入,不能直接登錄。跳轉(zhuǎn)后的URL有一個(gè)ticket參數(shù),這個(gè)參數(shù)每次跳轉(zhuǎn)都會(huì)發(fā)生變化,因此也無(wú)法獲取準(zhǔn)確的登陸頁(yè)面URL。外部管控系統(tǒng)采用的是“用戶名+密碼+滑動(dòng)驗(yàn)證碼+短信驗(yàn)證碼”的驗(yàn)證模式;新系統(tǒng)采用的是“用戶名+密碼+圖形驗(yàn)證碼”的驗(yàn)證模式。
這種登錄模式下,由于有滑動(dòng)驗(yàn)證碼和短信驗(yàn)證碼的存在,如果還使用BeautifulSoup + requests模式的話,是無(wú)法獲取到相關(guān)信息的。因此最后決定使用selenium,并采用“手動(dòng)準(zhǔn)備+自動(dòng)填寫+鍵盤輸入”的對(duì)模擬系統(tǒng)登錄,步驟為:
(1)用戶手動(dòng)進(jìn)行“用戶名+密碼+滑動(dòng)驗(yàn)證碼+短信驗(yàn)證碼”驗(yàn)證登錄外部系統(tǒng),跳轉(zhuǎn)到新系統(tǒng)登錄頁(yè)面,并將登錄頁(yè)URL保存到本地文件。
(2)使用selenium讀取本地文件中的URL,填入預(yù)設(shè)的用戶名和密碼。
(3)在命令行輸入鍵盤圖形驗(yàn)證碼。
(4)模擬登錄。
2.2.3? 遍歷任務(wù)清單
Selenium遍歷的任務(wù)清單的方法比較直接。模擬鼠標(biāo)點(diǎn)擊最后一頁(yè),然后不斷點(diǎn)擊“上一頁(yè)”,直到訪問(wèn)到第1頁(yè)。在每一頁(yè)中,也都能夠通過(guò)分析網(wǎng)頁(yè)源碼,定位到任務(wù)鏈接所在的元素,模擬鼠標(biāo)點(diǎn)擊,來(lái)進(jìn)入到具體的任務(wù)。
2.2.4? 模擬任務(wù)提交
Selenium模擬任務(wù)提交的方法也很直接。直接從源碼中定位到對(duì)應(yīng)元素,根據(jù)元素類型不同調(diào)用不同方法進(jìn)行填寫。如果是下拉框就調(diào)用click方法選中下拉元素,如果是輸入框就通過(guò)send_key方法進(jìn)行文本填寫。填寫完成后再定位到提交按鈕調(diào)用click方法模擬鼠標(biāo)點(diǎn)擊,就能夠模擬任務(wù)提交。
2.3? 運(yùn)行結(jié)果
腳本中運(yùn)行后會(huì)顯示每次運(yùn)行處理的任務(wù)數(shù)量和總處理時(shí)間。挑選其中5次處理任務(wù)數(shù)不同的運(yùn)行結(jié)果如表2所示。
可以看出,平均每條任務(wù)的處理時(shí)間在10~20秒,相對(duì)前面一種方法的運(yùn)行速度較慢,但是仍然比人工操作的速度要快。
3? 兩種自動(dòng)化腳本特性分析
3.1? BeautifulSoup+requests自動(dòng)化腳本特點(diǎn)
3.1.1? 非可視化
BeautifulSoup + requests腳本本質(zhì)上是通過(guò)構(gòu)造HTTP請(qǐng)求方法來(lái)模擬網(wǎng)頁(yè)訪問(wèn)的,獲取到的網(wǎng)頁(yè)源碼只是以變量形式存在于腳本中,對(duì)用戶來(lái)說(shuō)是“看不見”的,整個(gè)過(guò)程沒(méi)有可視化界面出現(xiàn)。
3.1.2? 無(wú)法獲取動(dòng)態(tài)網(wǎng)頁(yè)源碼
在使用BeautifulSoup + requests調(diào)試期間發(fā)現(xiàn),使用requests訪問(wèn)任務(wù)清單系統(tǒng)主頁(yè)URL時(shí),獲取到的網(wǎng)頁(yè)源碼中只有標(biāo)題和用戶信息,并沒(méi)有其他網(wǎng)頁(yè)元素。這是因?yàn)锽eautifulSoup + requests只能獲取靜態(tài)網(wǎng)頁(yè)的代碼,而無(wú)法獲取通過(guò)動(dòng)態(tài)加載才能出現(xiàn)的網(wǎng)頁(yè)源碼。因此在代碼編寫中,必須要跳過(guò)動(dòng)態(tài)生成的頁(yè)面,直接定位到目標(biāo)信息出現(xiàn)的頁(yè)面,而這個(gè)頁(yè)面往往不會(huì)是主頁(yè),因此這也是這種實(shí)現(xiàn)方式的難點(diǎn)。
3.1.3? 構(gòu)造數(shù)據(jù)包
構(gòu)造數(shù)據(jù)包分為兩種,一個(gè)是構(gòu)造header包,一個(gè)是構(gòu)造form表單。header包是用來(lái)模擬瀏覽器和傳遞cookie值的;form表單是用來(lái)將提交給目標(biāo)網(wǎng)頁(yè)用作下一步操作的。這兩種數(shù)據(jù)包都需要在編寫代碼時(shí)手動(dòng)進(jìn)行構(gòu)造,只有當(dāng)這兩種數(shù)據(jù)包構(gòu)造正確時(shí),才會(huì)生成正確的HTTP請(qǐng)求。因此正確地構(gòu)造header和form表單是這中實(shí)現(xiàn)方式成功的關(guān)鍵。
3.1.4? 難以使用鍵盤輸入輔助
通過(guò)觀察HTTP包發(fā)現(xiàn),數(shù)據(jù)包中傳輸?shù)哪承┳侄问鞘褂玫拿芪摹@缭谀M用戶登錄時(shí),在HTTP包中傳輸?shù)膶?duì)應(yīng)字段并不是登陸所使用的用戶名和密碼的原始字符串,而是經(jīng)過(guò)加密的字符串,并且而這種加密方式不能夠確定。這種特性導(dǎo)致了這種實(shí)現(xiàn)方式很難利用鍵盤輸入信息進(jìn)行輔助。
3.2? Selenium自動(dòng)化腳本特性
3.2.1? 驅(qū)動(dòng)程序依賴
Selenium是需要對(duì)瀏覽器進(jìn)行調(diào)試的,因此需要另行下載當(dāng)前瀏覽器當(dāng)前版本的驅(qū)動(dòng)程序,并且不同瀏覽器所需要的驅(qū)動(dòng)程序也不一樣。
3.2.2? 可視化
Selenium啟動(dòng)時(shí)會(huì)運(yùn)行打開一個(gè)瀏覽器,并且整個(gè)頁(yè)面的操作都是可視化的。能夠清楚的看到網(wǎng)頁(yè)上的元素變化,包括按鍵點(diǎn)擊、文本填寫、頁(yè)面跳轉(zhuǎn)等。
3.2.3? 可獲取動(dòng)態(tài)網(wǎng)頁(yè)
Selenium最終獲取的是網(wǎng)頁(yè)加載完畢時(shí)候的源碼,因此動(dòng)態(tài)加載對(duì)selenium沒(méi)有任何影響。
3.2.4? 模擬操作事件
基于Selenium的自動(dòng)化基本可以分為兩步:首先要定位到網(wǎng)頁(yè)上的某一個(gè)元素;然后再模擬這一元素上發(fā)生的事件(例如鼠標(biāo)點(diǎn)擊和文本填寫)。因此準(zhǔn)確地定位到對(duì)的網(wǎng)頁(yè)元素是這種實(shí)現(xiàn)方式成功的關(guān)鍵。
3.2.5? 等待加載
使用selenium調(diào)試時(shí),經(jīng)常會(huì)出現(xiàn)這種狀況:由于瀏覽器UI的加載速度遠(yuǎn)遠(yuǎn)慢于代碼的執(zhí)行速度,當(dāng)某條代碼讓網(wǎng)頁(yè)加載新元素時(shí),下一條代碼需要讀取新元素的信息;然而當(dāng)代碼運(yùn)行到下一句的時(shí)候,目標(biāo)新元素并沒(méi)有及時(shí)加載出來(lái),使得后一句的代碼實(shí)際上讀取了一個(gè)不存在的元素,從而導(dǎo)致報(bào)錯(cuò)。
為了避免這種情況的出現(xiàn),腳本在各種操作之間加上了被動(dòng)的等待語(yǔ)句,使得腳本能夠在瀏覽器完成加載之后再進(jìn)行讀取。
3.2.6? 可以使用鍵盤輸入輔助
因?yàn)閟elenium是在瀏覽器中模擬各種操作的,因此可以使用鍵盤輸入信息進(jìn)行輔助。2.2.2中模擬登錄就是采用了鍵盤輔助的方式進(jìn)行的。
3.3? 兩種實(shí)現(xiàn)方式對(duì)比
以上兩種實(shí)現(xiàn)方式都能夠達(dá)到讓網(wǎng)頁(yè)自動(dòng)化處理的效果,但是可以看出兩者在實(shí)現(xiàn)機(jī)制、關(guān)鍵步驟、執(zhí)行速度上有著明顯的區(qū)別。
從表3中可以看出,BeautifulSoup + requests自動(dòng)化腳本運(yùn)行速度快,但是實(shí)現(xiàn)難度較大,適用于登錄驗(yàn)證簡(jiǎn)單,并且容易獲得靜態(tài)頁(yè)面的網(wǎng)頁(yè)。Selenium實(shí)現(xiàn)方式因?yàn)橛袨g覽器的可視化運(yùn)行,以及被動(dòng)等待操作,運(yùn)行速度相對(duì)較慢(仍快于人工操作);但是實(shí)現(xiàn)方式較為簡(jiǎn)單,相對(duì)適用于登陸驗(yàn)證復(fù)雜,需要獲取動(dòng)態(tài)加載內(nèi)容的網(wǎng)頁(yè)。
4? 結(jié)? 論
本文分別使用BeautifulSoup + requests和selenium兩種爬蟲方法對(duì)不同登陸驗(yàn)證模式下的同一個(gè)任務(wù)系統(tǒng)進(jìn)行自動(dòng)化處理功能實(shí)現(xiàn),并且通過(guò)對(duì)兩種自動(dòng)化實(shí)現(xiàn)方式的特性分析進(jìn)行比較,總結(jié)了兩種爬蟲方法的使用場(chǎng)景。下一步期望能夠?qū)煞N爬蟲方法混合,既具有BeautifulSoup + requests的快速運(yùn)行特性,也具有selenium的模擬復(fù)雜登陸特性。
參考文獻(xiàn):
[1] 歐陽(yáng)元東.基于Python的網(wǎng)站數(shù)據(jù)爬取與分析的技術(shù)實(shí)現(xiàn)策略 [J].電腦知識(shí)與技術(shù),2020,16(13):262-263.
[2] 王鑫.基于Python的微信公眾平臺(tái)數(shù)據(jù)爬蟲 [J].福建質(zhì)量管理,2019(17):270-271.
[3] 高艷.基于Selenium框架的大數(shù)據(jù)崗位數(shù)據(jù)爬取與分析 [J].工業(yè)控制計(jì)算機(jī),2020,33(2):109-111.
[4] 劉軍.基于Selenium的網(wǎng)頁(yè)自動(dòng)化測(cè)試系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn) [D].武漢:華中科技大學(xué),2014.
[5] 沈承放,莫達(dá)隆.beautifulsoup庫(kù)在網(wǎng)絡(luò)爬蟲中的使用技巧及應(yīng)用 [J].電腦知識(shí)與技術(shù),2019,15(28):13-16.
作者簡(jiǎn)介:李晨昊(1990.06—),男,漢族,湖北武漢人,中級(jí)通信工程師,碩士研究生,研究方向:計(jì)算機(jī)。