爬蟲項目設計文檔


一、引言

  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算法

  高效率運行的軟件有利於提高用戶的體驗指數。

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM