Java爬蟲框架

、        架構圖

那裏搜網絡爬蟲框架主要針對電子商務網站進行數據爬取,分析,存儲,索引。html

爬蟲:爬蟲負責爬取,解析,處理電子商務網站的網頁的內容node

數據庫:存儲商品信息web

索引:商品的全文搜索索引sql

Task隊列:須要爬取的網頁列表數據庫

Visited表:已經爬取過的網頁列表服務器

爬蟲監控平臺:web平臺能夠啓動,中止爬蟲,管理爬蟲,task隊列,visited表。網絡

2、        爬蟲

1.      流程

1)       Scheduler啓動爬蟲器,TaskMaster初始化taskQueue架構

2)       Workers從TaskQueue中獲取任務併發

3)       Worker線程調用Fetcher爬取Task中描述的網頁框架

4)       Worker線程將爬取到的網頁交給Parser解析

5)       Parser解析出來的數據送交Handler處理,抽取網頁Link和處理網頁內容

6)       VisitedTableManager判斷從URLExtractor抽取出來的連接是否已經被爬取過,若是沒有提交到TaskQueue中

2.      Scheduler

Scheduler負責啓動爬蟲器,調用TaskMaster初始化TaskQueue,同時建立一個monitor線程,負責控制程序的退出。

什麼時候退出?

當TaskQueue爲空,而且Workers中的全部線程都處於空閒狀態。而這種形勢在指定10分鐘內沒有發生任何變化。就認爲全部網頁已經所有爬完。程序退出。

3.      Task Master

任務管理器,負責管理任務隊列。任務管理器抽象了任務隊列的實現。

l        在簡單應用中,咱們可使用內存的任務管理器

l        在分佈式平臺,有多個爬蟲機器的狀況下咱們須要集中的任務隊列

在現階段,咱們用SQLLite做爲任務隊列的實現。可供替代的還有Redis。

任務管理器的處理流程:

l        任務管理器初始化任務隊列,任務隊列的初始化根據不一樣的配置可能不一樣。增量式的狀況下,根據指定的URL List初始化。而全文爬取的狀況下只預先初始化某個或幾個電子商務網站的首頁。

l        任務管理器建立monitor線程,控制整個程序的退出

l        任務管理器調度任務,若是任務隊列是持久化的,負責從任務隊列服務器load任務。須要考慮預取。

l        任務管理器還負責驗證任務的有效性驗證,爬蟲監控平臺能夠將任務隊列中的某些任務設爲失效?

4.      Workers

Worker線程池,每一個線程都會執行整個爬取的流程。能夠考慮用多個線程池,分割異步化整個流程。提升線程的利用率。

5.      Fetcher

Fetcher負責直接爬取電子商務網站的網頁。用HTTP Client實現。HTTP core 4以上已經有NIO的功能, 用NIO實現。

Fetcher能夠配置需不須要保存HTML文件

6.      Parser

Parser解析Fetcher獲取的網頁,通常的網頁可能不是無缺格式化的(XHTML是完美格式化的),這樣就不能利用XML的類庫處理。咱們須要一款比較好的HTML解析器,能夠修復這些非無缺格式化的網頁。

熟悉的第三方工具備TagSoup,nekohtml,htmlparser三款。tagsoup和nekohtml能夠將HTML用SAX事件流處理,節省了內存。

已知的第三方框架又使用了哪款做爲他們的解析器呢?

l        Nutch:正式支持的有tagsoup,nekohtml,兩者經過配置選擇

l        Droids:用的是nekohtml,Tika

l        Tika:tagsoup

據稱,tagsoup的可靠性要比nekohtml好,nekohtml的性能比tagsoup好。nekohtml不論是在可靠性仍是性能上都比htmlparser好。具體結論咱們還須要進一步測試。

咱們還支持regex,dom結構的html解析器。在使用中咱們能夠結合使用。

進一步,咱們須要研究文檔比較器,同時須要咱們保存爬取過的網站的HTML.能夠經過語義指紋或者simhash來實現。在處理海量數據的時候才須要用上。若是兩個HTML被認爲是相同的,就不會再解析和處理。

7.      Handler

Handler是對Parser解析出來的內容作處理。

回調方式(visitor):對於SAX event處理,咱們須要將handler適配成sax的content handler。做爲parser的回調方法。不一樣事件解析出來的內容能夠存儲在HandlingContext中。最後由Parser一塊兒返回。

主動方式:須要解析整個HTML,選取本身須要的內容。對Parser提取的內容進行處理。XML須要解析成DOM結構。方便使用,可使用Xpath,nodefilter等,但耗內存。

ContentHandler:它還包含組件ContentFilter。過濾content。

URLExtractor負責從網頁中提取符合格式的URL,將URL構建成Task,並提交到Task queue中。

8.      VisitedTableManager

訪問表管理器,管理訪問過的URLs。提取統一接口,抽象底層實現。若是URL被爬取過,就不會被添加到TaskQueue中。

3、        Task隊列

Task隊列存儲了須要被爬取的任務。任務之間是有關聯的。咱們能夠保存和管理這個任務關係。這個關係也是URL之間的關係。保存下來,有助於後臺造成Web圖,分析數據。

Task隊列在分佈式爬蟲集羣中,須要使用集中的服務器存放。一些輕量級的數據庫或者支持列表的NoSql均可以用來存儲。可選方案:

l          用SQLLite存儲:須要不停地插入刪除,不知性能如何。

l          用Redis存儲

4、        Visited表

Visited表存儲了已經被爬的網站。每次爬取都須要構建。

l          SQLLite存儲:須要動態建立表,須要不停地查詢,插入,還須要後臺按期地清理,不知性能如何。

l          Mysql 內存表 hash index

l          Redis: Key value,設過時時間

l          Memcached: key value, value爲bloomfilter的值

針對目前的數據量,能夠採用SQLLite

5、        爬蟲監控管理平臺

l          啓動,中止爬蟲,監控各爬蟲狀態

l          監控,管理task隊列,visited表

l          配置爬蟲

l          對爬蟲爬取的數據進行管理。在併發狀況下,很難保證不重複爬取相同的商品。在爬取完後,能夠經過爬蟲監控管理平臺進行手動排重。

瞭解更多詳情請登陸超人學院網站http://www.crxy.cn或者每週日晚八點半相約免費公開課https://ke.qq.com/course/53102#term_id=100145289  具體詳情請聯繫QQ2435014406

相關文章
相關標籤/搜索