一、引言
1.1 目的
描述程序設計。
1.2 總體設計概述
提供網頁爬取、內容分類、內容下載、圖形分析等設計。
二、整體架構
2.1 應用技術
2.1.1 JAVA多線程
JAVA使用java.lang.Thread類或者java.lang.Runnable接口編寫代碼來定義、實例化和啟動新線程。Java中,每個線程都有一個調用棧,即使不在程序中創建任何新的線程,線程也在后台運行着。一個Java應用總是從main()方法開始運行,mian()方法運行在一個線程內,它被稱為主線程。一旦創建一個新的線程,就產生一個新的調用棧。線程的應用大大提高了JAVA程序的效率。
2.1.2 URL去重 -- 基於hash算法的存儲
對每一個給定的URL,都是用一個已經建立好的Hash函數,映射到某個物理地址上。當需要進行檢測URL是否重復的時候,只需要將這個URL進行Hash映射,如果得到的地址已經存在,說明已經被下載過,放棄下載,否則,將該URL及其Hash地址作為鍵值對存放到Hash表中。這樣,URL去重存儲庫就是要維護一個Hash表,如果Hash函數設計的不好,在進行映射的時候,發生碰撞的幾率很大,則再進行碰撞的處理也非常復雜。而且,這里使用的是URL作為鍵,URL字符串也占用了很大的存儲空間。
2.1.3 爬蟲策略 -- 廣度優先搜索
廣度優先策略是指在抓取過程中,在完成當前層次的搜索后,才進行下一層次的搜索。該算法的設計和實現相對簡單。在目前為覆蓋盡可能多的網頁,一般使用廣度優先搜索方法。也有很多研究將廣度優先搜索策略應用於聚焦爬蟲中。其基本思想是認為與初始URL在一定鏈接距離內的網頁具有主題相關性的概率很大。另外一種方法是將廣度優先搜索與網頁過濾技術結合使用,先用廣度優先搜索策略抓取網頁,再將其中無關的網頁過濾掉。這些方法的缺點在於,隨着抓取網頁的增多,大量的無關網頁將被下載並過濾,算法的效率將變低。
2.1.4 UI設計 -- Jframe
JFrame是java的GUI程序的基礎,它是屏幕上window的對象,能夠最大化、最小化、關閉。Swing 的三個基本構造塊:標簽、按鈕和文本字段;但是需要個地方安放它們,並希望用戶知道如何處理它們。JFrame 類就是解決這個問題的——它是一個容器,允許程序員把其他組件添加到它里面,把它們組織起來,並把它們呈現給用戶。 JFrame 實際上不僅僅讓程序員把組件放入其中並呈現給用戶。比起它表面上的簡單性,它實際上是 Swing 包中最復雜的組件。為了最大程度地簡化組件,在獨立於操作系統的 Swing 組件與實際運行這些組件的操作系統之間,JFrame 起着橋梁的作用。JFrame 在本機操作系統中是以窗口的形式注冊的,這么做之后,就可以得到許多熟悉的操作系統窗口的特性:最小化/最大化、改變大小、移動。
2.2整體框架視圖
2.2.1物理設計框架
2.2.2程序設計框架
2.3 工作過程設計
根據我們的兩個視圖,可以進一步設計出爬蟲的如下工作方式:
①將給定的初始URL加入到URL等待隊列。
②創建爬蟲線程,啟動爬蟲線程
③每個爬蟲線程從URL等待隊列中取得任務URL。然后根據URL下載網頁,然后解析網頁,獲取超鏈接URs。如果獲取到的URL為相對地址,需要轉換為絕對地址,然后淘汰外URLs,錯誤URLs或者不能解析的URL地址。再判斷這些URL是否已經被下載到,如果沒有則加入到URL等待隊列。
④繼續執行步驟③,直到結束條件停止。
如下是我們的工作流程圖:
2.4 代碼框架規范
crawler項目整體上分為url操作、服務器連接和數據庫操作、內容下載、圖形展示、UI設計五個部分。
(1)URL操作
URL存取:
public class LinkQueue:
//已訪問的 url 集合
private static Set<RankUrl> visitedUrl = new HashSet<RankUrl>();
//已訪問的 url 集合(.html)
private static Set<RankUrl> visitedHUrl = new HashSet<RankUrl>();
//待訪問的 url 集合
private static ConcurrentLinkedQueue<RankUrl> unVisitedUrl = new ConcurrentLinkedQueue<RankUrl>();
//seed url集合
private static Queue<RankUrl> seedUrls = new LinkedList<RankUrl>();
//tag 集合
private static Hashtable<String, String> tagtext= new Hashtable<String, String>();
//Url得分表
private static Hashtable<RankUrl, Double> urlsScoreTable = new Hashtable<RankUrl, Double>();
//前十鏈接
private static ArrayList<String> topUrlsSort = new ArrayList<String>();
//獲得tag表
public static Hashtable<String, String> getTagtext();
//添加到訪問過的URL隊列中
public static void addVisitedUrl(RankUrl url);
//添加種子鏈接
public static void addSeedUrl(RankUrl url);
//未訪問的URL出隊列
public static Object unVisitedUrlDeQueue();
//保證每個 url 只被訪問一次
public static void addUnvisitedUrl(RankUrl url, RankUrl inUrl);
//獲得已經訪問的URL數目
public static int getVisitedUrlNum();
//判斷未訪問的URL隊列中是否為空
public static boolean unVisitedUrlsEmpty();
//使用PageRank算法計算Url的重要性排序
public static void getUrlsScores();
//獲得排序top10以內的Url和分數
public static Hashtable<String, Double> getTopRankUrls();
URL評分:
public class RankUrl :
//獲取網址URL
public String getUrl();
//得到網址排名集合
public Set<RankUrl> getOutUrls();
//添加網址排名
public void addOutUrl(RankUrl url);
//得到網址排名集合的大小
public int getOutUrlsSize();
//返回網址數量
public int getOutUrlsSize();
//輸出已訪問url
public void print();
子鏈接操作:
public class HtmlParserTool:
//過濾並獲取網站子鏈接
public static Set<String> extracLinks(String url, LinkFilter filter);
//過濾並獲取網站子鏈接
public static Set<String> extracLinks_gb(String url, LinkFilter filter);
關鍵詞過濾:
public class Keyword:
//根據提供的URL,獲取此URL對應網頁的純文本信息
public static String getText(String url);
//給出指定URL是否符合過濾條件
public static boolean accept(String url);
主函數入口:
public class MyCrawler:
//使用種子初始化 URL隊列
private void initCrawlerWithSeeds(String[] seeds);
//開始抓取pdf過程
public void pdfCrawling(String[] seeds);
//開始抓取ppt過程
public void pptCrawling(String[] seeds);
//開始抓取doc過程
public void docCrawling(String[] seeds);
//開始抓取stackoverflow頁面過程
public void STCrawling(String[] STseeds);
//開始抓取q.cnblogs頁面過程
public void CNCrawling(String[] CNseeds);
//開始抓取dwen頁面過程
public void DWCrawling(String[] DWseeds);
//開始抓取zhidao.baidu頁面過程
public void BZCrawling();
(2)服務器連接和數據庫操作
public class ConnectServer:
//初始化數據庫連接
public static void dbConn();
//斷開數據庫連接
public static void dbClose();
//執行sql查詢
public static ResultSet dataset(String sql);
//得到全部網頁個數
public static String getSum_webpage();
//得到全部問答頁個數
public static String getSum_quiz();
//得到全部doc個數
public static String getSum_doc();
//得到全部ppt個數
public static String getSum_ppt();
//得到全部pdf個數
public static String getSum_pdf();
//互斥更新數據庫
public static synchronized int update(String sql) throws SQLException;
//獲取數據庫最大ID號
public static int idNumber();
(3)內容下載
public class DownloadFile:
//構造函數
public DownloadFile(RankUrl url,LinkFilter filter);
//開始下載
public void run();
//通過ID獲得文件名
public String getFileNameByID(int _id,String contentType);
//通過網址得到文件名
public String getFileNameByUrl(String url,String contentType)
//更新數據庫
public void DataBase(String IntoDataBase,String FilePath) throws SQLException;
//保存網頁字節數組到本地
private void saveToLocal(byte[] data, String filePath);
public class DownloadQuiz extends Thread:
//構造函數
public DownloadQuiz (RankUrl url,int kind);
//開始下載問答頁
public void run();
//更新數據庫
public void DataBase(String IntoDataBase,String FilePath) throws SQLException;
//通過ID獲得文件名
public String getFileNameByID(int _id,String contentType);
//通過網址得到文件名
public String getFileNameByUrl(String url,String contentType);
//保存網頁字節數組到本地
private void saveToLocal(byte[] data, String filePath);
(4)圖形展示
餅狀圖:
public class Analysis extends JFrame:
//構造函數,設計餅狀圖
Analysis();
public class PieChart:
//構造函數,設計餅狀圖
public PieChart();
//得到pdf,quiz,webpage的數據集
private static DefaultPieDataset getDataSet();
//獲取餅狀圖
public ChartPanel getChartPanel();
柱狀圖:
public class BarChart:
//構造函數,設計柱狀圖
BarChart();
(5)UI設計
主界面:
public class CraUi extends JFrame implements ActionListener, Runnable, ItemListener:
//構造函數,設計UI布局
public CraUi();
//根據給定的數據創建圖表
public JFreeChart createChart(CategoryDataset dataset);
//創建供圖表顯示的面板
public JPanel createPanel();
//刷新面板
public static void updatePanel(int visited,int succeed,int failed,int passed);
//配置事件監聽器動作
public void actionPerformed(ActionEvent e);
//在指定位置插入已訪問URL
public void UIinsertURLs(String newURL);
//UI開始運行
public void run();
//配置下拉框狀態改變響應觸發
public void itemStateChanged(ItemEvent e);
//得到關鍵字
public String getTxt();
//設置關鍵字
public void setTxt(String txt);
團隊LOGO:
public class Logo extends JWindow implements Runnable:
//構造函數,設置Logo參數
public Logo(String name);
//顯示Logo
public void run();
//使Logo消失
public void setNotVisible();
三、軟件支持
類型 | 軟件 |
服務器 | 由老師提供 |
數據庫 | sql server2008 |
開發平台 | Eclipce |
四、其他設計
4.1 異常處理
由於數據的保存涉及到了數據庫,所以異常處理主要涉及的是SQLException,在需要操作到數據庫的方法里,都拋出了SQLException,捕獲然后給相應提示信息。還有其他基本異常處理不一一羅列。
4.2 用戶性能設計
通過三個設計提高軟件的性能:
(1)hash存儲
(2)java多線程
(3)pagerank算法
高效率運行的軟件有利於提高用戶的體驗指數。