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

文章目录

  • 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 Queuedef 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 = Falseif head.find('True') != -1:have_head = Truedialog_flag = FalseprevLine = []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:continuebs4 = 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 += 1have_head = True# 写入数据if endLine.find(str(val)) != -1:end = Truebreakif not dialog_flag:prevLine = valdialog_flag = Truesave.InsertExcel(table, val, nrows)nrows += 1if end:prevLine = ':'.join(endLine.split(':')[1:])print("Dialog: 今日数据爬取完毕")break# print("DEBUG获取完成")# 写入配置文件save.writeLog(have_head, prevLine)wb.save('data.xlsx')

4. 运行截图

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 7 月 4 日,PoseiSwap 治理通证 $POSE 上线了 BNB Chain 上的头部

在 7 月 4 日,PoseiSwap 治理通证 $POSE 上线了 BNB Chain 上的头部 DEX PancakeSwap(POSE/ZBC 交易对),在 $POSE 开盘交易的 10 分钟内,其最高涨幅达到了 2169.22%,所有的早期投资者基本都从中获得了不菲的…

Kafka入门, 消费者工作流程(十八)

kafka消费方式 pull(拉)模式: consumer采用从broker中主动拉取数据。 Kafka采用这种方式。 push(推)模式: Kafka没有采用这种方式,因为由broker决定消息发送速率,很难适应所有消费者的速率。例如推送速度是50m/s,consu…

Ant Design4中Form.List和shouldUpdate一起使用的坑

背景 在antd3.x版本中,如果要实现一组表单增加删除的功能,需要Array.map()加上state状态来控制,代码比较复杂,而且非常不优雅。 其次在antd3.x中,表单中任何一个表单项的内容更新都会触发页面重新渲染,这在…

SpringBoot整合minio服务(超详细)

一、使用docker部署minio 1、拉取镜像 docker pull minio/minio 2、创建目录 mkdir -p /home/minio/config mkdir -p /home/minio/data 3、创建Minio容器并运行 docker run -p 9000:9000 -p 9090:9090 \--nethost \--name minio \-d --restartalways \-e "MINIO_ACC…

nginx

Nginx yum安装 配置Nginx的yum源 [nginx] namenginx repo baseurlhttp://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck0 enabled1安装以及重启,检查 yum -y install nginx 默认安装最新版本 启动 关闭 重启 加载 systemctl start/stop/restar…

《安全软件开发框架(SSDF) 1.1:降低软件漏洞风险的建议》解读(三)

安全软件开发框架SSDF是由美国国家标准与技术研究院发布的关于安全软件开发的一组实践,帮助开发组织减少发布的软件中的漏洞数量,减少利用未检测到或未解决的漏洞的潜在影响,从根本上解决漏洞防止再次发生。本文根据《Secure Software Develo…

基于 Opencv python实现批量图片去黑边—裁剪—压缩软件

简介 批量处理图片文件,批量提取GIF图片中的每一帧,具有范围裁剪、自动去除黑/白边、调整大小、压缩体积等功能。 先看一些软件的界面,是基于Tkinter写的GUI 裁剪等功能基于Opencv 下载 我添加了处理GIF的github: 原作者的gith…

深度学习基础

1 机器学习、深度学习、人工智能 1.1 机器学习 机器学习是一门专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身性能的学科。 基本步骤:获取数据、数据预处理、特征提取、特征选择…

C# 元组

文章目录 C# 元组Tuple 类ValueTuple 类ValueTuple 与 Tuple的区别System.ValueTuple 类型的值是可变的System.Tuple 类型的值是不可变的System.ValueTuple 类型的数据成员是字段 System.ValueTuple 与匿名类在使用Linq查询时,如何权衡使用元组还是匿名类权衡主要区…

奇点云DataSimba R4.9 LTS发布:稳定性加固,架构升级,142项功能上新

不久前,奇点云的数据云全系产品如期发布新一季商业化版本更新: 数据云平台DataSimba:R4.9 LTS版发布,稳定性全面加固,功能上新;自R4系列起架构升级,封装底层复杂性,支撑上层快速构建…

CSS圆角进化论

CSS圆角发展过程 大致经历了3个阶段,包括: 背景图片实现圆角CSS2.0标签模拟圆角CSS3.0圆角属性(border-radius属性)实现圆角 ☛背景图片实现圆角:使用背景图片实现圆角的方式很多,实现的方式和圆角的切图方式关系密…

Nacos服务注册成功,RestTemplate调用服务提供者时空指针异常(已解决)

发现问题并进行记录 目录 项目场景:问题描述原因分析解决 项目场景: RestTemplate也可以做服务调用(进行测试) 目的:解决该问题,不考虑其他远程调用方式(Fegin,Dubbo) 项目Pom文件 Spring Boot ----2.6.3 Spring Cloud------2021.0.1 Spring Cloud Al…