【从零开始学爬虫】采集中国国际招标网招标数据

news2024/11/15 10:14:16

l 采集网站

【场景描述】采集中国国际招标网招标数据。

【源网站介绍】中国国际招标网致力于为企业提供招标、采购、拟在建项目信息及网上招标采购等一系列商务服务。

【使用工具】前嗅ForeSpider数据采集系统

http://www.forenose.com/view/forespider/view/download.html

【入口网址】

http://chinabidding.mofcom.gov.cn/channel/business/bulletinList.shtml?s=

【采集内容】

采集字段:公告名、发布时间、正文内容、链接、公告类型、所属地区。

图片

【采集效果】

如下图所示:

图片

l 思路分析

配置思路概览:

图片

l 配置步骤

1.新建采集任务

选择【采集配置】,点击任务列表右上方【+】号可新建采集任务,将采集入口地址填写在【采集地址】框中,【任务名称】自定义即可,点击下一步。

图片

2.获取分类链接

在浏览器中打开中国国际招标网,我们要采集所有招标公告、招标变更公告、评价结果公示和中标结果公告中的公告内容,所以第一步是获取以上分类的请求链接。

在浏览器中,分别搜索各类公告,发现页面链接没有变化,说明对应的数据在请求链接中。点击F12,打开开发者工具,选择Network,然后搜索任何一个分类比如“招标变更公告”,开发者工具中,出现该分类对应请求,如图所示:

图片

观察发现该请求是一个post请求,其通过post Form Data来传递信息。

该请求的链接为:http://chinabidding.mofcom.gov.cn/zbwcms/front/bidding/bulletinInfoList

该请求的Form Data为:pageNumber=1&keyWord=&timeType=&rangeCode=&typeCode=2&capitalSourceCode=&industryCode=&provinceCode=

同样的方法,观察其他分类对应的请求,发现“招标公告”请求链接为:http://chinabidding.mofcom.gov.cn/zbwcms/front/bidding/bulletinInfoList

该请求的Form Data为:

pageNumber=1&keyWord=&timeType=&rangeCode=&typeCode=1&capitalSourceCode=&industryCode=&provinceCode=

Post请求链接是不变的,其Form Data中的typeCode参数是变化的,观察发现各分类对应typeCode如下所示:

招标公告-1 招标变更公告-2  评标结果公告-3  中标结果公告-4

根据以上规律,在ForeSpider中用脚本拼写请求,具体如下所示:

图片

脚本文本如下所示:

array cla;    //定义一个数组
cla = [{name:"招标公告",num:1},
{name:"招标变更公告",num:2},
{name:"评标结果公告",num:3},
{name:"中标结果公告",num:4}];   //数组对象内容分别为分类名和对应typeCode

url u;//定义一个url
for(int i = 0;i < cla.length; i++){//循环数组
	u.title = cla[i].name+"#"+cla[i].num;   //链接标题为:分类名#typeCode
	u.urlname = "http://chinabidding.mofcom.gov.cn/zbwcms/front/bidding/bulletinInfoList";   //链接请求为post请求
	u.tmplid = 2;   //关联模板02
	u.entryid = CHANN.id;  //固定搭配,请求排重
	var post="pageNumber=1&keyWord=&timeType=&rangeCode=&typeCode="+cla[i].num+"&capitalSourceCode=&industryCode=&provinceCode=";//拼post Form Data
	RESULT.AddLink(u,post);   //返回请求
}  

3.获取翻页链接

用同样的方法观察不同分类招标公告在不同页面上的请求,发现其post请求链接没变,不同分类不同翻页的请求与其Form Data中的pageNumber参数、typeCode参数有关。

例如:pageNumber=2&keyWord=&timeType=&rangeCode=&typeCode=1&capitalSourceCode=&industryCode=&provinceCode= ,返回的是招标公告第二页的数据内容。

根据以上规律,在ForeSpider中新建模板02链接抽取模板,用脚本拼写请求,具体如下所示:

图片

脚本文本如下所示:

var str = DOM.GetSource().ToStr();//获取到所有源码
jScript js;//定义一个js
var obj = js.RunJson(str);//运行js
var page=obj.maxPageNum;//取源码中最大页数
for(int i = 1;i <= 3; i++){//循环翻页
	url u;//定义一个url
	u.title =URL.title.Left("#")+"第"+ i+"页"+URL.title.Right("#");   //链接标题为:公告分类+翻页数+分类参数
	u.urlname = "http://chinabidding.mofcom.gov.cn/zbwcms/front/bidding/bulletinInfoList";   //请求链接
	u.tmplid = 3;   //关联模板03
	u.entryid = CHANN.id;  //固定搭配
	var post="pageNumber="+i+"&keyWord=&timeType=&rangeCode=&typeCode="+URL.title.Right("#")+"&capitalSourceCode=&industryCode=&provinceCode=";//拼写Form Data参数
	RESULT.AddLink(u,post);   //返回请求
}  

采集预览观察生成的链接,是否与网页中对应的翻页链接和Form Data一致,如果一致则继续配置下一步。

图片

 

4.获取招投标公告列表链接

①新建模板03,在其下新建一个链接抽取模板,具体操作如下所示:

图片

②在浏览器上观察翻页请求链接返回的源码中的公告数据内容,如下所示:

图片

根据数据结构,在ForeSpider中,用脚本抽取列表链接数据,具体如下所示:

图片

脚本文本如下所示:

var str = DOM.GetSource().ToStr();//获取到所有源码
jScript js;//定义一个js
var obj = js.RunJson(str);//运行js
var page=obj.maxPageNum;//取源码中最大页数
for(int i = 1;i <= 3; i++){//循环翻页
	url u;//定义一个url
	u.title =URL.title.Left("#")+"第"+ i+"页"+URL.title.Right("#");   //链接标题为:公告分类+翻页数+分类参数
	u.urlname = "http://chinabidding.mofcom.gov.cn/zbwcms/front/bidding/bulletinInfoList";   //请求链接
	u.tmplid = 4;   //关联模板03
	u.entryid = CHANN.id;  //固定搭配
	var post="pageNumber="+i+"&keyWord=&timeType=&rangeCode=&typeCode="+URL.title.Right("#")+"&capitalSourceCode=&industryCode=&provinceCode=";//拼写Form Data参数
	RESULT.AddLink(u,post);   //返回请求
}  

5.抽取招投标公告数据

①新建模板04,在其下新建一个数据抽取模板,用来抽取招投标公告数据。

图片

②在数据建表模块,新建一个数据表,字段如下所示:

图片

③关联数据表

在数据抽取处关联新建的数据表。

图片

④字段publish_time、biaoStage、text_title、text_url、city在上一层均已获取到并通过链接标题传递到本层,所以可直接使用脚本从链接标题中获取。

字段text_all需在数据页源码中获取,在浏览器中打开任意一个公告数据页,点击F12,查找到正文数据在源码中对应的位置,如下图所示:

图片

我们发现正文内容在class为mt20 clearfix的节点下,所以用脚本取该节点文本即可。数据抽取脚本如下所示:

图片

脚本文本如下所示:

var str=DOM.GetSource().ToStr();//获取数据页所有源码

record re;//定义一个返回值
re.id=MD5(URL.urlname);//获取数据页链接的MD5值作为数据id
re.publish_time=URL.title.Middle("%%","~~");//从链接标题中提取发布时间并返回值
re.biaoStage=URL.title.Left("@");//从链接标题中提取公告类别并返回值
re.text_title=URL.title.Middle("@","$$");//从链接标题中提取公告标题并返回值
re.text_url=URL.urlname;//返回数据页链接
re.city=URL.title.Middle("$$","%%");//从链接标题中提取城市并返回值
re.text_all=DOM.GetTextAll(DOM.FindClass("mt20 clearfix"));//找到mt20 clearfix节点,并获取其下所有文本内容返回
RESULT.AddRec(re,this.schemaid);

⑤采集预览,如下图所示,各类招标数据已被采集出来了,说明模板配置完成。

图片

|采集步骤

模板配置完,采集预览没有问题,可以进行数据采集。

1.建立数据表单

选择【数据建表】,点击【表单列表】中该模板的表单,在【关联数据表】中选择【创建】,表名称自定义,这里命名为【guojizb】(注意命名不能用数字和特殊符号),点击【确定】。创建完成,勾选数据表,并点击右上角保存按钮。

图片

2.开始采集

选择【数据采集】,勾选任务名称,点击【开始采集】,则正式开始采集。

图片

3.导出数据

采集结束后,可以在【数据浏览】中,选择数据表查看采集数据,并导出数据。

图片

图片

4.导出的文件

图片

本教程仅供教学使用,严禁用于商业用途!

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

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

相关文章

LVS-DR模式下(RS检测)ldirectord工具实现部分节点掉点后将请求发往正常设备进行处理

基于前文的LVS-DR集群构建环境 一.下载ldirectord软件 二.将模板文件中的LVS-DR模式相关文件拷贝到/etc/ha.d主配置目录并按实际设备修改 三.配置两台RS匹配规则 四.停止RS1的http服务进行测试 RS1失去工作能力&#xff0c;RS2接替RS1 基于前文的LVS-DR集群构建环境 一.下…

ARM--day5(C语言点灯实验、总线、串口通信信息、串口通讯协议)

函数分装实现点灯 gpio.c: #include "gpio.h" //函数功能&#xff1a;GPIO引脚初始化操作 //参数1&#xff1a;GPIO组号 //参数2&#xff1a;引脚编号 //参数3&#xff1a;初始化内容 void hal_gpio_init(volatile gpio_t*gpiox,unsigned int pin,gpio_init_t* ini…

浏览器控制台调试代码和JavaScript控制台方法介绍

浏览器控制台调试代码和JavaScript控制台方法介绍 浏览器控制台调试代码 浏览器控制台&#xff08;Console&#xff09;是浏览器提供的一个开发工具&#xff0c;用于在浏览器中执行和调试 JavaScript 代码。它提供了一个交互式环境&#xff0c;可以输入 JavaScript 代码&#…

计算机竞赛 wifi指纹室内定位系统

简介 今天来介绍一下室内定位相关的原理以及实现方法; WIFI全称WirelessFidelity&#xff0c;在中文里又称作“行动热点”&#xff0c;是Wi-Fi联盟制造商的商标做为产品的品牌认证&#xff0c;是一个创建于IEEE 802.11标准的无线局域网技术。基于两套系统的密切相关&#xff…

UGUI组件Rect Transform

一. Rect Transform概述 画布上UI对象都附加一个Rect Transform组件&#xff0c;和一般对象附加的Transform对象相比&#xff0c;Rect Transform多了Width,Height,Anchor,Pivot属性。 二.位置属性 UI对象的坐标是其轴心到锚点之间的像素值&#xff0c;如下图所示。 三.Pivot(…

同时负责多个项目,团队成员还参与多个项目开发,如何有效管理?分享9个策略

如果你正在管理一个团队或项目&#xff0c;可能会需要同时在进行多个项目的管理。在这种情况下&#xff0c;追踪所有进行中的项目部分可能会迅速变得非常复杂。没有合适的管理过程&#xff0c;就难以确定哪些工作应该优先处理&#xff0c;也不容易确保团队有效管理工作量&#…

WPF显示初始界面--SplashScreen

WPF显示初始界面–SplashScreen 前言 WPF应用程序的运行速度快&#xff0c;但并不能在瞬间启动。当第一次启动应用程序时&#xff0c;会有一些延迟&#xff0c;因为公共语言运行时&#xff08;CLR&#xff09;首先需要初始化.NET环境&#xff0c;然后启动应用程序。 对于WPF中…

Spring基础梳理(一):一定要先全局掌握Spring

越活越完蛋了&#xff0c;看着看着现在又想梳理梳理Spring基础&#xff0c;搞点原始真解吧&#xff0c;不过技术人每个阶段看相同东西的理解都是不同的&#xff0c;只是现在浮躁的技术中又有多少人能够一本书啃两遍以上呢&#xff0c;我也一样&#xff0c;徜徉于业务之中&#…

【国护攻防场景下的沙箱技术对比】

目录 前言 沙箱技术分析 总结 前言 真高兴呀&#xff0c;又是受到红队大佬青睐的一天&#xff0c;今天下午很荣幸的收到了来自红队大佬的恶意投喂&#xff0c;把我们各位在座100年工作经验的蓝队师傅们吓得赶忙拔掉自己的电脑电源&#xff0c;断掉自己的网线&#xff0c;…

基于Helm管理Kubernetes应用

目录 基于kubeadm部署K8S集群 一、环境准备 1.1、主机初始化配置 1.2、部署docker环境 二、部署kubernetes集群 2.1、组件介绍 2.2、配置阿里云yum源 2.3、安装kubelet kubeadm kubectl 2.4、配置init-config.yaml 2.5、安装master节点 2.6、安装node节点 2.7、安装…

Linux驱动开发(Day4)

字符设备驱动分步注册&#xff1a;

OpenCV实战(OCR识别和高级基础)

目录 图像特征harris角点检测基本原理实现 Scale Invariant Feature Transform&#xff08;SIFT&#xff09;图像尺度空间多分辨率金字塔高斯差分金字塔&#xff08;DOG&#xff09;DoG空间极值检测关键点的精确定位消除边界响应特征点的主方向生成特征描述 特征匹配Brute-Forc…

Linux命令200例:crontab详解及应用场景(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

视频智能分析/视频云存储/集中存储EasyCVR平台AI分析告警列表定制

安防监控视频集中存储/云存储EasyCVR视频汇聚平台基于云边端一体化架构&#xff0c;可支持多协议、多类型设备接入&#xff0c;视频监控综合管理平台具有强大的数据接入、处理及分发能力&#xff0c;能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、…

Effective C++学习笔记(7)

目录 条款41&#xff1a;了解隐式接口和编译多态条款42&#xff1a;了解typename的双重意义条款43&#xff1a;学习处理模板化基类内的名称条款44&#xff1a;将与参数无关的代码抽离templates条款45&#xff1a;运用成员函数模板接受所有兼容类型条款46&#xff1a;需要类型转…

100. 相同的树

100. 相同的树 题目-简单难度示例1. dfs2. bfs 题目-简单难度 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 示例 1&#xff1a; 输入…

Stable Diffusion XL(SDXL)原理详解

技术报告&#xff1a;SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis 官方代码&#xff1a;Stability-AI-generative-models 模型权重&#xff1a;HuggingFace-Stability AI 非官方代码&#xff1a;Linaqruf/kohya-trainer diffuser库&#xf…

Redis实战:Redis的安装及简单使用

本片将介绍 Redis 的安装及简单使用 文章目录 1、Redis安装1.1、Windows下Redis的安装1.2、Linux下Redis的安装1.3、Mac下Redis的安装&#xff08;使用Homebrew&#xff09; 2、Redis使用2.1、启动服务端客户端2.2、Redis简单命令 3、Redis命令大全 1、Redis安装 1.1、Windows…

Redis持久化——AOF

介绍 Redis是运行在内存中的数据库&#xff0c;当我们关闭了Redis服务器后&#xff0c;内存中的数据会丢失吗&#xff1f; 答案是不会的&#xff0c;因为Redis有持久化功能&#xff0c;能够将内存中的数据保存到磁盘中的文件&#xff0c;以此来实现数据的永久保存。 在Redis中…

Spring Clould 消息队列 - RabbitMQ

视频地址&#xff1a;微服务&#xff08;SpringCloudRabbitMQDockerRedis搜索分布式&#xff09; 初识MQ-同步通讯的优缺点&#xff08;P61&#xff0c;P62&#xff09; 同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&…