网络爬虫能够便捷的从网络上爬取各类所需数据,spiderflow是一款提供可视化界面的网络爬虫工具,通过流程化的配置过程实现数据的采集汇聚。本文以政府官方网站的新闻资讯爬取为例说明spiderflow的使用过程。
spiderflow的安装过程不再赘述,直接参考官方文档或者网络教程即可。
打开spiderflow可视化界面,在爬虫列表界面中选择“添加爬虫”。
spiderflow提供了一个类似流程编辑器的操作界面,包含爬虫、变量、循环、注释、输出、SQL脚本、JS脚本、子流程等多种基本功能,常规的网络数据爬取需求都能实现,比较复杂的需求还是要费些功夫。
输入爬虫名称,保存后开始下一步编辑。
使用爬虫获取信息一般都是有目的性的,所以需要首先明确信息的来源,然后针对性的配置爬虫。选取一个目标站点,如湖南省国防动员办公室官网(http://rfb.hunan.gov.cn/),找到新闻列表页,如省办动态(http://rfb.hunan.gov.cn/rfb/xxgk_70641/gzdt/sbdt/index.html)。
添加爬虫,URL地址设为http://rfb.hunan.gov.cn/rfb/xxgk_70641/gzdt/sbdt/index.html,请求方式设为GET。
使用浏览器打开新闻列表页面,按F12调试工具查看页面元素结构。以此页面为例,需要获取table对象中的文档标题列。
添加变量,从爬虫抓取的response中筛选列表元素。以此页面为例,从请求返回的页面html中选择所有CSS类为wdbtb的对象,并将结果赋值给变量elementbd,代码如下。
${extract.selectors(resp.html,'.wdbtb')}
使用调试功能,测试结果如下。
在获取新闻列表后,再循环爬取获取新闻详情的具体内容。由于上一步获取的结果列表中包含了a对象,其href属性为详情页面的地址,通过url拼接的方式使用爬虫访问新闻详情页面。
添加爬虫,设置循环,遍历变量elementbd的所有子对象,查找每个子对象中的a元素,并取其href属性值,与网站域名拼接为详情页url地址,请求方法设为GET。代码如下:
http://rfb.hunan.gov.cn${extract.selector(elementbd[i+1],'a','attr','href')}
启动调试,测试结果如下。
用浏览器打开详情页,使用F12工具查看页面结构,目标是获取标题、副标题(含作者、发布时间等)、正文内容等。
添加变量,用于从爬虫返回的html中选取标题、副标题、内容等对象。
此处需要具备一定的前端基础知识(如html、CSS等),利用spiderflow提供的抽取函数筛选所需对象。
标题title ${extract.selector(resp.html,'.tys-main-zt h3','text')} 发布时间publishtime ${extract.selectors(resp.html,'.tys-main-zt-aa','text')[1]} 原文链接href ${resp.url} 正文内容content ${extract.selector(resp.html,'.tys-main-zt-show')}
增加输出,配置输出项,将上一步中的变量进行处理。
id | ${string.uuid()} |
id标识,自带函数 |
title | ${title} |
标题 |
herf | ${href} |
原文链接 |
publishtime | ${publishtime.split(':')[1]} |
新闻发布时间,将副标题文本拆分得到 |
content | ${content} |
正文内容,HTML |
abstracts | ${list2string(extract.selectors(content,'span','text'),120)} |
正文摘要,正文中所有文本拼接后截取前段字符。list2string为自定义函数。 |
images | ${addprefix(extract.selectors(content,'img','attr','src'),href.replace('.html',''))} |
正文图片,正文中所有图片地址拼接网站域名为完整地址。addprefix为自定义函数。 |
gettime | ${date.format(date.now(),'yyyy-MM-dd hh:mm:ss')} |
爬虫爬取页面的时间,即当前时间,自带函数。 |
打开“数据源管理”,选择“添加数据源”,配置新的数据源。
数据源测试正常后,回到爬虫的输出节点配置界面,勾选“输出至数据库”,选择数据源并填入目标数据库表名。保存爬虫,开始启动。
当需要爬取多个同类型站点是,由于每个站点的页面结构存在差异,需要单独配置爬虫,然后以子任务的形式将所有爬虫汇集到一起进行管理。
爬虫配置完成后,想要定时更新信息,就需要配置定时任务了。使用常见的cron表达式配置定时任务,也提供有可视化界面。