zoukankan      html  css  js  c++  java
  • 爬虫项目设计文档

    一、引言

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

      高效率运行的软件有利于提高用户的体验指数。

       

  • 相关阅读:
    桥接模式(Bridge)
    Python中文件操作
    Python中字符的编码与解码
    反转部分单向链表
    删除链表的中间节点和a/b处的节点
    链表中删除倒数第K个节点
    如何实现链表的逆序
    Python高阶函数及函数柯里化
    Python函数作用域
    Python函数参数与参数解构
  • 原文地址:https://www.cnblogs.com/cnmxfd/p/4931716.html
Copyright © 2011-2022 走看看