西安工業(yè)大學 魏程程
隨著互聯(lián)網(wǎng)時代的迅速發(fā)展,Web已成為大量信息的載體,如何能從中有效地提取并利用這些信息成為一個巨大的挑戰(zhàn)。用戶通過訪問Web檢索信息的工具一般都是傳統(tǒng)的搜索引擎,而其具有一定的局限性,比如說,不同領域、不同背景的用戶往往具有不同的檢索目的和需求,而傳統(tǒng)的搜索引擎所返回的結果往往包含大量用戶不關心的網(wǎng)頁。為了解決這類問題,爬蟲技術應運而生。
利用c++和java進行爬蟲的程序代碼,c++代碼復雜性高,而且可讀性、可理解性較低,不易上手,一般比較適合資深程序員編寫,來加深對c++語言的理解,不合適初學者學習。Java的可讀性適中,但是代碼冗余較多,同樣一個爬蟲,java的代碼量可能是Python的兩倍。Python作為一種語法簡潔、面向對象的解釋性語言,其便捷性、容易上手性受到眾多程序員的青睞,本文主要介紹如何利用python進行網(wǎng)站數(shù)據(jù)的抓取工作,即網(wǎng)絡爬蟲技術。
網(wǎng)絡爬蟲[1],也叫網(wǎng)絡蜘蛛(Web Spider),如果把互聯(lián)網(wǎng)比喻成一個蜘蛛網(wǎng),數(shù)據(jù)便是存放于蜘蛛網(wǎng)的各個節(jié)點,而爬蟲就是一只小蜘蛛,沿著網(wǎng)絡抓取自己的獵物(數(shù)據(jù))。爬蟲指的是:向網(wǎng)站發(fā)起請求,獲取資源后分析并提取有用數(shù)據(jù)的程序;從技術層面來說就是通過程序模擬瀏覽器請求站點的行為,把站點返回的HTML代碼/JSON數(shù)據(jù)/二進制數(shù)據(jù)(圖片、視頻)爬到本地,進而提取自己需要的數(shù)據(jù),存放起來使用。簡單的爬蟲架構如圖1所示。
圖1 爬蟲架構圖
爬蟲調度器是用來啟動、執(zhí)行、停止爬蟲,或者監(jiān)視爬蟲中的運行情況;在爬蟲程序中有三個核心模塊:URL管理器,是用來管理待爬取URL數(shù)據(jù)和已爬取URL數(shù)據(jù);網(wǎng)頁下載器,是將URL管理器里提供的一個URL對應的網(wǎng)頁下載下來,存儲為一個字符串,這個字符串會傳送給網(wǎng)頁解析器進行解析;網(wǎng)頁解析器,一方面會解析出有價值的數(shù)據(jù),另一方面,由于每一個頁面都有很多指向其它頁面的網(wǎng)頁,這些URL被解析出來之后,可以補充進URL管理器。這三部分就組成了一個簡單的爬蟲架構,這個架構就能將互聯(lián)網(wǎng)中所有的網(wǎng)頁抓取下來。
網(wǎng)絡爬蟲的基本工作流程如下:
● 首先選取一部分URL作為種子URL;
● 將這些種子URL加入待抓取集合;
● 從待抓取的URL集合中取出待抓取的URL,解析DNS,并且得到主機的ip,并將URL對應的網(wǎng)頁下載下來,存儲進已下載網(wǎng)頁庫中。此外,將這些URL放進已抓取的URL集合;
● 分析已抓取URL集合中的URL,分析其中的其他URL,并且將URL放入待抓取URL集合,從而進入下一個循環(huán);
● 解析下載下來的網(wǎng)頁,將需要的數(shù)據(jù)解析出來;
● 數(shù)據(jù)持久化,保存至數(shù)據(jù)庫中。
URL管理器管理待抓取的URL集合和已抓取的URL集合,防止重復抓取和循環(huán)抓取,如圖2所示。
圖2 URL管理器圖解
URL管理器的實現(xiàn)方式有內(nèi)存、關系數(shù)據(jù)庫和緩存數(shù)據(jù)庫三種,內(nèi)存適合個人或小型企業(yè),如果想要永久存儲或是內(nèi)存不夠用,小型企業(yè)或個人可以選擇關系數(shù)據(jù)庫,緩存數(shù)據(jù)庫由于其高性能,被大型互聯(lián)網(wǎng)公司青睞。
網(wǎng)頁下載器作為爬蟲的核心組件之一,是將Web上URL對應的網(wǎng)頁下載到本地的工具。常用的Python網(wǎng)頁下載器有urllib2基礎模塊和requests第三方插件兩種。urllib2支持功能有:支持直接url下載;支持向網(wǎng)頁直接輸入的數(shù)據(jù);支持需要登陸網(wǎng)頁的cookie處理;需要代理訪問的代理處理。
urllib2有三種下載方法:
1)直接下載法,這是最簡潔的方法:urllib2.urlopen(url)。
2)添加data和http,這里data即指用戶需要輸入的數(shù)據(jù),http-header主要是為了提交http的頭信息。將url、data、header三個參數(shù)傳遞給urllib2的Request類,生成一個request對象,接著再使用urllib2中的urlopen方法,以request作為參數(shù)發(fā)送網(wǎng)頁請求。
3)添加特殊情境的處理器
有些網(wǎng)頁需要登錄才能訪問,需要添加cookie進行處理,這里使用HTTPCookieProcessor。
需代理才能訪問的使用:ProxyHandler
使用https加密協(xié)議的網(wǎng)頁:HTTPSHandler
有的url相互自動的跳轉關系:HTTPRedirectHandler
將這些handler傳送給urllib2的build_opener(handler)方法來創(chuàng)建opener對象,在傳送給install_opener(opener),之后urllib2就具有了這些場景的處理能力。
網(wǎng)頁解析器,簡單的說就是用來解析html網(wǎng)頁的工具,準確的說:它是一個HTML網(wǎng)頁信息提取工具,就是從html網(wǎng)頁中解析提取出“我們需要的有價值的數(shù)據(jù)”或者“新的URL鏈接”的工具。
常見的python網(wǎng)頁解析工具有:
1)正則表達式:將整個網(wǎng)頁文檔當作字符串,然后使用模糊匹配的方式,來提取出有價值的數(shù)據(jù)和新的url。其優(yōu)點是看起來比較直觀,但如果文檔比較復雜,這種解析方式會顯得很麻煩;
2)html.parser:此為python自帶的解析器;
3)lxml:第三方插件解析器,可解析html和xml網(wǎng)頁;
4)Beautiful Soup:強大的第三方插件解析器,可使用html.parser和lxml解析器。
以上這四種網(wǎng)頁解析器,是兩種不同類型的解析器,其中re正則表達式即為字符串式的模糊匹配模式;BeautifulSoup、html.parser與lxml為“結構化解析”模式,他們都以DOM樹結構為標準,進行標簽結構信息的提取。而所謂結構化解析,就是網(wǎng)頁解析器它會將下載的整個HTML文檔當成一個Doucment對象,然后在利用其上下結構的標簽形式,對這個對象進行上下級的標簽進行遍歷和信息提取操作。
下來我們重點學習一下BeautifulSoup,它是一個可以從HTML或XML文件中提取數(shù)據(jù)的Python第三方庫,它能夠通過你喜歡的轉換器實現(xiàn)慣用的文檔導航,查找,修改文檔的方式。Beautiful Soup會幫你節(jié)省數(shù)小時甚至數(shù)天的工作時間,其使用方法如下:
第一步:創(chuàng)建BeautifulSoup對象(即DOM對象)。
第二步:搜索節(jié)點(find_all,find)。
搜索節(jié)點方法:
soup.find_all() --- 查找所有符合查詢條件的標簽節(jié)點,并返回一個列表。
soup.find() --- 查找符合符合查詢條件的第一個標簽節(jié)點。
實例:查找所有標簽符合標簽名為a,鏈接符合 /view/123.html的節(jié)點。
實現(xiàn)方法1:
>>>> soup.find_all(‘a(chǎn)’, href = ‘/view/123.html’)
實現(xiàn)方法2:
>>>> soup.find_all(‘a(chǎn)’, href = re.compile(r’/view/d+.html’))
第三步:訪問節(jié)點信息。
比如我們得到節(jié)點:I love Python
1)獲取節(jié)點名稱
>>>> node.name
2)獲取查找到的a節(jié)點的href屬性
>>>> node[‘href’]
或者
>>>> node.get(‘href’)
3)獲取查找到的a節(jié)點的字符串內(nèi)容
>>>> node.get_text()
在爬蟲系統(tǒng)中,待抓取URL隊列是很重要的一部分。待抓取URL隊列中的URL以什么樣的順序排列也是一個很重要的問題,因為這涉及到先抓取那個頁面,后抓取哪個頁面。而決定這些URL排列順序的方法,叫做抓取策略。下面重點介紹幾種常見的抓取策略:
圖3 抓取順序圖
1)深度優(yōu)先策略(DFS)
深度優(yōu)先策略是指爬蟲從某個URL開始,一個鏈接一個鏈接的爬取下去,直到處理完了某個鏈接所在的所有線路,才切換到其它的線路。此時抓取順序為:A -> B -> C -> D -> E -> F -> G -> H -> I-> J(參考圖3)。
2)廣度優(yōu)先策略(BFS)
寬度優(yōu)先遍歷策略的基本思路是,將新下載網(wǎng)頁中發(fā)現(xiàn)的鏈接直接插入待抓取URL隊列的末尾。也就是指網(wǎng)絡爬蟲會先抓取起始網(wǎng)頁中鏈接的所有網(wǎng)頁,然后再選擇其中的一個鏈接網(wǎng)頁,繼續(xù)抓取在此網(wǎng)頁中鏈接的所有網(wǎng)頁。此時抓取順序為:A -> B -> E -> G-> H -> I -> C -> F -> J -> D(參考圖3)。
本文介紹了基于Python的數(shù)據(jù)信息爬蟲技術的工作流程,以及爬蟲技術中的三大核心模塊的使用方法,為日后的研究工作奠定理論基礎,對開發(fā)設計網(wǎng)絡爬蟲實例具有一定的指導意義。
[1]Wesley J. Chun. Python核心編程[M].宋吉廣譯.北京:人民郵電出版社,2008.