這一篇將簡要介紹一下JobSearch的結構,同時發下源碼,來點干貨,等過兩天閑的時候將圍繞這個程序簡單介紹搜索引擎的各部分,同時談談個人的一些理解。程序寫的比較簡單,基礎好的話很容易就能看懂(因為寫的比較早,所以代碼比較亂,還望各位勿噴啊)。
SVN地址:http://code.taobao.org/svn//jobsearch/trunk
源文件下載地址:http://files.cnblogs.com/good-temper/jobsearch.rar
1、程序結構
程序框架如下:
(1)、爬蟲從招聘網站通過列表頁抓取招聘頁面,將招聘信息解析出后存入數據庫
(2)、通過Luence實現的索引器存數據庫讀取解析出來的信息,進行分詞並建立索引文件
(3)、用戶輸入關鍵詞提交給查詢器
(4)、查詢器將關鍵詞分詞並檢索索引文件,獲得匹配的記錄集合,根據記錄的id查詢數據庫取出數據反饋給用戶。(這里偷了個懶,建立索引是直接將數據表所有字段都存進了索引文件,這樣查詢時就不需要讀取數據庫了,但是這是一個非常糟糕的設計,原因以后詳細分析時會說明)
程序的源文件結構如下:
//需要說的是部分文件是從更早期的一個爬蟲程序里邊拷貝過來的,原項目是gbk的,而本項目是utf-8的,所以有部分中文注釋亂碼,而且一些文件沒有用到
JobSearch
com.crawler.action //這個就不解釋了,struts你懂得
com.crawler.analysis //解析包,本來想用htmlparser,后來覺得挺簡單的就直接自己寫正則了
ContentAnalysis.java //內容頁解析類
ListAnalysis.java //列表頁解析類
com.crawler.contraller //控制包
Contraller.java //總控類,所有抓取爬蟲都在此啟動
job51Contraller.java //51Job的抓取控制類,主要是啟動多個線程進行抓取,並維護一個鏈接隊列進行任務調度
com.crawler.database //數據庫操作
MysqlOperater.java //mysql操作類
SqliteOperater.java //sqlite的操作類,我自己寫的小程序喜歡用sqlite,輕量級且方便移植。這里本來打算用的,最后因多種原因未使用。
com.crawler.entity //實體類,當時百度出的這個單詞......好吧,今天知道人們其實更喜歡寫成model
Queue.java //隊列接口
ArrayQueue.java //隊列類,為甚么要自己實現?因為當時不知道java已經實現了Queue,就在網上考了一個,當然看了下代碼其實很簡單,使 用了模板,而且線程安全
SearchResult.java //查詢結果類
SimpleContent.java //簡單格式的置為內容類,這個......我也忘了當時為啥要定義這個,難道想減少客戶端請求時傳遞的信息量?
PageContent.java //頁面內容類,用來存儲頁面解析后的信息
UrlInfo.java //Url信息類
com.crawler.filter //本來打算實現過濾器的,實現鏈接的濾重,但是最后偷懶直接比對的數據庫,就沒實現。這個之前實現過,采用的Bloom Filter 實現,之后細講會講到的
com.crawler.htmlop //html操作
GetHtml.java //請求網路獲取html文件
com.crawler.io //io操作
FileOperater.java //主要將html文件保存至本地,這里沒有用到,但是這樣做對於一個真正高校的搜索引擎其實
com.crawler.luence //luence操作
InfoIndex.java //索引文件操作類,建立、更新、查詢索引都在這里邊,其實包含了索引器和查詢器,這里代碼寫的有點爛。
com.crawler.tool //一些工具類
ComputeMD5.java //生成MD5值,最為數據主鍵
DataOp.java //日期格式處理
PropertiesOp.java //讀取配置文件屬性,爬蟲的一些信息通過.properties文件配置,包括爬去列表頁起始地址、列表鏈接正則、爬去分類等 ,這樣做主要是希望增強可拓展性,之后通過添加XXXContraller類和配置文件就能實現對新網站的爬去(這樣其實還是 有缺陷)
//最后,應該是controller,而不是contraller,好吧,沒文化真可怕。
2、如何配置程序
2.1 導入項目
可以svn簽入或者下載源文件導入,我用的myeclipse9.0,但是開發用的myeclipse8.5,所以8.5以上版本應該都行。
2.2 初始化數據庫
腳本文件在sql文件加下,里邊已經有一些數據,但是建議把數據清空(因為對應沒索引文件沒拷,這些數據也查詢不出來)。
2.3 抓取數據
運行程序,將程序部署至tomcat,打開:http://localhost:8080/JobSearch/index.jsp
點擊右上角的“抓取設置”,按照下圖執行點擊1、2,暫時不要執行3。
這是可以在控制台看到輸出抓取日志信息:
2.4 對抓取信息建立索引
在抓取了一段時間后(可以看看數據庫,差不多positioninfo表有個千吧條信息時,反正是測試下,用不着抓太多),點擊上邊的3開始建立索引。這里需要提到是由於代碼對異常處理的有問題,長時間運行后會出現異常信息,一般情況下忽略即可(比如一些鏈接請求失敗很正常),但是有時候你會發現列表頁解析速度很快,內容頁個很長時間才完成一個,這個一般重啟即可,不必擔心重復抓取,抓取狀態數據庫保存的有。
建立索引將是個很長的時間,而且建議在抓取停止后在去建立索引(怎么停止?這個....沒寫,直到列表信息抓取完就停止了,或者你重啟下tomcat也行,反正是個練手項目,也不追求十全十美......),否則很可能你等很長時間也不見結束。
2.5 萬事具備,搜索吧
打開主頁,填寫關鍵詞(最好和抓取分類相關)和條件,點擊搜索,會驚喜的發現頁面顯示了搜索結果。但是同時你也可能會小小的失望:有時候搜索結果准確度並不是那么高。這個主要和分詞器以及luence的使用有關,因為我只是簡單的使用了下,並未做相關排名,而且分詞器分詞不一定准確(這個牽扯很多原因,也是搜索引擎需要解決的核心問題之一,以后我會說下我所了解的解決思路)。
最后來幾張效果圖,然后睡覺去。