




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