基于linux和php的稳定的分布式数据采集架构
數(shù)據(jù)采集對(duì)于一些網(wǎng)站至關(guān)重要,在開(kāi)發(fā)這種采集程序時(shí)會(huì)遇到如下一些問(wèn)題:
一、單進(jìn)程采集慢,采集任務(wù)的間隔時(shí)間無(wú)法控制。
二、數(shù)據(jù)下載部分和分析部分不分離導(dǎo)致可移植性不強(qiáng),調(diào)試?yán)щy。
三、采集程序受機(jī)器性能瓶頸和網(wǎng)速瓶頸限制。
四、遭受數(shù)據(jù)源的封鎖。
等等。。。。
這就要求采集程序必須足夠智能化,有如下幾點(diǎn)要求:
一、可以多機(jī)器分布運(yùn)行,以適應(yīng)大量數(shù)據(jù)的采集。
二、能夠多并發(fā)采集,使采集任務(wù)的運(yùn)行周期可控。
三、下載程序和分析程序分離,不僅是程序上的分離,也需要機(jī)器上的分離。
四、能夠很容易的加入新的采集任務(wù),很容易的調(diào)試。
五、對(duì)采集頁(yè)面內(nèi)容的分析能夠模糊匹配。
六、下載時(shí)能夠調(diào)用代理。
七、長(zhǎng)期自動(dòng)維護(hù)一個(gè)有效的代理列表
經(jīng)過(guò)幾次大的改動(dòng),我現(xiàn)在設(shè)計(jì)的基于linux和php的采集程序架構(gòu)如下:
Snatch(主目錄)
? ?|-Lib(類庫(kù)、函數(shù)、配置的目錄)
? ?|? ?|-Config.inc.php(主程序變量配置)
? ?|? ?|-OtherConfig.inc.php(其他配置文件若干)
? ?|? ?|-Functions.inc.php(函數(shù)文件若干)
? ?|? ?|-Classes.inc.php(類庫(kù)文件若干)
? ?|? ?|-ClassLocalDB.inc.php(連接本地?cái)?shù)據(jù)庫(kù)的操作類)
? ?|? ?|-ClassRemoteDB.inc.php(連接遠(yuǎn)程數(shù)據(jù)庫(kù)的操作類)
? ?|? ?|-ClassLog.inc.php(寫下載分析的日志)
? ?|-Paser(分析器程序目錄)
? ?|? ?|-WebSite1(針對(duì)WebSite1的分析程序目錄)
? ?|? ?|? ?|-WebSite1Paser1.php(針對(duì)WebSite1的分析程序1)
? ?|? ?|? ?|-WebSite1Paser2.php(針對(duì)WebSite1的分析程序2)
? ?|? ?|-WebSite2(針對(duì)WebSite2的分析程序目錄)
? ?|? ?|-ProxyWebSite1(分析代理服務(wù)器列表的站點(diǎn)1,取得代理服務(wù)器地址并入庫(kù))
? ?|? ?|-ProxyWebSite2(分析代理服務(wù)器列表的站點(diǎn)2,取得代理服務(wù)器地址并入庫(kù))
? ?|? ?|-... ...
? ?|-Log(日志目錄)
? ?|? ?|-WebSite1.log(WebSite1的下載及數(shù)據(jù)分析日志)
? ?|? ?|-WebSite2.log(WebSite2的下載及數(shù)據(jù)分析日志)
? ?|? ?|-... ...
? ?|-Files(下載后的文件保存目錄)
? ?|-Main.php(主入口程序,分配下載任務(wù))
? ?|-Assign.php(取得下載任務(wù),分配給Down.php執(zhí)行)
? ?|-Down.php(進(jìn)行下載并將下載保存的文件調(diào)出來(lái)分析)
? ?|-DelOvertimeData.php(清除很老的下載文件)
? ?|-ErrorNotice.php(監(jiān)控下載程序,在其出錯(cuò)時(shí)發(fā)信通知相關(guān)人)
? ?|-Proxy.php(校驗(yàn)數(shù)據(jù)庫(kù)中的代理列表,分析其有效性及連接速度)
? ?|-Fork(鉤子程序,使下載和分析并發(fā))
? ?|-Main.sh(封裝Main.php,使其在shell下運(yùn)行不出現(xiàn)包含路徑錯(cuò)誤)
? ?|-Assign.sh(封裝Assign.php)
? ?|-DelOvertimeData.sh(封裝DelOvertimeData.php)
? ?|-ErrorNotice.sh(封裝ErrorNotice.php)
? ?|-Proxy.sh(封裝Proxy.php)
? ?
本地?cái)?shù)據(jù)庫(kù)表結(jié)構(gòu)如下(簡(jiǎn)單介紹):
? ?DownloadList表:
? ?? ?`ID` int(10) unsigned NOT NULL auto_increment,? ?自增ID
? ?? ?`ParentID` int(11) NOT NULL default '0',? ?? ?? ?父ID,也就是該記錄由哪個(gè)下載記錄衍生來(lái)的
? ?? ?`SiteName` char(32) NOT NULL default '',? ?? ?? ?采集網(wǎng)站的名稱或代號(hào)
? ?? ?`LocalServerName` char(32) NOT NULL default '',??該采集任務(wù)由本地若干臺(tái)機(jī)器里的哪一臺(tái)來(lái)完成
? ?? ?`URL` char(255) NOT NULL default '',? ?? ?? ?? ? 需要下載的數(shù)據(jù)頁(yè)地址
? ?? ?`FileName` char(64) NOT NULL default '',? ?? ?? ?下載后保存的文件名
? ?? ?`FileSize` int(11) NOT NULL default '0',? ?? ?? ?下載后文件的大小
? ?? ?`Handler` char(64) NOT NULL default '',? ?? ?? ? 分析器的php文件路徑,如./Paser/WebSite1/Paser1.php
? ?? ?`Status` enum('Wait','Download','Doing','Done','Dead') NOT NULL default 'Wait',? ?? ?該任務(wù)的狀態(tài)
? ?? ?`ProxyID` int(11) NOT NULL default '0',? ?? ?? ? 該任務(wù)使用的代理ID,為0則不使用代理下載
? ?? ?`Remark` char(100) NOT NULL default '',? ?? ?? ? 備注字段
? ?? ?`WaitAddTime` datetime NOT NULL default '0000-00-00 00:00:00',? ???記錄加入進(jìn)行等待的時(shí)間
? ?? ?`DownloadAddTime` datetime NOT NULL default '0000-00-00 00:00:00',??記錄開(kāi)始下載的時(shí)間
? ?? ?`DoingAddTime` datetime NOT NULL default '0000-00-00 00:00:00',? ???記錄開(kāi)始分析的時(shí)間
? ?? ?`DoneAddTime` datetime NOT NULL default '0000-00-00 00:00:00',? ?? ?記錄完成的時(shí)間
? ?? ?
? ?ProxyList表:
? ?? ?`ID` int(11) NOT NULL auto_increment,? ?? ? 自增ID
? ?? ?`Proxy` char(30) NOT NULL default '',? ?? ? 代理地址,如: 127.0.0.1:8080
? ?? ?`Status` enum('Bad','Good','Perfect') NOT NULL default 'Bad',? ? 該代理狀態(tài)
? ?? ?`SocketTime` float NOT NULL default '3',? ?? ?? ?? ?? ?? ?? ?? ? 本地連接該代理socket時(shí)間
? ?? ?`UsedCount` int(11) NOT NULL default '0',? ?? ?? ?? ?? ?? ?? ?? ?被使用的次數(shù)
? ?? ?`AddTime` datetime NOT NULL default '0000-00-00 00:00:00',? ?? ? 代理被加入列表的時(shí)間
? ?? ?`LastTime` datetime NOT NULL default '0000-00-00 00:00:00',? ?? ?代理被最后一次驗(yàn)證的時(shí)間
? ?? ?
? ?其它相關(guān)表:(略)
? ?
介紹幾個(gè)文件(只介紹,不貼代碼):
一、Main.php
close();
?>
? ??
二、Assign.php
/dev/null";?
}
$LocalDB->close();
?>
三、Down.php
四、Proxy.php (維護(hù)有效的代理列表)
? ? 方法有兩種:
? ? 1、對(duì)代理地址的代理端口進(jìn)行socket連接。設(shè)定連接超時(shí)為3秒(3秒仍舊連不上的代理就別要了)
? ?? ? 如果連接上了,計(jì)算連接時(shí)間,并更新該代理記錄的數(shù)據(jù)SocketTime字段,判斷其Status是Bad, Good,還是Perfect
? ? 2、對(duì)于非Bad的代理,進(jìn)行下載文件的實(shí)驗(yàn),如果沒(méi)使用代理下載的文件和使用代理下載的文件一樣,則該代理真實(shí)有效。
? ??
? ? 程序略
? ??
多臺(tái)機(jī)器分布式采集:
只有一臺(tái)運(yùn)行Main.sh,2分鐘運(yùn)行一次。
其他機(jī)器運(yùn)行Assign.sh,1分鐘一次,Assign.php會(huì)根據(jù)DownloadList表里的LocalServerName字段來(lái)取回任務(wù)并完成它。
LocalServerName值由Main.php加載采集任務(wù)時(shí)分配。這個(gè)也可以根據(jù)各采集機(jī)器負(fù)載情況來(lái)自動(dòng)調(diào)整。
日志:
采集分析的日志寫如Log目錄,以便方便的查看到是否采集到數(shù)據(jù),分析程序是否有效,在出現(xiàn)錯(cuò)誤時(shí)也可以找到錯(cuò)誤的可能地點(diǎn)和時(shí)間。
有點(diǎn)復(fù)雜,我只寫了大體思路,頁(yè)面分析部分沒(méi)有涉及,但是也非常重要。
后臺(tái)管理也沒(méi)談。
架起來(lái)之后很爽,只要你采集的機(jī)器多,建一個(gè)qihoo沒(méi)問(wèn)題。
以前公司做的采集就是這個(gè)架構(gòu),采集sina, tom, 163等等一共143個(gè)頻道的內(nèi)容。
對(duì)某幾個(gè)網(wǎng)站收費(fèi)數(shù)據(jù)的精確采集和分析也用的這個(gè)(當(dāng)然,需要模擬登錄)。
還是相當(dāng)穩(wěn)定的
轉(zhuǎn)載于:https://www.cnblogs.com/xlfhnny/p/4456410.html
總結(jié)
以上是生活随笔為你收集整理的基于linux和php的稳定的分布式数据采集架构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 开发者必备的12个JavaScript库
- 下一篇: PCB编辑快捷键