中北大学 - 信息对抗大三下学习课程设计(爬取招标网站,进行招标分析,数据保存execl中)

news2024/11/15 21:25:56

文章目录

  • 1. 题目描述
  • 2. 项目细节分析
    • 定时爬取任务思路
    • 避免多次爬取数据重复问题
    • 网站结构
    • 根据爬取信息确认招标地区
  • 3. 项目代码
  • 4. 运行截图

1. 题目描述

中北大学信息安全技术爬虫课程设计
题目 5:招投标信息分析系统 (20050441 2005031113)

要求:文档内容至少包含系统结构、功能模块图、功能流程图、数据流图。实现语言不限。自动访问http://www.ccgp.gov.cn/获取信息

子题目 1:网络爬虫获取招标信息 要求:获取数据数量大于 2 万条,自定义多媒体格式(包括图片、声音、pdf 文件)保存在数据库中。关键字用例可自定义。统计下载数据,过滤数据。能显示、查找数据信息。每 24 小时采集一次。

子题目 2:网络爬虫获取中标信息 要求:获取数据数量大于 2 万条,自定义多媒体格式(包括图片、声音、pdf 文件)保存在数据库中。关键字用例可自定义。统计下载数据,过滤数据。能显示、查找数据信息。每 24 小时采集一次。

子题目 3:针对某一地区发出的招标信息进行分析,对该地区可实现画像,自动分析出该地区的招标特点及经济发展水平

子题目 4:对获取到的 pdf 文件进行解码,数据保存入数据库中,在数据库中增删改查。可多条件查询。

这份源代码实现的是子题目 1 和子题目 3

2. 项目细节分析

此项目中的路径均是绝对路径,需要根据实际项目位置修改。 修改完路径后点击 autoSpider 即可运行

定时爬取任务思路

24小时爬取功能实现
使用Windows系统自带的任务计划程序来实现定时执行Python程序的功能。具体操作步骤如下:

打开“任务计划程序”,可以在Windows搜索栏中输入“任务计划程序”来打开。

在左侧面板中找到“任务计划程序库”,右键点击并选择“创建任务”。

在弹出的对话框中,输入任务名称并勾选“使用最高权限运行”。

切换到“触发器”选项卡,点击“新建”,设置触发器的具体时间和频率,如每天、每周、每月等。

切换到“操作”选项卡,点击“新建”,在“程序或脚本”一栏中输入bat文件路径

点击“确定”保存设置,任务计划程序会自动执行Python程序,可以在“历史记录”中查看执行情况。

避免多次爬取数据重复问题

为了避免爬取到重复信息,这里再项目中创建了log.txt文件用来记录爬虫爬取的最新状态,如果今日的爬虫爬取到日志信息状态时,说明已经把最新的信息爬取完毕,直接退出爬虫并且更新信息即可

所以可以分析出,这个项目如果这样设计的话是不支持多线程的
在这里插入图片描述

网站结构

公开招标网站信息比较简单,可以直接通过GET方法获取。

我使用BS4进行解析,因为不同地方的招标信息细节结构可能不一样,但是都是存在同一个div标签下

根据爬取信息确认招标地区

这里选择优先级不同的方式统计,扫描爬取到的信息,按照优先级统计地区出现的次数,最后根据次数最多的城市的省份划分区域

这个项目使用了一个比较大的字典保存信息
在这里插入图片描述

3. 项目代码

由于代码比较多,这里只展示部分,完整项目Github上

from lxml import etree
from Spider.Seleium.msg_xpath import dialog
from Spider.Seleium.tool import unit_tool
from Spider.Seleium.tool import save
import openpyxl as op

# 多线程爬虫
from queue import Queue


def setup():
    # 打开保存文件
    wb = op.load_workbook('C:\\Users\\30309\\Desktop\\GovSpider\\Spider\\Seleium\\data.xlsx')

    # print(wb.get_named_ranges())  # 输出工作页索引范围
    # print(wb.get_sheet_names())  # 输出所有工作页的名称
    # 取第一张表
    # ws = wb.get_sheet_names()
    # table = wb.get_sheet_by_name(ws[0])
    table = wb.active
    # print(table.title)  # 输出表名
    nrows = table.max_row  # 获得行数
    ncol = table.max_column  # 获得行数
    print(nrows, ncol)

    # 读取配置文件
    head, endLine = save.readLog()

    # 从配置文件中获取是否添加头部信息
    have_head = False
    if head.find('True') != -1:
        have_head = True

    dialog_flag = False
    prevLine = []
    end = False
    # 爬取第1到第25页数据
    for page in range(1, 25):
        root = f'http://www.ccgp.gov.cn/cggg/zygg/gkzb/index_{page}.htm'
        html = etree.HTML(unit_tool.get_html(root))
        paths = html.xpath(dialog.href)
        for path in paths:
            print(dialog.page_root + path)
            page_msg = unit_tool.get_html(dialog.page_root + path)

            list_bs4 = unit_tool.bs4Msg(page_msg)
            if len(list_bs4) == 0:
                continue

            bs4 = list_bs4[0]
            msg = unit_tool.bs4ToStr(bs4.select('td'))
            have_file = unit_tool.haveFile(msg)
            head, val = unit_tool.splitList(msg)
            unit_tool.findCity(val)
            if have_file:
                file_id = unit_tool.getFile(bs4)
                unit_tool.insertFile(file_id, val)
                # print(file_id)
                for sub_url in file_id:
                    file_url = dialog.download_root + sub_url
                    # print(file_url)
            if not have_head:
                # 所有文件写入头,头只写一次
                save.InsertExcel(table, head, nrows)
                nrows += 1
                have_head = True
            # 写入数据
            if endLine.find(str(val)) != -1:
                end = True
                break
            if not dialog_flag:
                prevLine = val
                dialog_flag = True
            save.InsertExcel(table, val, nrows)
            nrows += 1
        if end:
            prevLine = ':'.join(endLine.split(':')[1:])
            print("Dialog: 今日数据爬取完毕")
            break

    # print("DEBUG获取完成")

    # 写入配置文件
    save.writeLog(have_head, prevLine)

    wb.save('data.xlsx')

4. 运行截图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/657932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Floyd算法图解,C++实现Floyd算法

Floyd算法简介 Floyd算法是一种多源最短路径算法,是利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特弗洛伊德命名。 时间复杂度&am…

Python模块multiprocessing 实现多进程并发

简介 multiprocessing模块是Python标准库中提供的一个用于实现多进程编程的模块。它基于进程而不是线程,可以利用多核CPU的优势,提高程序的执行效率,同时也可以实现进程间通信和数据共享。 目录 1. 参数说明 1.1. Process(控制进…

推荐系统初谈

文章目录 简介推荐系统与搜索引擎发展历史所属领域 推荐系统分类概览基于内容的推荐基于协同过滤的推荐基于内存的协同过滤基于模型的协同过滤基于矩阵分解的推荐 推荐系统的评价指标推荐系统存在的问题参考文献 简介 21年笔记迁移,主要介绍了推荐系统的定义、发展…

【IC设计】ICC1 workshop lab guide 学习笔记

文章目录 Lab1 Data Setup&Basic Flow1.1 Create a Milkyway library1.2 Load the Netlist,TLU,Constraints and Controls1.3 Basic Flow:Design Planning1.4 Bsic Flow:Placement1.5 Basic Flow:CTS1.6 Basic Flow:Routing Design Planning2.1 Load the Design2.2 Initial…

算法刷题-字符串-反转字符串II

简单的反转还不够,我要花式反转 541. 反转字符串II 力扣题目链接 给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。 如果剩余字符少于 k 个,则将剩余字符全部反转。 …

C++笔记之初始化线程的所有方法

code review! C笔记之初始化线程的所有方法 文章目录 C笔记之初始化线程的所有方法一.非类中初始化线程1.使用函数指针初始化线程2.lambda表达式初始化线程3.使用成员函数初始化线程4.使用函数对象(Functor)初始化线程5.使用std::bind绑定函数及其参数初始化线程 二.类中初始化…

滤波电容计算举例

例:输入电压220VAC,功率4W;要求输出电压波动不超过5%,试计算滤波电容容量。 解:(1)电容的储能公式为:Wc1/2CU^2 当电容充电到峰值电压(即220x1.414310V)时&am…

数仓的分层理论

一、简介 2021-4-25 11:04:16 数据仓库分层是数据仓库设计中非常重要的一个环节,一个好的分层设计可以极大地简化数据仓库的操作,提升使用体验。然需要注意的是,分层理论并不绝对,只是提供一种普适的指导思想和原则,…

[Spring Cloud]:Study Notes·壹

文章目录 摘要1 认识微服务1.1 单体架构与分布式架构1.2 分布式架构与微服务1.3 微服务架构 2 nacos2.1 什么是nacos2.2 nacos使用2.2.1 nacos使用逻辑2.2.2 启动下载好的nacos2.2.3 引入依赖2.2.4 各注册服务中配置nacos相关信息2.2.5 测试nacos注册成功 3 Ribbon负载均衡3.1 …

改进YOLO系列 | YOLOv5/v7 引入谷歌 Lion 优化器

论文地址:https://arxiv.org/pdf/2302.06675.pdf 代码地址:https://github.com/google/automl/tree/master/lion 我们提出了一种将算法发现作为程序搜索的方法,并将其应用于发现用于深度神经网络训练的优化算法。我们利用高效的搜索技术来探索一个无限且稀疏的程序空间。为了…

计算机视觉-语义分割: FCN DeepLab Unet

文章目录 1. 概要1.1 什么是语义分割1.2 语义分割作用1.3 全卷积网络1.4 反卷积1.5 上采样三种方式1.6 跳层结构 Skip Layer 2. FCN架构3. DeepLab-v13.1 改进点3.2 空洞卷积(Atrous/Dilated convolution) 4. U-Net参考 1. 概要 1.1 什么是语义分割 从像素水平上理解、识别图…

微信小程序——Echarts使用(保姆式教程)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

从入门到精通!MATLAB基础教程及常用工具箱介绍

文章目录 基础介绍MATLAB窗口介绍MATLAB基本语法变量和数组控制流语句函数的定义和调用绘图MATLAB常用工具箱统计工具箱(Statistics Toolbox)控制系统工具箱(Control System Toolbox)信号处理工具箱(Signal Processing Toolbox&am…

搭建TiDB负载均衡环境-HAproxy+KeepAlived实践

作者: 我是咖啡哥 原文来源: https://tidb.net/blog/8e8cca1d 前言 HAProxy 提供 TCP 协议下的负载均衡能力,TiDB 客户端通过连接 HAProxy 提供的浮动 IP 即可对数据进行操作,实现 TiDB Server 层的负载均衡。同时&#xff0c…

SOFA Weekly|SOFARPC 5.10.1 版本发布、Layotto 社区会议回顾与预告、社区本周贡献

SOFA WEEKLY | 每周精选 筛选每周精华问答,同步开源进展 欢迎留言互动~ SOFAStack(Scalable Open Financial Architecture Stack)是蚂蚁集团自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件&am…

pytorch搭建AlexNet网络实现花分类

pytorch搭建AlexNet网络实现花分类 一、AlexNet网络概述分析 二、数据集准备下载划分训练集和测试集 三、代码model.pytrain.pypredict.py 一、AlexNet网络 概述 使用Dropout的方式在网络正向传播过程中随机失活一部分神经元,以减少过拟合 分析 对其中的卷积层、…

SORT+yolov5多目标跟踪

SORT 是一种简单的在线实时多目标跟踪算法。要点为: (1)以 IoU 作为前后帧间目标关系度量指标; (2)利用卡尔曼滤波器预测当前位置; (3)通过匈牙利算法关联检测框到目标&a…

thingsboard安装使用教程

1、安装tb-postgres tb-postgres是ThingsBoard与PostgreSQL数据库的单实例。 拉取tb-postgres镜像 docker pull thingsboard/tb-postgres 创建tb-postgres容器 docker run -itd --name tb-postgres -p 9090:9090 -p 1883:1883 -p 5683:5683/udp -p 5685:5685/udp -p 5432:…

如何使用银行四要素API接口提高用户身份认证的安全性

银行四要素是指银行在开户、转账等行为中对客户身份的核实,包括姓名、身份证号、银行卡号和手机号码。为了满足客户实名认证的需求,我们开发了相应的API接口,方便第三方开发人员进行身份核实的操作。 API接口名称:银行四要素验证…

Grafana图表配置快速入门

1、Grafana图表配置快速入门 前面我们使用 Prometheus Grafana 实现了一个简单的 CPU 使用率变化图,但是这个图还有许多缺陷,例如: 左边栏的数值太小了无法调整,下面的图标信息无法定制化等等。 其实 Grafana 的功能是非常强大…