自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何設(shè)計一個復(fù)雜的分布式爬蟲系統(tǒng)?

開發(fā) 后端 分布式
一個復(fù)雜的分布式爬蟲系統(tǒng)由很多的模塊組成,每個模塊是一個獨立的服務(wù)(SOA架構(gòu)),所有的服務(wù)都注冊到Zookeeper來統(tǒng)一管理和便于線上擴展。模塊之間通過thrift(或是protobuf,或是soup,或是json,等)協(xié)議來交互和通訊。

一個復(fù)雜的分布式爬蟲系統(tǒng)由很多的模塊組成,每個模塊是一個獨立的服務(wù)(SOA架構(gòu)),所有的服務(wù)都注冊到Zookeeper來統(tǒng)一管理和便于線上擴展。模塊之間通過thrift(或是protobuf,或是soup,或是json,等)協(xié)議來交互和通訊。

Zookeeper負(fù)責(zé)管理系統(tǒng)中的所有服務(wù),簡單的配置信息的同步,同一服務(wù)的不同拷貝之間的負(fù)載均衡。它還有一個好處是可以實現(xiàn)服務(wù)模塊的熱插拔。

URLManager是爬蟲系統(tǒng)的核心。負(fù)責(zé)URL的重要性排序,分發(fā),調(diào)度,任務(wù)分配。單個的爬蟲完成一批URL的爬取任務(wù)之后,會找 URLManager要一批新的URL。一般來說,一個爬取任務(wù)中包含幾千到一萬個URL,這些URL***是來自不同的host,這樣,不會給一個 host在很短一段時間內(nèi)造成高峰值。

ContentAcceptor負(fù)責(zé)收集來自爬蟲爬到的頁面或是其它內(nèi)容。爬蟲一般將爬取的一批頁面,比如,一百個頁面,壓縮打包成一個文件,發(fā)送給ContentAcceptor。ContentAcceptor收到后,解壓,存儲到分布式文件系統(tǒng)或是分布式數(shù)據(jù)庫,或是直接交給 ContentParser去分析。

CaptchaHandler負(fù)責(zé)處理爬蟲傳過來的captcha,通過自動的captcha識別器,或是之前識別過的captcha的緩存,或是通過人工打碼服務(wù),等等,識別出正確的碼,回傳給爬蟲,爬蟲按照定義好的爬取邏輯去爬取。

RobotsFileHandler負(fù)責(zé)處理和分析robots.txt文件,然后緩存下來,給ContentParser和 URLManager提供禁止爬取的信息。一個行為端正的爬蟲,原則上是應(yīng)該遵守robots協(xié)議。但是,現(xiàn)在大數(shù)據(jù)公司,為了得到更多的數(shù)據(jù),基本上遵守這個協(xié)議的不多。robots文件的爬取,也是通過URLManager作為一種爬取類型讓分布式爬蟲去爬取的。

ProxyManager負(fù)責(zé)管理系統(tǒng)用到的所有Proxy,說白了,負(fù)責(zé)管理可以用來爬取的IP。爬蟲詢問ProxyManager,得到一批 Proxy IP,然后每次訪問的時候,會采用不同的IP。如果遇到IP被屏蔽,即時反饋給ProxyManager,ProxyManager會根據(jù)哪個host屏蔽了哪個IP做實時的聰明的調(diào)度。

Administor負(fù)責(zé)管理整個分布式爬蟲系統(tǒng)。管理者通過這個界面來配置系統(tǒng),啟動和停止某個服務(wù),刪除錯誤的結(jié)果,了解系統(tǒng)的運行情況,等等。

各種不同類型的爬取任務(wù),比如,像給一個URL爬取一個頁面( NormalCrawler),像需要用戶名和密碼注冊然后才能爬取( SessionCrawler ),像爬取時先要輸入驗證碼( CaptchaCrawler ),像需要模擬用戶的行為來爬取( Simulator ),像移動頁面和內(nèi)容爬取( MobileCrawler ),和像App內(nèi)內(nèi)容的爬取( AppCrawler),需要不同類型的爬蟲來爬取。當(dāng)然,也可以開發(fā)一個通用的爬蟲,然后根據(jù)不同的類型實施不同的策略,但這樣一個程序內(nèi)的代碼復(fù)雜,可擴展性和可維護性不強。

一個爬蟲內(nèi)部的爬取邏輯,通過解釋從配置文件 CrawlLogic 來的命令來實現(xiàn),而不是將爬取邏輯硬編碼在爬蟲程序里面。對于復(fù)雜的爬取邏輯,甚至可以通過用代碼寫的插件來實現(xiàn)。

ContentParser根據(jù)URLExtractionRules來抽取需要繼續(xù)爬取的URL,因為focus的爬蟲只需要爬取需要的數(shù)據(jù),不是網(wǎng)站上的每個URL都需要爬取。ContentParser還會根據(jù)FieldExtractionRules來抽取感興趣的數(shù)據(jù),然后將原始數(shù)據(jù)結(jié)構(gòu)化。由于動態(tài)生成的頁面很多,很多數(shù)據(jù)是通過Javascript顯示出來的,需要JavascriptEngine來幫助分析頁面。這兒需要提及下,有些頁面大量使用AJAX來實時獲取和展示數(shù)據(jù),那么,需要一個能解釋Javascript的爬蟲類型來處理這些有AJAX的情形。

為了監(jiān)控整個系統(tǒng)的運行情況和性能,需要 Monitor 系統(tǒng)。為了調(diào)試系統(tǒng),保障系統(tǒng)安全有據(jù)可循,需要 Logger 系統(tǒng)。有了這些,系統(tǒng)才算比較完備。

所有的數(shù)據(jù)會存在分布式文件系統(tǒng)或是數(shù)據(jù)庫中,這些數(shù)據(jù)包括URL( URLRepo),Page( PageRepo )和Field( FieldRepo ),至于選擇什么樣的存儲系統(tǒng),可以根據(jù)自己現(xiàn)有的基礎(chǔ)設(shè)施和熟悉程度而定。

為了擴大爬蟲系統(tǒng)的吞吐量,每個服務(wù)都可以橫向擴展,包括橫向復(fù)制,或是按URL來分片(sharding)。由于使用了Zookeeper,給某個服務(wù)增加一個copy,只用啟動這個服務(wù)就可以了,剩下的Zookeeper會自動處理。

這里只是給出了復(fù)雜分布式爬蟲系統(tǒng)的大框架,具體實現(xiàn)的時候,還有很多的細(xì)節(jié)需要處理,這時,之前做過爬蟲系統(tǒng),踩過坑的經(jīng)驗就很重要了。

責(zé)任編輯:未麗燕 來源: 推酷
相關(guān)推薦

2023-03-06 08:14:48

MySQLRedis場景

2018-09-06 22:49:31

分布式架構(gòu)服務(wù)器

2022-08-01 08:01:04

ID發(fā)號器系統(tǒng)

2013-09-11 16:02:00

Spark分布式計算系統(tǒng)

2018-05-09 09:44:51

Java分布式系統(tǒng)

2019-01-28 11:46:53

架構(gòu)運維技術(shù)

2023-09-04 08:45:07

分布式配置中心Zookeeper

2023-10-08 10:49:16

搜索系統(tǒng)分布式系統(tǒng)

2019-12-27 16:00:56

分布式事務(wù)框架Java

2024-07-15 08:25:07

2024-09-23 04:00:00

java架構(gòu)分布式系統(tǒng)

2021-11-01 12:25:56

Redis分布式

2020-07-30 09:35:09

Redis分布式鎖數(shù)據(jù)庫

2024-10-07 08:52:59

分布式系統(tǒng)分布式 IDID

2011-09-14 10:08:07

Beanstalkd

2022-06-27 08:36:27

分布式事務(wù)XA規(guī)范

2015-04-21 09:39:03

javajava分布式爬蟲

2019-09-05 09:02:45

消息系統(tǒng)緩存高可用

2022-04-07 17:13:09

緩存算法服務(wù)端

2021-06-11 17:19:06

分布式系統(tǒng)開發(fā)Web
點贊
收藏

51CTO技術(shù)棧公眾號