我用Python寫了一個搜索引擎

開玩笑啦,我所謂的搜索引擎就是自己在小範圍內的網頁內進行搜索的一個工具,總共代碼也就兩三百行,自然沒法跟google和百度比啦。主要是長時間沒有使用python寫過代碼了,爲免生疏,就在上班之餘寫了這麼一個小東西。
先來看一下文檔。

====================需求========================
1. 製作一個搜索引擎,輸入多個關鍵字進行搜索
2. 能查詢的網頁不下於10個
3. 顯示搜索結果列表
4. 進入網頁後顯示更多與關鍵字相關的內容
5. 允許下載網頁內容
==================設計=====================
1. 使用類SearchEngine來定義整個系統的屬性與行爲
2. SearchEngine的屬性設計如下:
(1) lstWebsites list, 需要爬蟲的網頁集合,元素類型爲字符串
(2) lstSearchedItems list, 搜索的所有網頁條目,元素類型爲元組(編號,網址,關鍵字相關文字)
(3) lstKeywords list, 輸入的關鍵字集合,空格和分號區分關鍵字
(4) strKeywords string, 關鍵字的輸入原文
(5) cmdCommand string, 進入命令狀態, cmdCommand = ‘command’
(6) cmdKeywords string, 進入關鍵詞輸入狀態, cmdCommand = ‘keywords’
(7) cmdQuit string, 退出程序,cmdQuit = ‘q’
(8) cmdBack string, 返回,cmdBack = ‘b’
(9)cmdNextPage string, 下一頁, cmdNextPage = ‘n’
(10)cmdLastPage string, 上一頁, cmdPrevPage = ‘l’
(11)cmdRefresh string, 刷新頁面, cmdRefresh = ‘r’
(12)cmdSavePage string, 下載當前網頁,cmdSavePage = ‘s’
(13)iItemsEachPage integer, 每頁顯示的條目數量
(14)iCurrentPage integer, 當前頁碼
(15)strConfigFile string, 配置文件的路徑,strConfigFile = ‘./config.ini’
(16)strSurface string, 界面狀態,strSurface = enum{‘MAIN_SURFACE’, ‘SEARCH_SURFACE’,’DETAIL_SURFACE’}
3. SearchEngine的行爲設計如下:
(1) initCommand(self) 命令初始化
(2) work(self) 系統進入工作狀態(默認關鍵字輸入狀態),打開主界面
(3)mainSurface(self,info) 主界面。info界面顯示的提示信息
(4)searchSurface(self,info) 搜索界面
(5)downWebsite(self,urlpath) 下載網頁。urlpath,要下載的網頁地址。返回下載狀態
(6)detailSurface(self,info,urlpath,content) 具體網頁進入後的界面, content 具體的網頁內容
(7) getWebContext(self,urlpath) 獲取urlpath指定網頁的更爲詳細的與keywords相關的信息
(8) useCommandInput(self,surfaceStatus) 進入命令輸入狀態, surfaceStatus當前界面狀態
(9) useKeywordsInput(self) 進入關鍵字輸入狀態
(10)divideKeywords(self) 劃分輸入的關鍵字字符串爲有效關鍵字列表
(11)getAbstractContext(self,urlpath) 獲取簡要的與關鍵字相關的信息. 在此過程中,搜索到關鍵字就將相關信息存入lstSearchedItems,並且返回true,若否返回false
(12)readConfigFile(self) 讀取配置文件
(13)startSearch(self) 開始搜索
4. 日誌類 SearchEngineLog
日誌文件: ./SearchEngine.log 每一條日誌內容: 時間(精確到妙),異常類型,詳細內容 每一條日誌佔用一行
屬性:
strLogFile string, 日誌文件路徑
iMaxLogItems integer,最大保存日誌條目數量
iCurrentItems integer,當前日誌文件中已保存的日誌條目數量
行爲:
searchLog(self,strKeywords) 記錄搜索事件, strKeywords搜索內容
webLog(self,webPath) 記錄打開網頁事件,webPath網頁路徑
errorLog(self,errInfo) 記錄發生錯誤事件,errInfo,錯誤信息
downloadLog(self,info) 記錄下載事件
writeLog(self,type,info) 寫入事件,type事件類型,info事件信息
createLogFile(self) 創建日誌文件,若已有日誌文件則不做任何處理
clearLogFile(self) 清空日誌文件,若沒有日誌文件,則CreateLogFile
getCurrTime(self) 返回當前時間,格式YYYY-MM-DD hh:mm:ss
setMaxLogItemNum(self,num) 設置最大保存日誌條數
getMaxLogItemNum(self,num) 獲取最大保存日誌條數
getCurrentLogItemsCount(self) 獲取當前已保存日誌條數
5. 命令和關鍵字
在關鍵字狀態下輸入command進入命令狀態 在命令狀態下輸入keywords進入關鍵字狀態
命令:
q — 退出
b —- 返回
n — 下一頁
l —- 上一頁
r — 刷新
s — 下載當前網頁
6. 配置文件
路徑 : ./config.ini 內容 : 網址列表,每一個網址佔用一行

實際上,要完成這個搜索引擎本來也不需要這麼多代碼,如上所述,我加了一個日誌類,用來記錄工具運行過程中的一些信息,眼尖的童鞋可能會發現這個日誌類居然還兼具有歷史記錄的功能。是的,我就是不想讓日誌類太閒。
這個subject主要有兩點我做的比較糟糕:
一、沒有做更好的異常處理
本來是想繼承幾個異常類的,最後由於不清楚代碼中某些函數的返回類型而放棄了,這個有那麼點兒尷尬,對於一些庫函數不夠深入瞭解。
二、搜索的目標是未經處理的網頁代碼
本來我是想先寫一個將html代碼轉換爲txt文本的類,幾乎已經寫完了,但是發現轉換完之後其實也就那麼點兒東西,所以就沒有轉換了。其實,這個轉換還是有用,但是時間成本有點大,所以就放棄了。如果以後我把搜索效率提高了,那我肯定會進行轉換。

在功能上,它除了查找之外,還有瀏覽、下載等功能。瀏覽的話是直接調用系統默認的瀏覽器進行瀏覽,下載是直接將網頁的內容下載到本地,所有有效圖片都會被下載下來。

其他的話,這個項目是我第一次在代碼中使用正則表達式,當留個紀念好了。整體而言,這個subject不是什麼有用的工具,但是可以作爲代碼參考(唉,總是想不出什麼可以轟動一時的東西,就天天寫寫練手代碼,真是一輩子打工命)。
最後附上鍊接:
http://download.csdn.net/detail/storymonster/9725034

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章