楊亮,劉利偉,胡華蓮
?
B2C垂直搜索引擎的網(wǎng)絡(luò)爬蟲設(shè)計(jì)
楊亮,劉利偉,胡華蓮
(五邑大學(xué) 計(jì)算機(jī)學(xué)院,廣東 江門 529020)
開發(fā)了基于Beautiful-Soup信息提取的B2C類垂直搜索引擎爬蟲系統(tǒng).測試結(jié)果表明:該爬蟲的抓取有效率實(shí)際達(dá)到95%以上,滿足商業(yè)應(yīng)用的要求.
網(wǎng)絡(luò)爬蟲;垂直搜索;B2C;Beautiful-Soup
隨著垂直搜索的蓬勃發(fā)展,基于特定主題的網(wǎng)絡(luò)爬蟲成為當(dāng)前的研究熱點(diǎn). 同時,國內(nèi)B2C[1]網(wǎng)站發(fā)展迅速,面向B2C領(lǐng)域的垂直搜索成為垂直搜索領(lǐng)域的重要研究方向. 本文針對B2C類網(wǎng)站的特點(diǎn),結(jié)合Beautiful-Soup框架設(shè)計(jì)并實(shí)現(xiàn)相應(yīng)的網(wǎng)絡(luò)爬蟲系統(tǒng).
網(wǎng)絡(luò)爬蟲(Web Crawler),又稱網(wǎng)絡(luò)蜘蛛(Web Spider)或網(wǎng)絡(luò)信息采集器,是一個自動提取網(wǎng)頁的程序,它為搜索引擎[2]從Web上下載網(wǎng)頁,是搜索引擎的重要組成部分. 網(wǎng)絡(luò)爬蟲[3]通常從一個稱為種子集的URL集合開始運(yùn)行,首先將URL全部放入到一個有序的待爬隊(duì)列中,按照一定策略從中取出URL并下載所指向的頁面,分析頁面內(nèi)容,提取新的URL并存入到待爬URL隊(duì)列中,直到URL隊(duì)列為空或者滿足某個爬行終止條件,從而遍歷Web,該過程稱為網(wǎng)絡(luò)爬行(Web Crawling). 網(wǎng)絡(luò)爬蟲的爬行策略主要分為深度優(yōu)先搜索策略[4]、寬度優(yōu)先搜索策略[5]和最佳優(yōu)先策略. 其中最佳優(yōu)先策略是根據(jù)一定的鏈接分析策略,計(jì)算出URL的優(yōu)先級,在待抓取的URL隊(duì)列中每次選取優(yōu)先級最高的URL進(jìn)行爬取,即優(yōu)先抓取被預(yù)測為最有價值的網(wǎng)頁. 而優(yōu)先級較低的就會推后訪問. 網(wǎng)絡(luò)爬蟲具體流程如圖1所示:
垂直搜索[6-7]是針對某一個行業(yè)的專業(yè)搜索引擎,是搜索引擎的細(xì)分和延伸,是對網(wǎng)頁庫中的某類專門的信息進(jìn)行一次整合,定向分字段抽取出需要的數(shù)據(jù)進(jìn)行處理后再以某種形式返回給用戶. 與通用搜索引擎的海量信息無序化相比,垂直搜索引擎抓取的數(shù)據(jù)傾向于結(jié)構(gòu)化數(shù)據(jù)和元數(shù)據(jù)同時兼顧非結(jié)構(gòu)化的搜索(傳統(tǒng)搜索). 如:找工作更傾向于關(guān)注的是職位、薪酬福利、工作地點(diǎn)等.
圖1 爬蟲系統(tǒng)流程圖
經(jīng)過對國內(nèi)40多家主流B2C網(wǎng)站的調(diào)研,為方便敘述,有以下詞匯定義:
表1 詞匯和定義
系統(tǒng)的總體架構(gòu)如圖2所示,URL索引模塊的流程如下:1)從URL庫中取出電子商務(wù)網(wǎng)站的源鏈接(URL庫中的初始值為種子URL,一般為B2C網(wǎng)站的主頁地址);2)使用獲得的源鏈接,利用HTTP等相關(guān)協(xié)議訪問電子商務(wù)網(wǎng)站頁面,獲取網(wǎng)頁內(nèi)容;3)通過Beautiful-Soup信息提取方法,分析出所有的URL;4)從網(wǎng)頁內(nèi)容分析出的URL集合中,過濾出產(chǎn)品鏈接和源鏈接;5)將過濾出的產(chǎn)品鏈接和源鏈接跟數(shù)據(jù)庫中的鏈接進(jìn)行比對,進(jìn)行去重處理,最終得到新的產(chǎn)品鏈接和源鏈接;6)保存新的產(chǎn)品鏈接和源鏈接持久化到爬蟲URL數(shù)據(jù)庫.
圖2 爬蟲系統(tǒng)架構(gòu)圖
商品抓取模塊的功能主要是保存B2C網(wǎng)站中所有商品的信息,其流程如下:1)從爬蟲URL數(shù)據(jù)庫中取出電子商務(wù)網(wǎng)站未抓取狀態(tài)的產(chǎn)品鏈接;2)使用產(chǎn)品鏈接,訪問電子商務(wù)網(wǎng)站產(chǎn)品頁面,獲取網(wǎng)頁內(nèi)容;3)對網(wǎng)頁中的內(nèi)容使用模塊進(jìn)行分析,獲取產(chǎn)品信息;4)對產(chǎn)品信息進(jìn)行驗(yàn)證;5)對產(chǎn)品信息進(jìn)行規(guī)范化處理,包括自動分類和字段截取等;6)持久化此產(chǎn)品鏈接為已抓取狀態(tài);7)持久化產(chǎn)品信息到爬蟲數(shù)據(jù)庫.
商品更新模塊的功能主要是更新商品信息,由于B2C網(wǎng)站上的商品經(jīng)常出現(xiàn)價格變動、過期等行為,故需要時常更新其產(chǎn)品信息,該模塊的流程如下:1)從爬蟲產(chǎn)品數(shù)據(jù)庫中取出電子商務(wù)網(wǎng)站需要更新的產(chǎn)品鏈接;2)使用產(chǎn)品鏈接,訪問點(diǎn)在商務(wù)網(wǎng)站產(chǎn)品頁面,獲取網(wǎng)頁內(nèi)容;3)對網(wǎng)頁內(nèi)容使用模板進(jìn)行分析,獲取產(chǎn)品信息;4)對產(chǎn)品信息進(jìn)行驗(yàn)證;5)對產(chǎn)品信息進(jìn)行規(guī)范化處理,包括自動分類和字段截取等;6)將新抓取的產(chǎn)品信息跟已有產(chǎn)品信息進(jìn)行對比;7)如果產(chǎn)品信息發(fā)生變更,則持久化產(chǎn)品信息數(shù)據(jù)到爬蟲產(chǎn)品數(shù)據(jù)庫,無論產(chǎn)品信息是否變更,持久化此產(chǎn)品鏈接為已更新狀態(tài).
數(shù)據(jù)清理模塊主要包括URL數(shù)據(jù)清理和產(chǎn)品數(shù)據(jù)清理;數(shù)據(jù)處理模塊主要包括產(chǎn)品分類處理和產(chǎn)品比價關(guān)聯(lián)等.
該爬蟲系統(tǒng)數(shù)據(jù)數(shù)據(jù)庫的E-R圖(部分)如圖3所示. 由表1知,url類型分為產(chǎn)品鏈接和源鏈接,type值為1代表其為源鏈接,2代表其為產(chǎn)品鏈;字段update_time存放該url最后更新的時間;has_crawl字段用于判斷該url是否已被爬?。籩rror_code表示爬取的狀態(tài),具體為:
圖3 爬蟲系統(tǒng)E-R圖(部分)
OK = 0
URL_404 = 1 #用URL抓取時,發(fā)生404錯誤,即網(wǎng)站鏈接已不可訪問,需要清理
URL_TIME_OUT = 2 # 訪問超時,此種鏈接需要重試
SAVE_ERROR = 3 # 保存抓取到的鏈接時,發(fā)生異常
SAVE_PRODUCT_ERROR = 4 # 保存產(chǎn)品出錯
NOT_IMAGE = 5 # 無法抓取到圖片url
VALIDATE_ERROR = 6 # 抓取數(shù)據(jù)驗(yàn)證失敗
PRODUCT_EXISTS = 7 # 產(chǎn)品已存在
IMAGE_SAVE_ERROR = 8 # 圖片保存失敗
FILTER_ERROR = 9 # 產(chǎn)品過濾錯誤
OTHER_ERROR = 10 # 未知錯誤
UNKNOWN_CATEGORY_ERROR = 11 #未知類別
NOT_GOODS = 12 #暫時無貨
url_index表中,Weight表示該url的權(quán)重. product表代表所有B2C產(chǎn)品的公有屬性,image表代表產(chǎn)品的圖片信息,例如,產(chǎn)品是服飾類將有相應(yīng)的服飾屬性,對應(yīng)clothes-attribute表,如果是圖書類產(chǎn)品,則對應(yīng)book_attribute表.
Beautiful-Soup是Python語言中的一個HTML/XML的解析器,它可以很好地處理不規(guī)范標(biāo)記并生成剖析樹(parse tree),提供簡單又常用的導(dǎo)航,搜索以及修改剖析樹的操作,可以大大提高編程效率. Beautiful-Soup使用XML或HTML文檔以字符串的方式(或類文件對象)構(gòu)造. 它剖析文檔并在內(nèi)存中創(chuàng)建通訊的數(shù)據(jù)結(jié)構(gòu). 如果提供的文檔格式是標(biāo)準(zhǔn)的,其解析出的數(shù)據(jù)結(jié)構(gòu)則是標(biāo)準(zhǔn)格式. 反之,Beautiful-Soup則會使用heuristics修復(fù)可能的結(jié)構(gòu)問題.
在面向B2C電子商務(wù)網(wǎng)站的爬蟲系統(tǒng)中,當(dāng)通過URL獲取相應(yīng)的頁面后,如該URL是源鏈接,則需要提取出頁面內(nèi)容中包含的所有的URL信息,如該URL是產(chǎn)品鏈接,則需要提取頁面中的產(chǎn)品信息,這是整個爬蟲系統(tǒng)的核心之一. 本系統(tǒng)主要是利用Beautiful-Soup框架對頁面的HTML代碼進(jìn)行分析,從中提取出相應(yīng)的URL鏈接或者產(chǎn)品信息.獲取頁面中的URL的核心代碼如下:
def crawl(,url):
content =.get_page_content(url) # 根據(jù)url獲取頁面內(nèi)容
soup = BeautifulSoup(content[], fromEncoding=.website_encoding)
url_soups = soup.findAll()
urls = [url_soup.get("") for url_soup in url_soups] # 得到剖析數(shù),并且設(shè)置相應(yīng)的編碼
urls =.filled_url(url,urls) # 重新拼接url
target_urls =.filter(urls) # 過濾url
return target_urls
其中關(guān)鍵代碼url_soups = soup.findAll()的作用是獲取網(wǎng)頁中所有的標(biāo)簽中的內(nèi)容,代碼urls = [url_soup.get("") for url_soup in url_soups]是獲取所有標(biāo)簽中所對應(yīng)的href屬性,對于HTML中標(biāo)簽中的href屬性所代表的就是url,由此可獲得頁面中的url信息,然后對獲得的url信息進(jìn)行過濾等處理后可存入url庫. 提取出產(chǎn)品信息則可把標(biāo)簽換成產(chǎn)品信息所對應(yīng)的標(biāo)簽就可做到,這里不再贅述.
本文通過Eclipse及Python的多個開發(fā)包,實(shí)現(xiàn)了該系統(tǒng)的設(shè)計(jì),系統(tǒng)最終部署在linux-apache服務(wù)器上. 由于B2C網(wǎng)站上的產(chǎn)品更新周期短,爬蟲系統(tǒng)需要周期性地回訪已爬行過的網(wǎng)址,以確保垂直搜索平臺上的產(chǎn)品與真正B2C上的產(chǎn)品的同步. 網(wǎng)頁的重復(fù)抓取策略分為周期性全面重新抓取以及增量式的抓取[8].. 全面抓取即以一定的頻率重新對所有網(wǎng)頁進(jìn)行抓取,可以保證完整地更新網(wǎng)頁信息,由于該爬蟲系統(tǒng)設(shè)計(jì)同時抓取近40家主流B2C網(wǎng)站的信息,信息量較大,再加上帶寬的限制,所以本系統(tǒng)采取增量式的抓取方式. 同時由于網(wǎng)頁的更新頻率是不同的,一般來說主頁的信息更新較快,所以對這些鏈接設(shè)置較高的權(quán)限,優(yōu)先抓取.調(diào)研發(fā)現(xiàn),國內(nèi)主流B2C網(wǎng)站都是基于模板的網(wǎng)站建設(shè),由于各個網(wǎng)站采用的模板不同,所以針對不同的網(wǎng)站,建立相應(yīng)的抓取模板,使得各個網(wǎng)站之間的關(guān)系松耦合化. 同時針對每一個抓取模板都有相應(yīng)的測試模塊,每個抓取模板通過測試后才能集成到爬蟲系統(tǒng)中. 在測試階段,選取了凡客誠品等九家大型B2C網(wǎng)站作為測試,經(jīng)過一周的運(yùn)行得到的統(tǒng)計(jì)結(jié)果如表2所示,總共抓取的頁面數(shù)超過150萬個,頁面平均大小約為200 k,總共的抓取量達(dá)到300G,頁面抓取有效率達(dá)到87%(產(chǎn)品總數(shù)/產(chǎn)品鏈接總數(shù)),考慮到B2C網(wǎng)站上產(chǎn)品信息出現(xiàn)重復(fù)、過期、缺貨等特定情況的頻率較大(本文的網(wǎng)絡(luò)爬蟲不抓取這些產(chǎn)品數(shù)據(jù)),實(shí)際效率估計(jì)在95%以上. 從爬取效率和規(guī)模上證明該爬蟲系統(tǒng)是有效的,達(dá)到了商業(yè)運(yùn)營的要求.
表2 爬蟲系統(tǒng)測試結(jié)果統(tǒng)計(jì)表
本文通過對國內(nèi)主流B2C網(wǎng)站的調(diào)研,基于Beautiful-Soup開發(fā)了全新的面向B2C領(lǐng)域的垂直搜索爬蟲系統(tǒng). 經(jīng)過運(yùn)營測試,證明該網(wǎng)絡(luò)爬蟲是有效的,達(dá)到了商業(yè)運(yùn)營的要求. 目前該爬蟲系統(tǒng)已經(jīng)用于商業(yè)運(yùn)營,且運(yùn)行良好. 分布式網(wǎng)絡(luò)爬蟲將是下一步研究的方向,著重解決B2C網(wǎng)絡(luò)爬蟲的負(fù)載均衡問題,進(jìn)一步提高網(wǎng)絡(luò)爬蟲的效率.
[1] 林群霞.電子商務(wù)B2C企業(yè)發(fā)展:顧客服務(wù)模式研究[J]. 現(xiàn)代情報,2006(2): 14-30.
[2] 李曉明,閆宏飛,王繼民. 搜索引擎—原理、技術(shù)與系統(tǒng)[M]. 北京:科學(xué)技術(shù)出版社,2005: 30-55.
[3] 孫立偉,何國輝,吳禮發(fā). 網(wǎng)絡(luò)爬蟲技術(shù)的研究[J]. 電腦知識與技術(shù),2010, 6(15): 4112-4115.
[4] 崔澤永,常曉燕. 搜索引擎的Web Robot技術(shù)與優(yōu)化[J]. 微機(jī)發(fā)展,2004(04): 84-87.
[5] 蔡笑倫. 網(wǎng)絡(luò)爬蟲技術(shù)的發(fā)展趨勢[J]. 科技信息,2010(12): 48-52.
[6] 楊堅(jiān)爭,李朝平. 垂直搜索引擎及其應(yīng)用[J]. 電子商務(wù),2006(10): 23-25.
[7] 劉運(yùn)強(qiáng). 垂直搜索引擎的研究與設(shè)計(jì)[J]. 計(jì)算機(jī)應(yīng)用與軟件,2010, 127(7): 130-132.
[8] 袁浩,黃煙波. 網(wǎng)頁標(biāo)題分析對主題爬蟲的改進(jìn)[J]. 計(jì)算機(jī)技術(shù)與發(fā)展,2009(19): 22-28.
[責(zé)任編輯:韋 韜]
Design of Web Crawlers for B2C Vertical Search Engines
YANGLiang, LIULi-wei, HUHua-lian
(School of Computer Science, Wuyi University, Jiangmen 529020, China)
A vertical search engine web crawler system based on Beautiful-Soup information extraction technique is developed. Experiment results indicate that the effective rate of information extraction is up to 95% and can meet commercial requirements.
web crawlers; vertical search engines; business-to-customer; Beautiful-Soup
1006-7302(2013)02-0054-05
TP393
A
2013-02-25
楊亮(1987—),男,湖南湘鄉(xiāng)人,在讀碩士生,主要從事計(jì)算機(jī)網(wǎng)絡(luò)研究.