软件设计说明书模版(申请软件著作权可供参考)

2023-11-20

1.引言

1.1 编写目的

1.2 项目背景

1.2 项目概要

  1. 总体要求

2.1 系统功能概述

2.2 系统功能要求

  1. 软件开发

3.1 软件需求分析

3.2 软件的概要设计

3.2.1 软件概要设计说明

3.2.3 基本设计概念和处理流程

3.3 软件的详细设计

3.3.1 系统结构

3.3.2 模块设计说明

3.3.3 爬虫模块

3.3.4 日志模块

3.3.5 数据处理

3.3.6 数据建模

3.3.7 事件画像

3.3.8 可视化展示

3.4 数据库设计

3.4.1 数据库说明

3.4.2 数据库操作

3.4.3 数据库结构

3.4.4 表结构

1.引言

1.1 编写目的

项目名称:基于互联网大数据的事件智能抓取和画像系统
项目成员:禹精华、刘可可、刘贤辉

对基于互联网大数据的事件智能抓取和画像系统进行算法描述和软件设计说明。

1.2 项目背景

项目背景:随着互联网大数据的发展,各种大数据的分析对各行业都产生了不同程度的影响。网站数据、社交媒体数据等是互联网大数据的重要组成部分。对于民航业领域,社会事件的发生,会很大程度影响旅客的出行需求变化,从而影响航空公司飞机运力投放、航班编排、票价策略调整等,对互联网事件的准确抓取和分析能够帮助航空公司更好的服务市场、服务旅客、提升收益。

行业背景:对于航空公司来说,能否预先判断旅客的出行需求,可用于航空公司及行业管理部门决定行业运力投放的合理性,从而提高旅客服务水平、提高航空公司航班收益水平,从互联网中获取大量的影响民航领域的信息能够帮助航空公司制定销售策略。

1.3 项目概要

开发团队:武汉职业技术学院筑梦云工作室demo01团队

项目开发平台说明:

操作系统:Windows7 及以上版本

应用服务器:Ubuntu Server 14.04 LTS 64位

服务器配置:CUP: 1核 内存:1GB 公网带宽:1Mbps 硬盘:20G

应用服务器:Windows Servers 2008

服务器配置:CUP: 1核 内存:2GB 公网带宽:1Mbps 硬盘:40G

网络架构:完全支持TCP/IP协议

开发工具或技术体系:开发语言:Python 3.6,开发工具:Pycharm 2017

数据库: MongoDB 3.4.3

软件运行环境说明:

设备:

客户程序硬件要求:

具有 1核处理器且满足以下要求的计算机:

最低 1G内存

最小 20 GB 硬盘

web服务器硬件需求:

具有1核处理器且满足以下要求的计算机:

最低 1G内存

最小 20 GB 硬盘

总线I/O:8M/s;

数据库服务器硬件需求:

具有1核处理器且满足以下要求的计算机:

最低 1G内存

最小 20 GB 硬盘

2.总体要求

2.1 系统功能概述

从互联网上抓取事件,对事件数据进行数据处理,存储到数据库,进行分词及语义等处理,提取事件的属性建立事件模型,以及可视化展现。

1、实现互联网事件天级或更高频次抓取,采集政治会议、展会、体育赛事、演唱会、突发异常天气等各类中比较主要的事件,每个类型的事件数据至少来自2个数据源(网站),每天爬取一次。

2、实现事件的去重功能,一是不同数据源(网站)的事件去重,二是不同天抓取的事件去重。

3、事件画像建模,即事件属性自动化提取。

4、使用DataV进行可视化展现。

2.2 系统功能要求

1、网络爬虫模块实现互联网事件抓取。

2、日志模块实现各个模块间日志的生成。

3、数据处理模块实现数据的准备、清洗、去重、转换。

4、数据建模模块对数据建立模型,计算及转换。

5、事件画像模块对事件分词及提取属性。

6、DataV进行可视化展示。

3.软件开发

3.1 软件需求分析

系统需求分析:为航空公司飞机的运力投放、航班编制、票价策略提供服务。

软件系统结构描述:基于互联网大数据的事件智能抓取和画像系统由爬虫模块、日志模块、数据处理模块、数据建模模块、事件画像模块、可视化系统构成。

软件结构如图3-1:

图3-1 系统总用例图

数据流程如图 3-2:

 

图 3-2 数据流程

3.2 软件的概要设计

3.2.1 软件概要设计说明

软件系统采用B/S架构,并且将程序部署在云服务器。

3.2.2 基本设计概念和处理流程

考虑到互联网上的数据复杂性非常高、并且事件数据一般为非结构化数据,其处理和分析有一定的难度,对爬虫的稳定性和爬取速度有很大的要求,我们使用scrapy爬虫框架技术来从各网站爬取数据,对数据进行处理,使用NoSQL型数据库MongoDB存储半结构化数据,对数据画像、分析、建模并且将程序部署在云端。通过访问云端数据库,数据流映射到DataV实现可视化展示。

系统流程如图 3-2-2:

图 3-2-2 系统流程图

设计说明:

1、每一个计算机需要不需要安装客户程序,但是需要有IE4.0或更高版本的支持;

2、WEB发布服务器访问数据库服务器,数据库服务器对外部不可见;

3、数据库服务器使用MongoDB来实现,对于目前的访问量,MongoDB在足够的硬件环境的支持下能够适用,并且在经济上也是合理的;

4、多用户并发访问和处理、数据加锁、事务协调,由MongoDB数据库来完成,本系统不提供单独的事务处理服务器;

5、scrapy爬虫框架可以实现快速、高并发、高层次的网络抓取。

3.3 软件的详细设计

3.3.1 系统结构

应用程序采用Python语言进行开发,网络爬虫使用scrapy框架进行开发并将其部署在云服务器上,考虑到爬虫抓取的数据多为半结构化或者非结构化数据,我们使用NoSQL型数据库MongoDB进行数据存储,并部署在云服务器上。

系统设计如图 3-3-1:

图 3-3-1 系统设计图

3.3.2 模块设计说明

整个系统共划分为6个模块

1、爬虫模块

2、日志模块

3、数据处理

4、数据建模

5、事件画像

6、可视化展示

系统模块设计如下:

1、爬虫模块分为定时爬虫模块和scrapy爬虫两个模块构成。

定时爬虫模块:管理整个爬虫模块,监控爬虫运行状态、设置爬虫抓取频率(每天爬取一次)、爬虫程序异常处理、管理爬虫日志。

Scrapy爬虫模块:从目标网站上抓取数据,采集政治会议、展会、体育赛事、演唱会、突发异常天气、交通管制新闻网等数据源网站的事件经过数据处理,并生成爬虫日志存储到数据库。此模块由11个爬虫脚本组成,分别对相应的数据源进行数据爬取。

爬虫模块如图3-3-2:

图3-3-2 爬虫模块图

2、日志模块:日志模块与系统各个模块部分联系紧密,各个模块运行都会产生日志,生成的日志将存储到数据库,方便系统管理、维护、排错。

日志设计图如图 3-3-3:

图3-3-3 日志模块设计图

3、数据处理:数据处理分为数据准备、数据转换、数据聚合。主要对非结构化/半结构化数据进行处理,得到干净、规整的数据。爬虫爬取网站数据源的时候进行数据预处理,对所收集数据进行审核、筛选、排序等操作。数据预处理完成后对数据进行清洗,过滤掉不符合要求的数据,将脏数据转化为满足要求的数据。再进行缺失值处理,对缺失项进行特殊值填充,存储到数据库。数据去重主要对不同网站的事件数据去重复处理。

4、数据建模:对事件数据建立一个统一的模型,利用聚类等机器学习算法挖掘数据间隐藏的属性及关系。由聚类算法和搜索引擎收录数两个子模块构成。

聚类算法:使用无监督学习的K-Means对数据进行聚类分析。

搜索引擎收录数:对于热度相关数据的缺失,我们通过抓取百度搜索引擎对事件的收录数,对缺失热度数据进行填充。

5、事件画像:事件画像模块实现了对事件属性的自动化提取。调用数据建模模块对数据进行聚类,对不同类型的事件进行分词及属性提取,数据样本初始化,日志生成,对事件画像,生成事件样本。

事件属性表如下:

主办方级别 是否是国际性组织
  是否是国家政府
  是否是省政府
  是否是地方级政府
主办方类型 是否是国内民间协会
  是否是国际民间协会
  是否是国内行业协会
  是否是国际行业协会
主要影响年龄阶段 主要影响年龄层为儿童
  主要影响年龄层为青年
  主要影响年龄层为成年
  主要影响年龄层为老年
是否有固定的参与人群 是否有固定的参与人群
影响社会群体 是否影响商务人群
  是否影响社会大众
最大影响范围 最大影响全球
  最大影响洲际
  最大影响全国
  最大影响全省
  最大影响全市
事件类型 是否是展会
  是否是演唱会
  是否是体育赛事
  是否是会议
  是否是地方性节假日
事件热度 事件热度
事件历史悠久程度 事件历史悠久程度
事件一年内频率 事件一年内频率
基本属性 开始日期
  结束日期
  举办城市
  事件名称

6、可视化展示我们使用阿里云的可视化工具DataV来生成图表和数字大屏。


3.3.3 爬虫模块

定时爬虫模块设计如图3.3.3:

图3.3.3 定时爬虫模块

程序定时及爬虫管理脚本 TimerAdmins.py

import multiprocessing
import time
import pymongo
from SpiderAdmin import CrawlAdmin
from Log import LogUtils

class ProcessingTest(multiprocessing.Process):

    host = ''       #目标IP
    port = 0        #端口号

    def __init__(self,sleep):
        multiprocessing.Process.__init__(self)
        self.sleep=sleep
        self.ConfigDB='Config'
        self.ConfigTdb='timer'

    #程度运行
    def run(self):
        log = LogUtils()
        client = pymongo.MongoClient(host=self.host, port=self.port)
        db = client[self.ConfigDB]
        table = db[self.ConfigTdb]
        while True:
            ''' 得到当前时间戳'''
            times=time.time()
            '''得到当前时间戳去小数'''
            tim=int(str(times).split('.')[0])
            '''得到当前日期'''
            date=tim//86400
            '''从数据库查询日期'''
            info=table.find_one({"config": "timer"})
            print('data----------------------->'+str(date ))
            dateInfo=-1
            '''如果数据库没有记录则保存一下'''
            if info==None:
                print('没有数据')
                log.I('TimerAdmins','第一次运行数据库里没有数据')
                table.insert({"config": "timer","time":date})
                p = CrawlAdmin(1)
                p.start()
                print("已经启动爬虫模块")
                log.I('TimerAdmins', '已经启动爬虫模块')
                time.sleep(self.sleep)

            else:
                '''
                如果数据库有记录则对比上面获取的当前日期
                '''
                print(info)
                dateInfo=int(info['time'])
                ''' 如何当前日期大于数据库日期 '''
                print("------------------------"+str(dateInfo))
                if date>dateInfo:
                    timers=tim%86400
                    print('timers'+str(timers))
                    if date-dateInfo==1:
                        if timers>21600:
                            info['time']=date
                            table.save(info)
                            p=CrawlAdmin(1)
                            p.start()
                            print("已经启动爬虫模块---")
                            log.I('TimerAdmins', '已经启动爬虫模块')
                    else:
                        info['time'] = date-1
                        table.save(info)
                        p = CrawlAdmin(1)
                        p.start()
                        print("已经启动爬虫模块---")
                        log.I('TimerAdmins', '已经启动爬虫模块')
                    time.sleep(self.sleep)
                else:
                    print('数据已是最新,不用更新')
                    log.I('TimerAdmins', '数据已是最新,不用启动爬虫模块更新')
                    time.sleep(self.sleep)

if __name__ =="__main__":
    print('时间管理员开始运行')
    p=ProcessingTest(900)
    p.start()
    print(p.pid)

scrapy爬虫模块设计如图 3.3.4:

 

图3.3.4 Scrapy爬虫模块类和接口设计

3.3.4 日志模块

日志模块设计如图 3.3.4:

图3.3.4 日志接口类图

算法及源码设计如下:

import pymongo
import time
import traceback
class  LogUtils():
  
    host = ''      #目标主机IP
    port = 0      #端口号

    def __init__(self):
        self.LogDB='Log'
        self.Table=''
        self.client=pymongo.MongoClient(host=self.Host,port=self.port)
        self.db=self.client[self.LogDB]

    '''
    普通日志信息
    table  :  日志的表名 统一写类名
    LogInfo:  日志的内容
    '''
    def InfoLog(self,Table,LogInfo):
        try:
            self.Table=Table
            table=self.db[self.Table]
            times=str(time.time()).split('.')[0]
            timeArray=time.localtime(int(times))
            OtherStyleTime=time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
            table.insert({'logInfo':LogInfo,'Grade':'Info','time':OtherStyleTime})

        except:
            traceback.print_exc()

    '''
    普通日志信息 的重载方法  简便写法
    table  :  日志的表名 统一写类名
    LogInfo:  日志的内容
    '''

    def I(self,Table,LogInfo):
        try:
            self.Table=Table
            table=self.db[self.Table]
            times=str(time.time()).split('.')[0]
            timeArray=time.localtime(int(times))
            OtherStyleTime=time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
            table.insert({'logInfo':LogInfo,'Grade':'Info','time':OtherStyleTime})

        except:
            traceback.print_exc()

    '''
    错误日志信息 
    table  :  日志的表名 统一写类名
    LogInfo:  日志的内容
    '''
    def ErrorLog(self,Table,LogInfo):
        try:
            self.Table=Table
            table=self.db[self.Table]
            times=str(time.time()).split('.')[0]
            timeArray=time.localtime(int(times))
            OtherStyleTime=time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
            table.insert({'logInfo':LogInfo,'Grade':'Error','time':OtherStyleTime})

        except:
            traceback.print_exc()
    '''
    错误日志信息 的重载方法  简便写法
    table  :  日志的表名 统一写类名
    LogInfo:  日志的内容
    '''
    def E(self,Table,LogInfo):
        try:
            self.Table=Table
            table=self.db[self.Table]
            times=str(time.time()).split('.')[0]
            timeArray=time.localtime(int(times))
            OtherStyleTime=time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
            table.insert({'logInfo':LogInfo,'Grade':'Error','time':OtherStyleTime})

        except:
            traceback.print_exc()

    '''
    调试日志信息 
    table  :  日志的表名 统一写类名
    LogInfo:  日志的内容
    '''
    def DeBugLog(self,Table,LogInfo):
        try:
            self.Table=Table
            table=self.db[self.Table]
            times=str(time.time()).split('.')[0]
            timeArray=time.localtime(int(times))
            OtherStyleTime=time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
            table.insert({'logInfo':LogInfo,'Grade':'DeBug','time':OtherStyleTime})

        except:
            traceback.print_exc()
    '''
    调试日志信息 的重载方法  简便写法
    table  :  日志的表名 统一写类名
    LogInfo:  日志的内容
    '''
    def D(self,Table,LogInfo):
        try:
            self.Table=Table
            table=self.db[self.Table]
            times=str(time.time()).split('.')[0]
            timeArray=time.localtime(int(times))
            OtherStyleTime=time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
            table.insert({'logInfo':LogInfo,'Grade':'DeBug','time':OtherStyleTime})
        except:
            traceback.print_exc()


3.3.5 数据处理

数据处理脚本文件 ToHeavy.py

数据去重设计如图 3.3.5:

图3.3.5 数据去重接口和类图

数据去重算法说明:根据表名查询数据库对应的表,获取该条事件过去三天所有数据,对事件名分词,如果事件名与过去三天的事件记录相似度超过65%,标记为重复数据,flag赋值为0。

import jieba
from datetime import *
from pymongo import MongoClient
import time
from OperatingDB import OperatingDB


def connDB(ip, port, tableName, base):
    db = OperatingDB(ip, port)
    table = db.createTable(tableName, base)
    return table
    

#得到过去三天的日期(以字符串形式添加到列表)
def past_three_days(time, daynum, pastday_lit):
    date_time = datetime.strptime(time, '%Y-%m-%d')
    for i in range(daynum):
        pastday = date_time - timedelta(i)
        strpastday = datetime.strftime(pastday, '%Y-%m-%d')
        pastday_lit.append(strpastday)

#查询过去三天的数据
def pastThreeDayData(table, pastday_lit):
    past_one_day = {}
    past_two_day= {}
    past_three_day = {}
    key = '开始日期'

    past_one_day[key] = pastday_lit[0]
    past_two_day[key] = pastday_lit[1]
    past_three_day[key] = pastday_lit[2]

    data = table.find({'$or':[past_one_day, past_two_day, past_three_day]})
    title_lit = []
    for i in data:
        title_lit.append(i['事件名称'])
 
    return title_lit
    

#返回 flag,如果 flag = 0,则表示是重复数据   
def toheavy(table, title, titles):
    
    #对标题分词处理
    title_Participle = jieba.lcut(title)
    
    for title in titles:
        count = 0
        title_tmp = jieba.lcut(title)
        for i in title_Participle:
            if i in title_tmp:
                count += 1
        frequency = count/len(title_Participle)*100
        if(frequency > 65):
            print('相似度超过65%, 去重')
            flag = 0

    if flag == 1:
        print('数据无重复')
    return flag

3.3.6 数据建模

3.3.6.1 聚类算法

数据建模说明:我们采用机器学习算法的无监督学习算法,对原始数据建立分类模型, 使用聚类分析算法来对数据进行建模。

数据说明:在我们抓取到的数据中有关于热度的字段,例如下图的中国会展门户网站的一条数据,有关注指数的数据字段,可是单凭原始数据却无法判断所属热度的级别,无法直接划分热度级别。

中国会展门户数据如图3.3.6.1:

图3.3.6.1 中国会展门户数据图

K-Means 聚类算法说明:在具体的聚类算法中我们采用K-Means聚类算法,对数据建模,将事件热度分为三类,既聚类热度级别为 1、2、3。K-Means算法是基于距离的非层次聚类算法,在最小化误差函数的基础上将数据划分为预定的类数K,采用距离作为相似性的评价指标,既认为两个对象的距离越近,相似度就越大。度量样本之间的相似性使用的是欧氏距离,公式如图 3.3.6.2:

图3.3.6.2 欧氏距离公式图

具体算法描述如图 3.3.6.3:

图3.3.6.3 算法描述

聚类算法流程如图 3.3.6.4:

图 3.3.6.4 聚类算法流程图

建模程序设计及算法说明: KMeans.py 聚类算法文件。

聚类算法设计接口如图 3.3.6.5:

图3.3.6.5 聚类算法设计接口和类图

K-Means聚类算法设计源码如下:

#-*- coding: utf-8 -*-
import pandas as pd
from sklearn.cluster import KMeans
import xlrd
import openpyxl
import matplotlib.pyplot as plt

class Kmeans:
    '''数据聚类'''

    k = 3                   #聚类的类别数(内置)
    iteration = 500         #聚类最大循环次数(内置)
    jobs = 4                #设置并发数(内置)

    def readData(self, inputfile):
        '''从磁盘读取数据'''
        self.inputfile = inputfile
        #读取数据
        data = pd.read_excel(self.inputfile)
        # 去掉无用字段
        data.drop(['事件名称','开始时间'], 1, inplace=True)
        return data

    def writeData(self, outputfile, data):
        '''写入文件'''
        self.outputfile = outputfile
        data.to_excel(self.outputfile)


    def KMeansCompute(self, data):
        '''K-Means聚类计算'''
          
        #数据标准化
        data_zs = 1.0 * (data - data.mean())/data.std()

        #分析为K类, 并发数4
        model = KMeans(n_clusters = self.k, n_jobs = self.jobs, max_iter = self.iteration)
        model.fit(data_zs)  #开始聚类

        r1 = pd.Series(model.labels_).value_counts()
        r2 = pd.DataFrame(model.cluster_centers_)   #找出聚类中心
      
        r = pd.concat([r2, r1], axis = 1)   #横向连接
        r.columns = list(data.columns) + ['类别数目']
        
        #详细输出
        r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1)
        r.columns = list(data.columns) + ['聚类类别']   #重命名表头
        
        return r

聚类完成后,根据事件的主办方级别、主办方类型及影响范围属性对聚类热度进行加权,得到热度属性。

3.3.6.2 搜索引擎收录数

在抓取其他数据源的时候会遇到热度相关字段的缺失,搜索引擎收录数一定程度上映射了事件的热度属性,既越热门的事件收录数越多,我们对百度搜索引擎事件收录数进行量化,根据事件的主办方级别、主办方类型及影响范围属性对聚类热度进行加权值来得出该事件的热度值。

获取搜索引擎收录数文件:GetSearchEngineResult.py

import re
import requests

class GetSearchEngineResult:
#获取百度搜索搜索引擎结果数
    def getHTMLText(self, url):
        try:
            r = requests.get(url, timeout = 10, headers = {'user-agent' : 'Mozilla/5.0'})
            r.raise_for_status()
            return r.text
        except:
            print("解析百度结果异常")

    def getBaiduResult(self, title):
        baseURL = 'http://www.baidu.com/'
        url = baseURL + 's?' + 'wd=' + title

        html = self.getHTMLText(url)
        regex = r'百度为您找到相关结果.*?个'
        numRegex = r'[0-9]'
        data = re.search(regex, html)
        heatStr = ''
        if data:
            num = re.findall(numRegex, data.group())
            for i in num:
                heatStr += i
        heat = self.getBaiduHeat(eval(heatStr))

        return heat
             



 


    

3.3.7 事件画像

3.3.7.1 事件画像系统设计

事件画像系统集成了事件画像管理脚本、数据样本初始化、事件样本输出、数据建模、事件画像等功能。事件画像系统调用数据建模模块,提取各类事件的属性,生成事件样本。
事件画像系统设计如图 3.3.7.1:

图 3.3.7.1事件画像系统设计图

3.3.7.2事件画像

事件画像模块的主要类是实体类、数据访问接口和功能类。

实体类保存了事件的基本属性数据,访问接口连接数据库,功能类 对事件提取属性。

事件画像设计及接口类如图 3.3.7.2:

图 3.3.7.2 事件画像模块接口和类图

3.3.8 可视化展示

我们使用阿里的DataV做可视化展示,通过DataV建立云端数据库的连接,实现数据流映射到DataV。从而生成数据大屏。

可视化展示预览图如图 3.3.8:

图 3.3.8 数据大屏

3.4数据库设计

3.4.1 数据库说明

考虑到程序的稳定性和团队协同工作等特性,我们将数据库部署在云服务器,实现了实时访问、高性能、高扩展性等特点。

数据库软件:MongoDB
建立的数据库名称: Spider、Config、DataV、Log
存储爬虫抓取的数据: Spider
系统配置数据库: Config
存储可视化展示数据的库: DataV
存储日志数据: Log

3.4.2 数据库操作

将对数据库的操作封装为一个模块。各个模块都要进行数据的存储,将数据的存储单独划分出来做成一个模块的好处是显而易见的,实现了系统模块间的弱耦合,方便数据的写入、读取等操作。

** ** ConnectMongoDB.py 功能:连接mongodb数据库

连接数据库接口源码:

from pymongo import MongoClient

class ConnectMongo:
    '''连接数据库'''

    client = None
    
    # ipaddr:IP地址, port:端口号
    def connect(self, ipaddr, port):    #建立连接
        self.client = MongoClient(ipaddr, port)

    def close(self):                      #关闭连接
        return self.client.disconnect()
    
    def getConn(self):                  #返回连接
        return self.client

        


OperatingDB.py 功能:封装了对数据库的操作,创建表\集合、插入数据、删除数据、查询数据、关闭数据库连接。

from ConnectMongoDB import ConnectMongo

class OperatingDB:
    
    '''操作Mongodb数据库'''
  
    def __init__(self, ipaddr, port):
        conn = ConnectMongo()
        conn.connect(ipaddr, port)
        self.client = conn.getConn()

    #tableName:表名, base:数据库名
    def createTable(self, tableName, base):
        '''创建数据库和表'''
        self.crawl = self.client[base]
        self.table = self.crawl[tableName]
        return self.table

    #data:插入的数据
    def insertDatas(self, data):
        self.table.insert(data)
              
    def deleteData(self, data):
        '''删除数据'''
        self.table.remove(data)
    
    #q:查询条件,projecttion:查询字段。
    def query_one(self, q = {}, projection = {'_id' : 0}):
        '''查询一条数据'''
        return self.table.find_one(q, projection)
        
    def query(self, q = {}, projection = {'_id' : 0}):
        '''查询数据'''
        return self.table.find(q, projection)

    def closeConn(self):
        '''关闭连接'''
        self.client.close()
        

3.4.3数据库结构

由于NoSQL型数据库不同于传统的关系型数据库,在建立表结构、索引这些操作时没有像关系型的关联、约束等关系。结构设计也相对简单。

数据库设计如下表

数据库
Spider CityWeather
  DamaiConcert
  DamaiSports
  JuchengConcert
  WaringWeahter
  XishiquSports
  YongleConcert
  YongleSports
  cnena
  eshow
  people
  trafficcontrol
  xinhuanet
  XishiquConcert
Config timer
Log CityWeather
  ConcertAttr
  CrawlAdmin
  DaMaiPW
  DaMaiWang
  EventPortraitAdmin
  ExhibitionAttr
  JuChenSpider
  SportAttr
  TimerAdmins
  WarningCrawl
  XishiquConcert..
  XishiquSports
  people
  xinhuanet
  yonglePW
DataV DataV

3.4.4 表结构

MongoDB 将数据存储为一个文档/表,数据结构由键值(key=>value)对组成。MongoDB 文档/表类似于 JSON 对象。数据库各个表字段设计如下。

数据库:Spider

表名:CityWeather

字段名 中文描述 数据类型
city 城市名 String
high 最高气温 String
fengxiang 风向 String
low 最低气温 String
fengli 风力 String
type 天气类型 String
date 日期 String
Wendu 温度 String
Status 状态 String

表名:DamaiConcert、JuchengConcert、YongleConcert

字段名 数据类型
事件名称 String
举办城市 String
举办场馆 String
开始日期 String
结束日期 String
门票价格 String
事件类型 String

表名:DamaiSports

字段名 数据类型
事件名称 String
举办城市 String
举办场馆 String
开始日期 String
结束日期 String
事件类型 String

表名:Longitudes

字段名 数据类型
城市 String
经度 String
维度 String

表名:WaringWeather

字段名 数据类型
事件名称 String
发布时间 String
预警城市 String
预警类型 String
预警详情 String

表名:XishiquConcert、XishiquSports

字段名 数据类型
事件类型 String
事件名称 String
开始日期 String
场馆 String
举办城市 String
结束日期 String
累计成交 String
关注人数 String
详细热度 String

表名:YongleSports

字段名 数据类型
事件名称 String
举办场馆 String
举办城市 String
开始日期 String
结束日期 String
类型 String
事件类型 String

表名:cnena

字段名 数据类型
事件类型 String
事件名称 String
关注指数 String
开始日期 String
结束日期 String
展会地点 String
组织机构 String
展会概况 String
概览范围 String
举办城市 String
聚类热度 String

表名:eshow

字段名 数据类型
事件类型 String
标签 String
事件名称 String
开始日期 String
结束日期 String
举办展馆 String
所属行业 String
举办城市 String
承办单位 String
展会面积 String
举办届数 String
举办周期 String
参观费用 String
展会概况 String
事件频率 String

表名:people

字段名 数据类型
事件类型 String
事件名称 String
关键词 String
来源 String
描述 String
开始日期 String
会议内容 String

表名:trafficcontrol

字段名 数据类型
事件类型 String
事件名称 String
内容 String
开始日期 String

表名:xinhuanet

字段名 数据类型
事件类型 String
事件名称 String
关键词 String
开始日期 String
会议内容 String

数据库:Config

表名:timer

字段名 中文描述 数据类型
_id ID号 ObjectId
config 配置信息 String
timer 时间 Date

数据库:Log

表名:CityWeather、ConcertAttr、CrawlAdmin、DaMaiPW、EventPortrait、EventPortraitAdmin、

ExhibitionAttr、JuChenSpider、SportAttr、TimerAdmin、WarngingCrawl、XishiquConcert、XishiquSports、people、xinhuanet、yonglePW。

字段名 中文描述 数据类型
_id ID号 ObjectId
logInfo 日志信息 String
Grade 报错信息 String
Time 时间 String

数据库:DataV

表名:DataV

字段名 数据类型
_id ObjectId
热度 int
行业性质 String
影响人群 String
最大影响范围 String
事件类型 String
影响商务和群众占比 String
组织性质 String

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

软件设计说明书模版(申请软件著作权可供参考) 的相关文章

  • 互联网高可用架构探讨

    高可用指标与问题 高可用 英文单词High Availability 缩写HA 它是分布式系统架构设计中一个重要的度量 业界通常用多个9来衡量系统的可用性 如下表 既然有可用率 有一定会存在不可用的情况 系统宕机一般分为有计划的和无计划的
  • 函数式编程总结

    函数式编程的概念 函数式编程理念来自于数学中的函数 函数的概念 对于两个变量x和y 如果每给定x的一个值 都有一个y值与之对应 那么我们就说y是x的函数 如下即是一些函数 f x 5x 2 4x 3 g x 2f x 5 10x 2 8x
  • 操作复杂对象结构——访问者模式(四)

    26 4 访问者模式与组合模式联用 在访问者模式中 包含一个用于存储元素对象集合的对象结构 我们通常可以使用迭代器来遍历对象结构 同时具体元素之间可以存在整体与部分关系 有些元素作为容器对象 有些元素作为成员对象 可以使用组合模式来组织元素
  • 库存预占架构升级方案设计-交易库存中心

    背景介绍 伴随物流行业的迅猛发展 一体化供应链模式的落地 对系统吞吐 系统稳定发出巨大挑战 库存作为供应链的重中之重表现更为明显 近三年数据可以看出 接入商家同比增长37 64 货品种类同比增长53 66 货品数量同比增长46 43 仓库数
  • 从一年开发经验的视角看如何优雅编程

    编程绝非易事 需要大家在日常工作中仔细钻研 下面我们从实际业务开发的角度来分析一下如何优雅地进行编程 简单可以总结几点 1 整体理解业务 2 从开发角度分解业务 3 结合各业务点整体分析系统结构 4 针对每一个业务点进行边界分析 5 对每个
  • 软件架构模式+系统架构+架构作图

    架构模式对比 分层模式 一般信息系统中最常见的4层划分如下 Presentation layer 表示层 也就是UI层 Application layer 应用层 也就是服务层 Business logic layer 业务逻辑层 也就是领
  • 【韧性设计模式】韧性设计模式:重试、回退、超时、断路器

    什么是韧性 软件本身并不是目的 它支持您的业务流程并使客户满意 如果软件没有在生产中运行 它就无法产生价值 然而 生产性软件也必须是正确的 可靠的和可用的 当谈到软件设计中的弹性时 主要目标是构建健壮的组件 这些组件既可以容忍其范围内的故障
  • 深入理解设计原则之KISS/YAGNI/DRY原则【软件架构设计】

    系列文章目录 C 高性能优化编程系列 软件架构设计系列 深入理解设计模式系列 高级C 并发线程编程 如果敌人使你生气 说明你没有胜过他的信心 If the enemy makes you angry that means you have
  • 软件架构详解(附图)

    软件架构 software architecture 软件架构 software architecture 是一系列相关的抽象模式 用于指导大型软件系统各个方面的设计 软件架构是一个系统的草图 软件架构描述的对象是直接构成系统的抽象组件 各
  • Git 代码分支管理

    作者 京东科技 周新智 一 引言 近日 IoT 研发团队加入了不少新同学 对 git 分支的命名和管理方式有些许的模糊 分支的命名规范以及管理方式对项目的版本发布至关重要 为了解决实际开发过程中版本发布时代码管理混乱 冲突等比较头疼的问题
  • 软件架构(CS结构/BS结构)

    1 C S结构 即 Client Server C S工作流程图 在C S结构的情况下 不同的服务需要安装不同的客户端软件 比如QQ 迅雷 Foxmail这种情况下安装的软件会越来越多 同时也有许多弊端 比如A出差 需要在B电脑上查收邮件
  • 架构师日记-深入理解软件设计模式

    作者 京东零售 刘慧卿 一 设计模式与编程语言 1 1 什么是设计模式 设计模式 Design pattern 由软件开发人员在软件开发中面临常见问题的解决方案 是经过长时间的试验积累总结出来的 它使设计更加灵活和优雅 复用性更好 从实用的
  • 软件架构及几种典型框架

    什么是软件架构 什么是软件框架 很多时候 我们常常会混用架构和框架这两个词 实际上 广义上的架构和框架在概念上有很大的不同 架构给人的感觉 包容上更大 所以实际上架构是包含了框架的概念的 广义的架构应为一个系统的架构 不仅仅涉及软件中的技巧
  • 从分层架构到微服务架构(五)之服务化架构

    从分层架构到微服务架构 是一系列介绍 Fundamentals of Software Architecture 中提到的8种架构模式的文章 这里不会事无巨细地介绍所有的细节 而是会挑选其中关键内容 更多详情请阅读原书 往期精彩 从分层架构
  • 深入浅出UML类图(五)

    实例分析3 售票机控制程序 某运输公司决定为新的售票机开发车票销售的控制软件 图I给出了售票机的面板示意图以及相关的控制部件 图I 售票机面板示意图 售票机相关部件的作用如下所述 1 目的地键盘用来输入行程目的地的代码 例如 200表示总站
  • 物联网云平台系统设计

    物联网云平台系统设计 下面将谈到几个关键问题 设备如何接入网络 设备间如何通信 物联网数据的用途 如何搭建起一个物联网系统框架呢 它的技术架构又是怎么样呢 物联网终端软件系统架构 物联网云平台系统架构 1 物联网设备如何接入到网络 只有设备
  • Spring属性注入方式

    1 Spring也表示一个开源框架 是为了解决企业程序应用开发的复杂性 框架的主要优势之一就是其分层架构 分层架构允许使用者选择使用哪一个组件 同时为J2EE应用程序开发提供集成的框架 Spring使用基本的bean来完成以前只能由EJB完
  • IEEE 1471(ISO/IEC/IEEE 42010)架构描述方法

    ISO IEC IEEE 42010 架构描述方法 关于 背景 架构描述 利益相关者和关注点 架构视图和架构观点 架构模型 架构关系 架构原理 关于 本文对软件体系架构的描述方法的研究基于 ISO IEC IEEE 42010 ISO IE
  • 【c++】类模版

    1 类模板语法 类模板作用 建立一个通用类 类中的成员 数据类型可以不具体制定 用一个虚拟的类型来代表 语法 template
  • 【实践篇】领域驱动设计:DDD工程参考架构

    背景 为什么要制定参考工程架构 不同团队落地DDD所采取的应用架构风格可能不同 并没有统一的 标准的DDD工程架构 有些团队可能遵循经典的DDD四层架构 或改进的DDD四层架构 有些团队可能综合考虑分层架构 整洁架构 六边形架构等多种架构风

随机推荐

  • 12.HTML5下一代的HTML标准介绍与初识尝试

    关注回复 学习交流群 加入 安全开发运维 答疑交流群 请朋友们 多多点击文中的广告 支持作者更新更多文章 目录 本文为作者原创文章 为尊重作者劳动成果禁止非授权转载 若需转载请在 全栈工程师修炼指南 公众号留言 或者发送邮件到 master
  • 运维之Linux发行版和容器镜像网站及开源软件收集

    关注 WeiyiGeek 公众号 将我设为 特别关注 每天带你玩转网络安全运维 应用开发 物联网IOT学习 0x00 概述 0x01 镜像源网站 国内镜像 国内高校 0x02 发行版官网 CentOS kail Debian Ubuntu
  • 客户机操作系统已禁用 CPU。请关闭或重置虚拟机。解决方法

    今天在用VMware安装CentOS7报了这个错误 在网上找半天都没解决 最后换一个地址下的镜像就能正常安装了 Index of centos 7 9 2009 isos x86 64
  • 12_Linux ARM架构_安装JDK8-银河麒麟V10(Kylin Linux Advanced Server V10 )操作系统

    12 Linux ARM架构 安装JDK8 银河麒麟V10 Kylin Linux Advanced Server V10 操作系统 1 官网下载aarch64架构jdk包 2 linux服务器中创建java文件夹 方便后期快速寻找 3 将
  • DevC++如何改成中文?

    DevC 如何改成中文 1 点击Tools工具 2 选择环境选项 3 选择简体中文 4 点击确定
  • 深入理解Google Cast(一)基本概念

    什么是google cast google cast允许用户将手机上的内容投影到TV上 然后用户可以将手机作为遥控器来控制TV上的媒体播放 Google cast SDK用于扩展你的app 使其支持google cast功能 一个Cast
  • 图像验证码识别(九)——训练和识别

    前面讲到已经把所有的字符经过去干扰 分割和归一化得到标准大小的单个字符 接下来要做的就是识别验证码了 现在要做的基本上也就和OCR没什么区别了 因为得到的字符已经是尽可能标准的了 下面的识别分为两个步骤 第一步先是特征值的提取 第二步是SV
  • ROC曲线绘制原理及如何用SPSS绘制ROC曲线

    本文同步发布于 脑之说 微信公众号 欢迎搜索关注 ROC曲线 Receiver operating characteristic curve 即受试者工作特征曲线 主要用来评价某个指标对两类被试 如病人和健康人 分类 诊断的效果 以及寻找最
  • 深入探索并发编程系列(五)-将内存乱序逮个正着

    当用C C 编写无锁代码时 一定要小心谨慎 以保证正确的内存顺序 不然的话 会发生一些诡异的事情 Intel在x86 x64体系结构手册的Volume 3 8 2 3 中列出了一些可能会发生的诡异的事情 这里介绍其中一个最简单的例子 假设在
  • autoware警告The ‘state_publisher‘ executable is deprecated. Please use ‘robot_state_publisher‘ instead

    在运行autoware官方demo autoware ai 的时候 启动my localization launch roslaunch autoware quickstart examples my localization launch
  • C++示例程序,演示如何将两个整数相加并打印结果

    include
  • iOS开发-国际化-配置App多语言

    作者 大慈大悲大熊猫 链接 http www jianshu com p 1edd4bda6fe5 來源 简书 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 基本设置 第一步 先在Project的info里添加所需要支
  • 使用Python对数据的操作转换

    1 列表加值转字典 在Python中 将列表的值转换为字典的键可以使用以下代码 myList name age location myDict k None for k in myList print myDict 输出 name None
  • 百度2012实习生校园招聘笔试题

    1 给一个单词a 如果通过交换单词中字母的顺序可以得到另外的单词b 那么b是a的兄弟单词 比如的单词army和mary互为兄弟单词 现在要给出一种解决方案 对于用户输入的单词 根据给定的字典找出输入单词有哪些兄弟单词 请具体说明数据结构和查
  • vue组件之间传值的几种方式

    这里写目录标题 vue组件传值 父传子 子传父 非父子组件传值 provide 和 inject 传值 事件总线传值 attrs listeners 使用 attrs listeners 进行子往上级传 vueX vue组件传值 父传子 父
  • Qt的基本语法及其使用(一)

    Qt的概念 Qt是通用的C 开发界面框架 C 图形用户界面 应用程序开发框架 既可以开发GUI程序也可以开发开发非GUI程序 Qt是面向对象的框架 使用特殊的代码生成扩展 Qt的历史 1991由QT公司研发 2008年被诺基亚收购 2012
  • C/C++ 引用作为函数的返回值

    语法 类型 函数名 形参列表 函数体 特别注意 1 引用作为函数的返回值时 必须在定义函数时在函数名前将 2 用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本 代码来源 RUNOOB include
  • Microsoft Network Monitor 3.4简要说明

    第一次启动后是一个欢迎界面 左下角可以选择要监控的网络连接 在标签栏上点击右键 可以选择关闭这个页面 或者保留这个页面 关闭其他所有页面 点击工具栏第一个图标 NewCapture 就可以打开一个新的监控界面 点击工具栏上的 Start 按
  • RTSP,RTP,RTCP协议

    一 RTSP 1 简介 实时流传输协议 是一个应用层协议 TCP IP网络体系中 它是一个多媒体播放控制协议 主要用来使用户在播放流媒体时可以像操作本地的影碟机一样进行控制 即可以对流媒体进行暂停 继续 后退和前进等控制 RTSP体系结位于
  • 软件设计说明书模版(申请软件著作权可供参考)

    1 引言 1 1 编写目的 1 2 项目背景 1 2 项目概要 总体要求 2 1 系统功能概述 2 2 系统功能要求 软件开发 3 1 软件需求分析 3 2 软件的概要设计 3 2 1 软件概要设计说明 3 2 3 基本设计概念和处理流程