【摘要】一個爬蟲從網上爬取數據的大致過程可以概括為:向特定的網站服務器發出請求,服務器返回請求的網頁數據,爬蟲程序收到服務器返回的網頁數據并加以解析提取,最后把提取出的數據進行處理和存儲。因此,一個爬蟲程序可以主要分為三大部分:向服務器請求并獲取網頁數據、解析網頁數據、數據處理和存儲。
【關鍵詞】Python;網絡爬蟲;設計與實現
一、引言
隨著網絡技術的飛速發展,互聯網中的信息呈現爆炸式的增長,互聯網的信息容量也達到了一個前所未有的高度。為了方便人們獲取互聯網中的信息,出現了一批搜索引擎。傳統的搜索引擎在返回的結果方面有局限性,網絡爬蟲因此而誕生。網絡爬蟲又名叫網絡機器人,它是一種按照特定規則爬取網頁信息的程序。與傳統搜索引擎不同,網絡爬蟲只爬取想要獲得的特定類型的信息,進而提高搜索引擎的效率。
二、Python語言
Python語言是一種比較常用的開發網址工具,這種語言自身具有非常強大功能。近些年,隨著互聯網行業的快速發展,各種行業自身都需要擁有自己的網址,這就給Phthon語言的應用提供了很大發展機會。Python語言能夠兼容各種不同類型的操作系統。站在網址開發的角度上分析來說Python是屬于面向對象語言,這種編程語言能夠在短時間內實現對象編程,Python屬于解釋性語言,整體通過簡單的語法與動態輸入有力支持,使得Python逐漸成為各種操作系統平臺上常用的腳本語言之一,特別是那些追求高性能的綜合應用程序開發過程中Python語言占有重要地位。
三、獲取網頁數據
在Python中,一般爬蟲主要是通過一個python的第三方庫requests來實現這個過程的,requests庫提供了兩種發起請求的方法,分別為get()何post(),這也是大部分網站都會實現的兩個接口。一般地,get()方法直接通過url參數(有時候還需要請求頭參數)便可以發起有效請求;post()方法除此之外還需要一些額外的表單參數,才可以發起有效請求。
在獲取網頁數據的這個過程中,常遇到的問題是網站運用了異步加載技術(AJAX)和需要用戶登錄才可以進入相應的頁面。所謂異步加載就是一種通過只和服務器交換少量的每頁不同的數據就可以實現頁面更新的技術,而不是每次都需要重新加載整個頁面,這個可以更小的消耗服務器資源,也更高效快速。
四、解析網頁數據
當我們獲取到網頁數據之后,接下來就是對此進行解析并從中提取需要的數據。網站返回的數據格式有三種:HTML、XML、JSON,但是一般我們從網站上爬取到的從服務器中返回的是HTML格式的,有些從網站提供的API返回的數據格式是JSON,下面我們只針對HTML格式的數據進行分析。
要解析HTML格式的數據,python中一般有三種方法,分別對應三個庫:BeautifulSoup庫、re庫、Lxml庫。BeautifulSoup庫可以很方便的解析Requests庫請求的網頁,并把網頁源代碼解析為Soup對象,以便過濾提取數據。BeautifulSoup庫除了支持HTML,也支持XML。可以通過該庫中的find()、find_all()、selector()方法定位提取需要的數據,其中的參數以及定位原則可以查看文檔。
re庫是python中關于正則表達式的庫,支持全部的正則表達式功能,可以利用該庫通過正則表達式來匹配提取HTML文檔中的數據。一般可以通過該庫中的search()、findall()函數來匹配提取。當然關于正則表達式需要讀者額外的去學習,雖然在學習上會比較靈活,但是同時其也是功能相對最強大和效率最高的方法之一。
Lxml是XML解析庫,但是對HTML也有很好的支持,該模塊使用c語言的python封裝,因此解析速度比BeautifulSoup快。Lxml庫使用Xpath語法解析定位網頁數據,因此讀者需要自行學習Xpath語法以便知道如何定位提取數據,學習難度不大,功能也強大。一般利用該庫中的etree模塊對網頁進行解析,然后再利用解析后返回的對象中的xpath()方法結合Xpath語法提取需要的數據。
這三種方法都可以實現對網頁數據的解析和提取,但是性能上有差異。一般的,正則表達式和Lxml庫的性能較高,但是正則表達式使用難度較大,Lxml一般是比較推薦的;BeautifulSoup庫的性能相對較低,但是使用起來簡單,在爬取小規模數據時可以使用。
五、數據處理和存儲
數據處理其實沒啥多說的,其本身內容龐雜,即用即查,多用多學,但python對數據處理是有先天優勢的。數據存儲一般取決于數據量的大小,小規模的數據一般以csv的格式儲存,這可以利用python的第三方庫csv實現,該庫的利用也比較簡單。對于大規模的數據,則一般儲存在數據庫里面,無論是關系型數據庫還是非關系型數據庫,python對這兩者主流的數據庫都有第三方庫的支持。比如對于非關系型數據庫MongoDB,python有第三方庫pymongo;關系型數據庫MySQL,python有第三方庫pymysql。如果是將數據儲存在本地,則需要下載本地數據庫,最好也下載數據庫圖形管理界面方便查看;如果是遠程數據庫,則同樣的最好自己下載好圖形界面的數據庫管理器以便查看。
六、基于Python網絡爬蟲的實現通過實現任意貼吧的爬蟲,并將網頁保存到本地,來完成簡單的網絡爬蟲實現
如何實現網頁的URL地址爬取,設計思想如下:(1)創建一個Spider類;(2)定義_init_(self,tieba_name)函數,在函數中通過定義一個地址列表self.url_list[]、貼吧名稱變量self.tieba_name以及self.headers的初始化,使用循環語句來完成獲取完整的URL地址并追加到列表中;(3)定義parse_url(self,url)函數,通過語句response=requests.get(urs,headers=self.headers)來專門發送請求,并獲取響應。通過判斷發送請求,如果成功,返回responses的值,如果不成功,判斷是否為最后一頁,如果是,返回“error”,否則返回“None”;(4)義save_html(self,html,page_num)函數來完成網址的保存。
參考文獻:
[1]徐遠超,劉江華,劉麗珍,等.基于Web的網絡爬蟲的設計與實現[J].微計算機信息,2007,23(21):119-121.
[2]郭麗蓉.基于Python的網絡爬蟲程序設計[J].電子技術與軟件工程,2017(23):248-249.
作者簡介:
高祖彥(1979-),男,漢族,副教授,恩施職業技術學院教務處,研究方向:計算機軟件技術,計算機數據庫技術。