日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 互聯(lián)網(wǎng) > WebCollector內(nèi)核解析―如何設(shè)計一個爬蟲

WebCollector內(nèi)核解析―如何設(shè)計一個爬蟲

來源:程序員人生   發(fā)布時間:2014-10-06 08:00:01 閱讀次數(shù):3826次

本文利用WebCollector內(nèi)核的解析,來描述如何設(shè)計一個網(wǎng)絡(luò)爬蟲。我們先來看看兩個非常優(yōu)秀爬蟲的設(shè)計。

Nutch

Nutch由apache開源組織提供,主頁:http://nutch.apache.org/

Nutch是目前最好的網(wǎng)絡(luò)爬蟲之一,Nutch分為內(nèi)核和插件兩個模塊組成,內(nèi)核控制整個爬取的邏輯,插件負(fù)責(zé)完成每個細(xì)節(jié)(與流程無關(guān)的細(xì)節(jié))的實現(xiàn)。具體分工如下:

內(nèi)核:控制爬蟲按照 Inject -> Generator -> Fetch -> Parse -> Updatedb ( -> 提交索引(可選))的流程進(jìn)行,而且這些流程都是利用map reduce在hadoop上實現(xiàn)的。

插件:實現(xiàn)爬蟲的http請求、解析器、URL過濾器、索引等細(xì)節(jié)功能。

Nutch的內(nèi)核提供了穩(wěn)定的可在集群上運行的爬取機制(廣度遍歷),插件為爬蟲提供了強大的擴(kuò)展能力。


Crawler4j

Crawler4j由Yasser Ganjisaffar(微軟bing的一位工程師)提供,項目主頁:https://code.google.com/p/crawler4j/

用Crawler4j寫爬蟲,用戶只需要指定兩處:

     1) 爬蟲的種子、線程數(shù)等配置

     2)覆蓋WebCrawler類的visit(Page page)方法,對每個頁面的自定義操作(抽取、存儲)

這使得爬蟲的二次開發(fā)大大簡化,只需要定制兩處,即可定制一個完成下載/精抽取功能的爬蟲。python爬蟲scrapy也是采用這種機制。


Nutch是被設(shè)計在hadoop上的,而且插件的調(diào)度以反射的形式實現(xiàn),所以它的插件機制,并不如想象的那樣靈活。寫一個插件需要附帶幾個配置文件,并修改Nutch總配置文件。而且Nutch其實是為了搜索引擎定制的,所以NUTCH提供的掛載點,并不能做精抽取之類的業(yè)務(wù)提供很好的擴(kuò)展。

Crwler4j雖然提供精簡的用戶接口,但是并沒有一套插件機制,來定制自己的爬蟲。例如用Crawler4j來爬取新浪微博,就需要修改源碼,來完成對新浪微博的模擬登陸。



WebCollector


主頁:https://github.com/CrawlScript/WebCollector

WebCollector使用了Nutch的爬取邏輯(分層廣度遍歷),Crawler4j的的用戶接口(覆蓋visit方法,定義用戶操作),以及一套自己的插件機制,設(shè)計了一套爬蟲內(nèi)核。

WebCollector內(nèi)核構(gòu)架圖:





CrawlDB: 任務(wù)數(shù)據(jù)庫,爬蟲的爬取任務(wù)(類似URL列表)是存放在CrawlDB中的,CrawlDB根據(jù)DbUpdater和Generator所選插件不同,可以有多種形式,如文件、redis、mysql、mongodb等。

Injector: 種子注入器,負(fù)責(zé)第一輪爬取時,向CrawlDB中提交爬取任務(wù)。在斷點續(xù)爬的時候,不需要通過Injector向CrawlDB注入種子,因為CrawlDB中已有爬取任務(wù)。

Generator: 任務(wù)生成器,任務(wù)生成器從CrawlDB獲取爬取任務(wù),并進(jìn)行過濾(正則、爬取間隔等),將任務(wù)提交給抓取器。

Fetcher: 抓取器,F(xiàn)etcher是爬蟲最核心的模塊,F(xiàn)etcher負(fù)責(zé)從Generator中獲取爬取任務(wù),用線程池來執(zhí)行爬取任務(wù),并對爬取的網(wǎng)頁進(jìn)行鏈接解析,將鏈接信息更新到CrawlDB中,作為下一輪的爬取任務(wù)。在網(wǎng)頁被爬取成功/失敗的時候,F(xiàn)etcher會將網(wǎng)頁和相關(guān)信息以消息的形式,發(fā)送到Handler的用戶自定義模塊,讓用戶自己處理網(wǎng)頁內(nèi)容(抽取、存儲)。

DbUpdater: 任務(wù)更新器,用來更新任務(wù)的狀態(tài)和加入新的任務(wù),網(wǎng)頁爬取成功后需要更新CrawlDB中的狀態(tài),對網(wǎng)頁做解析,發(fā)現(xiàn)新的連接,也需要更新CrawlDB。

Handler: 消息發(fā)送/處理器,F(xiàn)etcher利用Handler把網(wǎng)頁信息打包,發(fā)送到用戶自定義操作模塊。

User Defined Operation: 用戶自定義的對網(wǎng)頁信息進(jìn)行處理的模塊,例如網(wǎng)頁抽取、存儲。爬蟲二次開發(fā)主要就是自定義User Defined Operation這個模塊。實際上User Defined Operation也是在Handler里定義的。

RequestFactory: Http請求生成器,通過RequestFactory來選擇不同的插件,來生成Http請求,例如可以通過httpclient插件來使用httpclient作為爬蟲的http請求,或者來使用可模擬登陸新浪微博的插件,來發(fā)送爬取新浪微博的http請求。

ParserFactory: 用來選擇不同的鏈接分析器(插件)。爬蟲之所以可以從一個網(wǎng)頁開始,向多個網(wǎng)頁不斷地爬取,就是因為它在不斷的解析已知網(wǎng)頁中的鏈接,來發(fā)現(xiàn)新的未知網(wǎng)頁,然后對新的網(wǎng)頁進(jìn)行同樣的操作。


爬取邏輯:

WebCollector和Nutch一樣,把爬蟲的廣度遍歷拆分成了分層的操作。

第一層:爬取一個網(wǎng)頁,http://www.apache.org/,解析網(wǎng)頁,獲取3個鏈接,將3個鏈接保存到CrawlDB中,設(shè)置狀態(tài)為未爬取。同時將http://www.apache.org/的爬取狀態(tài)設(shè)置為已爬取。結(jié)束第一輪。

第二層,找到CrawlDB中狀態(tài)為未爬取的頁面(第一層解析出來的3個鏈接),分別爬取,并解析網(wǎng)頁,一共獲得8個鏈接。和第一層操作一樣,將解析出的鏈接放入CrawlDB,設(shè)置為未爬取,并將第二層爬取的三個頁面,狀態(tài)設(shè)置為已爬取。

第三層,找到CrawlDB中狀態(tài)為未爬取的頁面(第二層解析出來的8個鏈接).................


每一層都可以作為一個獨立的任務(wù)去運行,所以可以將一個大型的廣度遍歷任務(wù),拆分成一個一個小任務(wù)。爬蟲里有個參數(shù),設(shè)置爬取的層數(shù),指的就是這個。


插件機制:

框架圖中的 Injector、Generator、Request(由RequestFactory生成)、Parser(由ParserFactory生成)、DbUpdater、Response都是以插件實現(xiàn)的。制作插件往往只需要自定義一個實現(xiàn)相關(guān)接口的類,并在相關(guān)Factory內(nèi)指定即可。

WebCollector內(nèi)置了一套插件(cn.edu.hfut.dmic.webcollector.plugin.redis)?;谶@套插件,可以把WebCollector的任務(wù)管理放到redis數(shù)據(jù)庫上,這使得WebCollector可以爬取海量的數(shù)據(jù)(上億級別)。


用戶自定義操作:


對于用戶來說,關(guān)注的更多的不是爬蟲的爬取流程,而是對每個網(wǎng)頁要進(jìn)行什么樣的操作。對網(wǎng)頁進(jìn)行抽取、保存還是其他操作,應(yīng)該是由用戶自定義的。

假設(shè)我們有個需求,要爬取《知乎》上的所有提問。對用戶來說,只需要定義對知乎的提問如何抽取。


public class ZhihuCrawler extends BreadthCrawler{ /*visit函數(shù)定制訪問每個頁面時所需進(jìn)行的操作*/ @Override public void visit(Page page) { String question_regex="^http://www.zhihu.com/question/[0-9]+"; if(Pattern.matches(question_regex, page.getUrl())){ System.out.println("正在抽取"+page.getUrl()); /*抽取標(biāo)題*/ String title=page.getDoc().title(); System.out.println(title); /*抽取提問內(nèi)容*/ String question=page.getDoc().select("div[id=zh-question-detail]").text(); System.out.println(question); } } /*啟動爬蟲*/ public static void main(String[] args) throws IOException{ ZhihuCrawler crawler=new ZhihuCrawler(); crawler.addSeed("http://www.zhihu.com/question/21003086"); crawler.addRegex("http://www.zhihu.com/.*"); crawler.start(5); } }


覆蓋BreadthCrawler類的visit方法,即可實現(xiàn)用戶自定義操作,完全不用考慮爬蟲的爬取邏輯。



WebCollector的設(shè)計主要來自于Nutch,相當(dāng)于將Nutch抽象成了一個爬蟲內(nèi)核。

最后再次附上項目地址:https://github.com/CrawlScript/WebCollector






生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 亚洲精品久久久久中文字幕欢迎你 | 久久麻豆 | 久久久久国产精品一区二区 | 欧美日韩福利视频 | 久久网页 | 日韩毛片在线看 | 91视频在| 成人午夜视频在线观看 | 日本暖暖在线视频 | 日韩欧美一区在线 | 日韩在线观看视频免费 | 亚洲国产精品久久久 | 精品美女久久久久久免费 | 久久成人免费视频 | 久久观看 | 99精品国产高清一区二区麻豆 | 中文字幕成人av | 精品一区二区不卡 | 国产亚洲欧洲 | 天天综合网日日夜夜 | 国产精品久久久久一区二区三区 | 日韩成人在线电影 | 欧美日韩精品一区二区在线播放 | 日韩久久片| 精品视频亚洲 | 狠狠操电影| 插插视频 | 国产精品美女久久久久 | 黄色成人在线视频 | 亚洲一区二区三区在线视频 | 欧美日韩一卡二卡三卡 | 美女视频黄是免费的 | 国产精品中文字幕在线播放 | 精品日韩在线观看 | 中文在线а√天堂官网 | 国产91免费视频 | 黄色免费大片 | 国产高清在线精品一区二区三区 | 懂色av蜜乳av一二三区 | 精品2区 | 一区久久久 |