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