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

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}];   //数组对象内容分别为分类名和对应typeCodeurl u;//定义一个url
for(int i = 0;i < cla.length; i++){//循环数组u.title = cla[i].name+"#"+cla[i].num;   //链接标题为:分类名#typeCodeu.urlname = "http://chinabidding.mofcom.gov.cn/zbwcms/front/bidding/bulletinInfoList";   //链接请求为post请求u.tmplid = 2;   //关联模板02u.entryid = CHANN.id;  //固定搭配,请求排重var post="pageNumber=1&keyWord=&timeType=&rangeCode=&typeCode="+cla[i].num+"&capitalSourceCode=&industryCode=&provinceCode=";//拼post Form DataRESULT.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;//定义一个urlu.title =URL.title.Left("#")+"第"+ i+"页"+URL.title.Right("#");   //链接标题为:公告分类+翻页数+分类参数u.urlname = "http://chinabidding.mofcom.gov.cn/zbwcms/front/bidding/bulletinInfoList";   //请求链接u.tmplid = 3;   //关联模板03u.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;//定义一个urlu.title =URL.title.Left("#")+"第"+ i+"页"+URL.title.Right("#");   //链接标题为:公告分类+翻页数+分类参数u.urlname = "http://chinabidding.mofcom.gov.cn/zbwcms/front/bidding/bulletinInfoList";   //请求链接u.tmplid = 4;   //关联模板03u.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.mzph.cn/news/46995.shtml

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

相关文章

Azure CLI 进行磁盘加密

什么是磁盘加密 磁盘加密是指在Azure中对虚拟机的磁盘进行加密保护的一种机制。它使用Azure Key Vault来保护磁盘上的数据&#xff0c;以防止未经授权的访问和数据泄露。使用磁盘加密&#xff0c;可以保护磁盘上的数据以满足安全和合规性要求。 参考文档&#xff1a;https://l…

【Unity】2D平台游戏初中级教程-笔记补充

文章目录 观前提醒链接地址百度网盘&#xff08;第3、4、5章的Asset内容&#xff09; 为什么要弄这篇博客&#xff1f;章节内容提示本人制作的环境 第1章&#xff1a;玩家控制器Part1&#xff1a;设置瓦片地图与分类层的顺序【1】导入素材【2】制作瓦片地图【3】调色盘与瓦片存…

Quartz任务调度框架介绍和使用

一、Quartz介绍 Quartz [kwɔːts] 是OpenSymphony开源组织在Job scheduling领域又一个开源项目&#xff0c;完全由Java开发&#xff0c;可以用来执行定时任务&#xff0c;类似于java.util.Timer。但是相较于Timer&#xff0c; Quartz增加了很多功能&#xff1a; 1.持久性作业 …

PDF怎么转Word?8 个最佳 PDF 转 Word 转换器

PDF 转 Word 转换工具只是一个特殊程序&#xff0c;可以将 PDF&#xff08;本机和/或扫描&#xff09;转换为 Microsoft Office Word 格式。将 PDF 导出到 Word 的主要原因之一是满足可编辑文档的需求&#xff0c;尽管还有其他原因。 由于缺少 PDF 阅读器&#xff0c;您可以选…

AutoDev 1.1.3 登场,个性化 AI 辅助:私有化大模型、自主设计 prompt、定义独特规则...

在过去的半个月里&#xff0c;我们为开源辅助编程工具 AutoDev 添加了更强大的自定义能力&#xff0c;现在你可以&#xff1a; 使用自己部署的开源大模型自己配置 Intellij IDEA 中的行为自定义开发过程中的规范 当然了&#xff0c;如果您自身拥有开发能力的话&#xff0c;建议…

fastgpt构建镜像

1.把client目录复制到服务器 .next和node_modules文件夹不用上传到服务器 在服务器目录运行 docker build -t fastgpt:1.0.3 . 构建服务 再运行 docker ps 就可以看到容器了

数据结构(2)

冒泡排序&#xff1a; 1.比较相邻的两个元素。如果前一个元素比后一个元素大&#xff0c;则交换两者位置。 2.对每一对相邻元素做相同工作&#xff0c;从第一对元素到最后一对元素&#xff0c;最后的一个元素就是最大的元素。 for(int ia.length-1;i>0;i--){for (int j 0…

VS2019+Qt5.15.2 编译 QtWebEngine(带音视频解码)

前言 QtWebEngine 是 Qt 框架的一部分&#xff0c;用于构建现代 Web 浏览器功能。本篇教程将向您展示如何在 Visual Studio 2019 中编译 QtWebEngine 5.15.2 源码&#xff0c;并配置以支持音视频解码功能。 准备工作 1、源码下载 2、源码修改&#xff0c;参考Qt Code Review…

微信小程序纯前端从阿里云OSS下载json数据-完整版

起因 因为云开发开始收费(貌似很久了),准备改造在以前的小程序,数据转到oss上,小程序使用原生,不算专业领域, 所以先百度.... 网上的教程真的是千篇一律,大部分开局就是require(ali-oss); 好点的npm install ali-oss --save开局,拼凑操作到最后发现要用云开发,因为云…

HTTPS代理搭建技巧分享

今天我们来分享一下如何搭建一个能够实现中间人 检测和防护的HTTPS代理。保护我们的网络通信安全是至关重要的&#xff0c;让我们一起学习如何构建一个安全可靠的HTTPS代理吧&#xff01; 什么是中间人 &#xff1f; 首先&#xff0c;让我们来了解一下什么是中间人 。中间人 是…

RK3399平台开发系列讲解(内核调试篇)内核中内存泄漏的调试

🚀返回专栏总目录 文章目录 一、Linux 内核内存泄漏二、如何观测内核内存泄漏?三、kmemleak 工具沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 内核内存泄漏往往都会是很严重的问题,那么,我们该如何判断内存泄漏是否是内核导致的呢? 一、Linux 内核内存泄漏 …

GPT-3.5——从 人工智障 到 大人工智障

有人说&#xff0c;GPT是从人工智障到人工智能的蜕变&#xff0c;但是。。。 我认为&#xff0c;GPT是从 人工智障 到 大人工智障 的退化。。。 从 人工智障 到 大人工智障 GPT-3.5学术介绍No.1---- 西红柿炒钢丝球基本信息详细制作方法材料步骤 幕后花絮 No.2---- 顶尖数学家…

【数据分析入门】Jupyter Notebook

目录 一、保存/加载二、适用多种编程语言三、编写代码与文本3.1 编辑单元格3.2 插入单元格3.3 运行单元格3.4 查看单元格 四、Widgets五、帮助 Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算&#xff1a;开发、文档编写、运行代码和展示结果。 …

自动驾驶合成数据科普一:不做真实数据的“颠覆者”,做“杠杆”

前言&#xff1a; 在7月底的一篇文章中&#xff0c;九章智驾提到&#xff0c;数据闭环能力是自动驾驶下半场的“入场券”&#xff0c;这一观点在行业内引起了广泛共鸣。 在数据闭环体系中&#xff0c;仿真技术无疑是非常关键的一环。仿真的起点是数据&#xff0c;而数据又分为真…

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 3 Paramter标签页介绍

这页是参数设置的界面,那首先要知道什么是参数,参数就是算法中的系数这些可以更改的变量,接下来就是要学习如何创建参数,如下图: 打开模型资源管理器 选择model Workspace标签,点击上边工具栏里的创建参数的按钮(红色箭头指向的按钮),添加一个新的参数K,值设置为4,数…

linux部署clickhouse(单机)

一、下载安装 1.1、下载地址 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区阿里巴巴开源镜像站&#xff0c;免费提供Linux镜像下载服务&#xff0c;拥有Ubuntu、CentOS、Deepin、MongoDB、Apache、Maven、Composer等多种开源软件镜像源&#xff0c;此外还提供域名解析DNS、…

opencv进阶14-Harris角点检测-cv2.cornerHarris

类似于人的眼睛和大脑&#xff0c;OpenCV可以检测图像的主要特征并将这 些特征提取到所谓的图像描述符中。然后&#xff0c;可以将这些特征作为数据 库&#xff0c;支持基于图像的搜索。此外&#xff0c;我们可以使用关键点将图像拼接起 来&#xff0c;组成更大的图像。&#x…

软件开发bug问题跟踪与管理

一、Redmine 项目管理和缺陷跟踪工具 官网&#xff1a;https://www.redmine.org/ Redmine 是一个开源的、基于 Web 的项目管理和缺陷跟踪工具。它用日历和甘特图辅助项目及进度可视化显示&#xff0c;同时它又支持多项目管理。Redmine 是一个自由开源软件解决方案&#xff0c;…

通过DBeaver 给Postgre SQL表 设置主键自增

1.创建表 CREATE TABLE public.company ( id int4 NOT NULL , name text NOT NULL, age int4 NOT NULL, address bpchar(50) NULL, salary float4 NULL, join_date date NULL, CONSTRAINT company_pkey PRIMARY KEY (id) ); 2.插入数据&#xff08;不传入id&#xff…

机器学习:什么是分类/回归/聚类/降维/决策

目录 学习模式分为三大类&#xff1a;监督&#xff0c;无监督&#xff0c;强化学习 监督学习基本问题 分类问题 回归问题 无监督学习基本问题 聚类问题 降维问题 强化学习基本问题 决策问题 如何选择合适的算法 我们将涵盖目前「五大」最常见机器学习任务&#xff1a…