項(xiàng)目結(jié)構(gòu)
程序主要由三個(gè)部分組成
server : 提供各種服務(wù)的接口,并不包含復(fù)雜的處理邏輯。主要向客戶端提供數(shù)據(jù)服務(wù)。
爬蟲: 拉取溫大校內(nèi)的各種網(wǎng)站上的內(nèi)容,主要任務(wù)是生成可疑的新聞列表(可疑是因?yàn)橛绣e(cuò),會(huì)在之后的處理中進(jìn)一步排除),并緩存爬取的各種網(wǎng)頁。(另外爬蟲程序一次運(yùn)行后,長時(shí)間不必運(yùn)行)
內(nèi)容提取器: 通過新聞列表,獲取最新的新聞列表網(wǎng)頁,并將其中的新聞打開(先嘗試從緩存中獲取),通過同級內(nèi)容的差異來計(jì)算新聞的主要內(nèi)容的模式,運(yùn)用模式獲取新聞的主要內(nèi)容(在這步計(jì)算中會(huì)排除一些新聞列表)。保存新聞主要內(nèi)容
分類器: 負(fù)責(zé)新聞主要內(nèi)容的分類,計(jì)劃用貝葉斯分類算法。因?yàn)樾枰罅康囊褬?biāo)注的文檔內(nèi)容,所以還要開發(fā)一個(gè)方便人類使用的標(biāo)注文檔工具。
server
進(jìn)度:做了一個(gè)拉課表的api,隨便弄了下用戶模型
具體api的調(diào)用接口暫不描述
程序依賴:
django+mysql。
web服務(wù)器還沒定,計(jì)劃用Apache
爬蟲
進(jìn)度:基本完成,在個(gè)人電腦上運(yùn)行9小時(shí)沒有出錯(cuò)
程序結(jié)構(gòu)
如圖所示,采用redis內(nèi)存數(shù)據(jù)庫存儲(chǔ)中間數(shù)據(jù),因此帶給程序額外的特性:分布性
在選擇redis作為內(nèi)存數(shù)據(jù)庫的時(shí)候,我就計(jì)劃著做分布式程序,所以程序?qū)⑴老x程序分為三個(gè)部分,每個(gè)部分都可以開一個(gè)以上的程序,充分的利用計(jì)算機(jī)性能,也可以部署在不同的主機(jī)上實(shí)現(xiàn)分布式計(jì)算。
另外做了一個(gè)監(jiān)控程序,就是第一張圖上的內(nèi)容。每個(gè)程序都有獨(dú)立的日志,便于調(diào)試。還有新聞列表和網(wǎng)頁內(nèi)容的緩存都是保存于mysql當(dāng)中(沒有在圖上表示出來)
內(nèi)容提取器
進(jìn)度:算法完成并通過簡單的測試,但沒有投入實(shí)際的使用環(huán)境
算法
上面的算法可以過濾網(wǎng)頁的模板,將核心內(nèi)容提取出來。
上面兩個(gè)文檔計(jì)算差異后生成的模式(反正給機(jī)器看,亂就亂吧 ^_-):
(1, 'body', [(1, 'div', [(7, 'div', [(1, 'div', [(1, 'div', [(3, 'div', [(1, 'div', [(1, 'div', []), (3, 'div', [])]), (5, 'div', []), (7, 'div', [(0, 'div', [(1, 'div', []), (3, 'div', [])])])])])])])])])
通過模式在文檔1中提取的內(nèi)容數(shù)據(jù):
另外:
- 文檔1和文檔2根據(jù)新聞列表來產(chǎn)生,并且產(chǎn)生的模式將會(huì)應(yīng)用于該新聞列表的所有新聞,
- 文檔提取的內(nèi)容沒有將html標(biāo)志去除,因?yàn)樵谥蟮拈_發(fā)中會(huì)用到超文本信息,比如圖片,加粗等信息
- 因?yàn)閮H計(jì)算差異性,所以很可能產(chǎn)生非常不好的模式,比如兩個(gè)無關(guān)的網(wǎng)頁計(jì)算模式的結(jié)果將會(huì)把網(wǎng)頁的大部分內(nèi)容保留下來。所以文檔內(nèi)容在直接使用之前需要進(jìn)一步計(jì)算:文檔分類中分類無用文檔。
分類器
進(jìn)度:完全沒著手