1. 程式人生 > >我用Python寫了一個搜尋引擎

我用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