彭智鑫
(湖南城市學院 湖南 益陽 413002)
通用搜索引擎已成為人們定位所需Web資源的利器,然而隨著Web技術的發展和人們對通用搜索引擎需求的精細化,通用搜索引擎已越來越不能滿足人們日常的搜索需要。當我們需要查詢一類特定的信息時,通用性搜索引擎并不能將信息進行集中化處理和展示,無法讓我們直觀的看到我們所需要的信息,利用網絡爬蟲用戶能快速精準的對互聯網中的海量數據進行提取和保存。通過定制爬蟲來實現我們對特定信息的搜索,自行設計要獲取的信息內容和特定的搜索范圍,能讓我們更加精確地獲取到信息。網絡爬蟲的優勢在于不需要用戶輪班值守,能自動化運行,自動判斷網頁數據的狀態,及時更新[1]。
網絡爬蟲是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。網絡爬蟲按照系統結構和實現技術大致可以分為以下幾種類型:
(1)通用型網絡爬蟲。此類爬蟲主要應用于搜索引擎,爬行范圍和數量巨大,對于爬行速度和存儲空間要求較高,具有較強的應用價值。
(2)聚焦型網絡爬蟲。選擇性地爬行預先定義好的需求信息,極大地節省了硬件和網絡資源,滿足特定人員的特定需求。
(3)增量型網絡爬蟲。只在產生新的頁面或者頁面發生變化時才會進行爬行工作,有效減少數據下載量,減小時間和空間上的耗費。
(4)深度網絡爬蟲。需要注冊登錄或是提交相應表單才能獲取web頁面爬行數據[2]。
正則表達式是由一系列特殊字符和普通字符組成的字符集合,其中每個特殊字符都被稱為元字符,這些元字符并不表示它們字面上的含義,而會被解釋為一些特定的含義。正則表達式語法簡單,功能強大,在日常的文本匹配、替換、解析中有很大的作用,掌握正則表達式的基本語法和用法,能大大提高了處理字符串和文本的效率。
Python是高效率的完全面向對象的語言,能有效而簡單地實現面向對象編程。它的解釋性語言的本質,再加上其簡潔的語法和對動態輸入的支持,使得它在大多數操作系統平臺上都是一個較為理想的腳本語言,特別適用于快速的應用程序開發。Python提供了針對網絡協議的標準庫,能簡單高效地實現網頁抓取、網頁解析、數據存儲等功能,使程序員就可以集中精力處理程序邏輯。
本案例通過Python語言進行設計,采用深度網絡爬蟲和聚焦型網絡爬蟲相結合的程序,以本地某手機渠道商網站為例,通過網絡爬蟲對該網站的手機報價進行爬行,將提取到的數據保存到數據庫便于后續開發研究工作。本爬蟲主要的流程為訪問目標網頁、網頁解析、數據保存等,主要引用的第三方庫有requests、pytesseract、MySQLdb。
爬蟲系統運行時,首要工作是訪問指定的URL,對當前頁面進行抓取。Python官方支持的基礎模塊中的urllib2庫,能完成網頁請求,cookie驗證,代理等功能;但是基于urllib庫開發的requests第三方庫,使用起來更加人性化和簡潔。
深度網絡爬蟲需要注冊登錄或是提交相應表單才能獲取web頁面爬行數據。它首先需要解決登錄的安全控件問題和驗證碼問題,才能根據請求方式,進行登錄[3]。
(1)安全控件問題
通過對原網頁的分析,想要獲取相關的報價數據,需要登錄該網頁的賬號才能看到相關的信息,所以模擬人為的登錄成為了爬蟲設計的關鍵性步驟。原網頁在登錄過程中需要安裝相關安全控件才能進行登錄操作,但是通過手機端登錄,進入移動端網頁是不要安裝安全控件的。通過模擬手機端的UA標識,讓服務器判定為來自手機的訪問請求,從而達到繞過安全控件進行登錄。
#模擬手機端UA標識
headers={
'User-Agent':'Mozilla/5.0(iPhone;CPUiPhoneOS9_1likeMacOSX)AppleWebKit/601.1.46(KHTML,likeGecko)Ver sion/9.0Mobile/13B143Safari/601.1'
(2)驗證碼問題
為了保證網站的安全性,在登錄過程中加入了驗證碼,通過對驗證碼的分析,發現大多數網頁的驗證碼為簡易數字,通過OCR軟件一樣能進行很準確的識別,谷歌的Tesseract-OCR對Python有很好的兼容性,可以安裝pytesseract第三方庫進行調用完成驗證碼的識別,完全符合爬蟲模擬登錄的需求。
#打開保存的驗證碼圖片
image=Image.open("code.jpg")
#調用pytesseract進行驗證碼識別
code=pytesseract.image_to_string(image)
(3)請求方式
通過對原網頁登錄過程中的狀態分析,網頁采用POST的請求方式進行數據交互,通過瀏覽器的審查工具,網頁登錄過程中需要的參數有dhhm、pwd、sign,phhm為登錄的賬戶名,pwd為登錄的密碼,sign為登錄的驗證碼,將這三個參數打包后封裝。
#封裝請求參數
data={"dhhm":"username","pwd":"password","sign":code}
(4)模擬登錄
通過requests第三方庫可以很方便地進行模擬登錄。
#調用requests進行模擬登錄
response=requests.post(url,data=data,headers=he aders)
網頁解析器是對網頁內容中進行數據分析的工具。Python支持的網頁解析器可以利用正則表達式可以將整個網頁文檔當成一個字符串,使用模糊匹配的方式來提取出有價值的數據。Python的re模塊使Python語言擁有全部的正則表達式功能,通過正則表達式將符合要求的數據進行提取,將我們需要的報價數據準確的提取出來[4]。
#通過正則表達式提取報價信息
bj=re.compile('addCart(.*?)">購買')
bj=re.findall(bj,iphone)
Python可以將正則表達式獲取到的信息通過引入相關數據庫的第三方庫,本文通過MySQLdb庫創建數據庫連接,然后直接用SQL語句操作數據庫,將信息導出至數據庫,方便各種應用程序的后續開發。
#設定數據庫連接信息
db=MySQLdb.connect("127.0.0.1","root","123456","sjbj",charset='utf8')
#使用cursor()方法獲取操作游標
cursor=db.cursor()
#創建數據表
sql="""CREATETABLEiphone(
id_1 VARCHAR(255) NOTNULL,
id_2 VARCHAR(255),
sjxh TEXT,
根據抽水孔結構,建立本次抽水試驗的抽水井模型:井徑r=0.11 m,水位埋深h=10.20 m,含水層厚度H=34.9 m,井流為無壓井流。
price DOUBLE(10,2),
id_3 VARCHAR(255)
)"""
cursor.execute(sql)
#插入數據
sql="insert into iphone(id_1,id_2,sjxh,price,id_3)
cursor.execute(sql)
#關閉數據庫連接
db.close()
運行網絡爬蟲程序,程序運行2.4s,成功抓取數據255條,部分爬行結果如表1所示。

表1
在當今數據大爆發的時代,通過爬蟲快速的從互聯網中爬行所需要的信息顯得格外重要。Python在爬蟲應用中充當了重要的角色,豐富的第三方庫讓開發變得簡單易用。實例證明應用Python語言可以方便地實現深度網絡爬蟲和聚焦型網絡爬蟲相結合的爬蟲程序,將網絡中的大數據進行整合,讓大數據更方便的服務于其他應用程序。
[1]周立柱,林玲.聚焦爬蟲技術研究綜述[J].計算機應用,2005(09):1965-1969.
[2]劉石磊.對反爬蟲網站的應對策略[J].電腦知識與技術,2017,13(15):19-21+23.
[3]胡軍偉,秦奕青,張偉.正則表達式在Web信息抽取中的應用[J].北京信息科技大學學報(自然科學版),2011,26(06):86-89.