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

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.导出的文件

图片

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值