快速構(gòu)建實(shí)時(shí)抓取集群
本文轉(zhuǎn)載自淘寶搜索技術(shù)博客,描述了實(shí)時(shí)抓取集群的架構(gòu)。其架構(gòu)中使用Redis作為核心的LinkBase存儲(chǔ),包括了使用List結(jié)構(gòu)來(lái)存儲(chǔ)抓取隊(duì)列,使用Hash結(jié)構(gòu)來(lái)存儲(chǔ)鏈接表及使用Sorted Sets結(jié)構(gòu)來(lái)存儲(chǔ)已抓取集合。
注:原文中描述的已抓取集合是使用Set結(jié)構(gòu)來(lái)存儲(chǔ),應(yīng)該是不正確的,NoSQLFan進(jìn)行了修改,如果修改有問(wèn)題,歡迎指正。
定義
首先,我們定義一下定向抓取,定向抓取是一種特定的抓取需求,目標(biāo)站點(diǎn)是已知的,站點(diǎn)的頁(yè)面是已知的。本文的介紹里面,主要是側(cè)重于如何快速構(gòu)建一個(gè)實(shí)時(shí)的抓取系統(tǒng),并不包含通用意義上的比如鏈接分析,站點(diǎn)發(fā)現(xiàn)等等特性。
在本文提到的實(shí)例系統(tǒng)里面,主要用到linux+mysql+Redis+django+scrapy+webkit,其中scrapy+webkit作為抓取端,Redis作為鏈接庫(kù)存儲(chǔ),mysql作為網(wǎng)頁(yè)信息存儲(chǔ),django作為爬蟲(chóng)管理界面,快速實(shí)現(xiàn)分布式抓取系統(tǒng)的原型。
名詞解析
•1. 抓取環(huán):抓取環(huán)指的是spider在存儲(chǔ)中獲取url,從互聯(lián)網(wǎng)上下載網(wǎng)頁(yè),然后將網(wǎng)頁(yè)存儲(chǔ)到數(shù)據(jù)庫(kù)里面,最后在從存儲(chǔ)里面獲取下一個(gè)URL的一個(gè)流程。
•2. Linkbase:鏈接庫(kù)的存儲(chǔ)模塊,包含一般的鏈接信息;是抓取系統(tǒng)的核心,使用Redis存儲(chǔ)。
•3. XPATH:一門(mén)在 XML 文檔中查找信息的語(yǔ)言,XPath 可用來(lái)在 XML 文檔中對(duì)元素和屬性進(jìn)行遍歷, 是 W3C XSLT 標(biāo)準(zhǔn)的主要元素。使用XPATH以及相關(guān)工具lib進(jìn)行鏈接抽取和信息抽取。
•4. XPathOnClick:一個(gè)chrome的插件,支持點(diǎn)擊頁(yè)面元素,獲取XPATH路徑,用于編輯配置模板。
•5. Redis:一個(gè)開(kāi)源的KV的內(nèi)存數(shù)據(jù)庫(kù),具備很好的數(shù)據(jù)結(jié)構(gòu)的特征和很高的存取性能。用于存儲(chǔ)linkbase信息。
•6. Django:爬蟲(chóng)管理工具,用于模板配置,系統(tǒng)監(jiān)控反饋。Django在這里主要是用來(lái)管理一個(gè)數(shù)據(jù)庫(kù),使用Admin功能。
•7. Pagebase:頁(yè)面庫(kù),主要是存儲(chǔ)網(wǎng)頁(yè)抓取的結(jié)果,以及頁(yè)面抽取的結(jié)果,和dump交互,使用mysql實(shí)現(xiàn)。
•8. Scrapy:一個(gè)開(kāi)源的基于twisted框架的python的單機(jī)爬蟲(chóng),該爬蟲(chóng)實(shí)際上包含大多數(shù)網(wǎng)頁(yè)抓取的工具包,用于爬蟲(chóng)下載端以及抽取端。
•9. 列表頁(yè):指的商品頁(yè)面之外的所有頁(yè)面。
•10. 詳情頁(yè):比如商品B2C的抓取中,特指商品頁(yè)面,比如這里。
系統(tǒng)架構(gòu)
存儲(chǔ):Redis+mysql
鏈接庫(kù)(linkbase)是抓取系統(tǒng)的核心,基于性能和效率的考慮,本文采用基于內(nèi)存的Redis和磁盤(pán)的mysql為主,對(duì)于linkbase主要是存儲(chǔ)抓取必須的鏈接信息,比如url,anchor,等等;對(duì)于mysql,則是存放抓取的網(wǎng)頁(yè),便于后續(xù)的抽取和處理。
a. PageBase:使用Mysql分庫(kù)分表,存放網(wǎng)頁(yè),如下圖:
1.png (19.35 KB, 下載次數(shù): 44)
下載附件
2012-02-16 19:26 上傳
b. Linkbase 使用Redis集群,存儲(chǔ)linkbase信息。
2.png (18.24 KB, 下載次數(shù): 43)
下載附件
2012-02-16 19:26 上傳
幾個(gè)基本的數(shù)據(jù)結(jié)構(gòu)
1.抓取隊(duì)列 (candidate list)
分為待抓取的url隊(duì)列和更新的url隊(duì)列;隊(duì)列存放urlhash,使用Redis的list數(shù)據(jù)結(jié)構(gòu),對(duì)于新提取的url,push到對(duì)應(yīng)的列表里面,對(duì)于spider抓取模塊,從list pop得到。對(duì)于一個(gè)站點(diǎn)而言,抓取隊(duì)列有兩種類(lèi)型:列表頁(yè)抓取隊(duì)列和詳情頁(yè)抓取隊(duì)列。
2.鏈接庫(kù) (linkbase)
鏈接庫(kù)實(shí)際上是存儲(chǔ)鏈接信息的DB;Key是urlhash,Value是linkinfo,包含url,purl,anchor,xpath…;在Redis使用hash存儲(chǔ),直接存放在Redis的里面。KV鏈接庫(kù),不區(qū)分頁(yè)面類(lèi)型。
3.已抓取集合(crawled_set)
已抓取集合指的是當(dāng)前已經(jīng)下載的頁(yè)面的urlhash,存放已經(jīng)抓取的網(wǎng)頁(yè),使用Redis的sorted sets實(shí)現(xiàn),sorted sets的key是urlhash,score是時(shí)間戳,已抓取集合主要是用來(lái)記錄哪一些頁(yè)面已經(jīng)抓取和抓取的時(shí)間,用于后續(xù)的更新頁(yè)面調(diào)度以及抓取信息的統(tǒng)計(jì)。同抓取隊(duì)列一樣,每一個(gè)站點(diǎn)有兩種類(lèi)型的已抓取集合,詳情頁(yè)和列表頁(yè)
調(diào)度模塊
調(diào)度模塊是抓取系統(tǒng)的關(guān)鍵,調(diào)度系統(tǒng)的好壞決定了抓取系統(tǒng)的效率;這塊是主要是在Redis linkbase之上的數(shù)據(jù)結(jié)構(gòu),主要有抓取隊(duì)列、抓取集合、抓取優(yōu)先級(jí)等等數(shù)據(jù)結(jié)構(gòu)組成;對(duì)于一個(gè)抓取循環(huán)來(lái)說(shuō):獲取URL,提交到抓取模塊的待抓取隊(duì)列,啟動(dòng)抓取,抓取完成之后對(duì)新鏈接進(jìn)行抽取,最后進(jìn)入等待抓取的隊(duì)列里面。
調(diào)度系統(tǒng)的基本配置:
a) 頻率(間隔多少秒)
b) 各個(gè)抓取列表的選取比例:get_detail,mod_detail,get_list,mod_list
鏈接抽。撼槿№(yè)面的鏈接,進(jìn)行除重,對(duì)于新的鏈接,插入到待抓取列表里。
內(nèi)容抽。喊凑漳K的配置XPATH,抽取頁(yè)面信息,并寫(xiě)入到pagebase中。
離線(xiàn)調(diào)度:按照更新的比例,從crawled_set里面,定期選取url進(jìn)入Mod隊(duì)列里面進(jìn)行刷新。
抓取模塊
抓取模塊是抓取的必要條件,抓取模塊來(lái)說(shuō),重要的是應(yīng)付互聯(lián)網(wǎng)上各式的問(wèn)題,以及如何實(shí)現(xiàn)對(duì)對(duì)方站點(diǎn)的ip平衡,當(dāng)然,這塊是和調(diào)度系統(tǒng)的緊密結(jié)合的,對(duì)于抓取模塊而言,本文主要使用scrapy工具包里面的下載模塊。
首先,抓取模塊從linkbase獲取對(duì)應(yīng)站點(diǎn)的抓取url,進(jìn)行頁(yè)面下載,然后將頁(yè)面信息寫(xiě)回到pipeline中,并完成鏈接抽取和頁(yè)面抽取,同時(shí)調(diào)用調(diào)度模塊,插入到linkbase和pagebase中。
下載端設(shè)計(jì):
IP:每臺(tái)機(jī)器需要配置多個(gè)物理公網(wǎng)IP,下載的時(shí)候,隨機(jī)選擇一個(gè)IP下載
抓取頻度調(diào)整:讀取配置文件,按照配置文件的抓取頻率進(jìn)行選取url
配置界面
配置界面主要是對(duì)抓取系統(tǒng)的管理和配置,包括:站點(diǎn)feed、頁(yè)面模塊抽取、報(bào)表系統(tǒng)的反饋等等。
類(lèi)似于通用的抓取架構(gòu),本文提到的抓取系統(tǒng)架構(gòu)如下圖:
3.png (80.45 KB, 下載次數(shù): 44)
下載附件
2012-02-16 19:26 上傳
一個(gè)完整的抓取數(shù)據(jù)流:
•1:用戶(hù)提供種子URL
•2:種子URL進(jìn)入linkbase中新URL隊(duì)列中
•3:調(diào)度模塊選取url進(jìn)入到抓取模塊的待抓取隊(duì)列中
•4:抓取模塊讀取站點(diǎn)的配置文件,按照?qǐng)?zhí)行的頻率進(jìn)行抓取
•5:抓取的結(jié)果返回到pipeline接口中,并完成連接的抽取
•6:新發(fā)現(xiàn)的連接在linkbase里面進(jìn)行dedup,并push到linkbase的新URL模塊里面
•7:調(diào)度模塊選取url進(jìn)入抓取模塊的待抓取隊(duì)列,goto 4
•8:end
系統(tǒng)擴(kuò)展
本文提到的抓取系統(tǒng),核心是調(diào)度和存儲(chǔ)模塊;其中,抓取,存儲(chǔ),調(diào)度都是通過(guò)數(shù)據(jù)進(jìn)行交互的,因此,模塊之間可以任意平行擴(kuò)展,對(duì)于系統(tǒng)規(guī)模來(lái)說(shuō),只需要平行擴(kuò)展mysql和Redis存儲(chǔ)服務(wù)集群以及抓取集群即可。當(dāng)然,簡(jiǎn)單的擴(kuò)展會(huì)帶來(lái)一些問(wèn)題:比如垃圾列表頁(yè)的泛濫,鏈接庫(kù)的膨脹等等問(wèn)題,這些問(wèn)題后續(xù)在討論吧。
來(lái)源:www.searchtb.com
|