网页抓取(又称为网络数据提取、网页爬取)是一种从网页上获取页面内容的计算机软件技术。它是一种数据复制过程,其中从网页上收集和复制特定数据,并将其存储在数据库或电子表格中,以便以后检索或分析。网页抓取也涉及到网络自动化,它利用计算机软件模拟了人的浏览。日常生活中常需要一点网页抓取,如在线的价格比较、气象数据监测等。
接到这样一项任务,需要从geologues-prospecteurs.fr网站上,抓取近800张矿物描述照片,然后把这些矿物名称翻译成中文,并收集矿物的晶体化学式、类别等制作成PPT。geologues-prospecteurs.fr是来自法国的科普性质的网站,创办于1991年,作者有洛杉矶大学、洛里昂大学和南希国家地质学院的学术背景,网站提供大量的矿物、火山、自然灾害、地质遗址等图片及视频素材,网站中矿物描述卡片是要抓取的内容。
geologues-prospecteurs.fr创建的数据抓取流程,由构造索引页链接、下载索引页、解析矿物名称、构造矿物卡片链接和下载卡片共五个部分组成。
数据抓取流程1、构造索引页链接
geologues-prospecteurs网站根据矿物名称的首字母,将近800个矿物划分成26个页面,每个索引页地址以小写的首字母表示,如a.php、b.php等。下载矿物卡片第一步是从构造这些索引页面的网络地址,构造地址工作由表格数据、补充序列和替换共三个节点组成。
表格数据节点,创建一个流程内部数据源,新建一个URL数据字段,字段中有一个数据项b。
表格数据节点补充序列节点,系统扫描数据字段,当指定的序列数据未在数据字段中出现时,将其补充到数据表中的。指定序列可以是连续型的数值和日期,也可以是离散型的字符列表。自定义字符串序列的右键已预制了汉字序号、字母、罗马序号等多个序列,方便研究者快速编制字符序列。将24个小写的字母补充到了URL字段中,使数据表变成了24行记录(不包括a和g,矿物卡片已手工下载)。
补充序列节点替换节点,当记录满足指定条件时,用替换值的内容代替字段列表中的内容。替换字段可指定一个或多个字段,将URL添加到替换字段列表中。条件为逻辑表达式,true或非0值为真,false或0为假;节点中指定条件为1,意为表达式返回值为真,即替换字段中所有数据项的内容。替换值中,用F函数构造矿物索引网页的地址。
构造下载索引页地址数据专家中有两个快速格式化字符串的函数,即F和Format函数。Format赋值需要占位符和变量,当需要拼接多个变量会造成语句过长等不易理解问题,如:Format( "{0} 井 {1:yyyy-MM-dd}~{2:MM-dd} 生产曲线" ,Xi33,2013-5-1,2013-7-1)的输出结果为“Xi33 井 2013-5-1~7-1 生产曲线”;F函数旨在替代Format函数,把字符串中的变量,放在大括号内,如F('{id}');也支持表达式,如F('{ 1 + 2.0 :F2}'),输出结果为“3.00”。
替换表达式中使用了一个@Fields变量,该变量用在替换、向上取值节点中,代表任意字段名;节点运行时,系统用取值字段的值替换@Fields变量。
2、下载索引页
前面构造了索引页的地址字段,在其后添加一个新列字段,字段名为Body,表达式中使用了HtmlContext函数,该函数用于获取指定的Web地址的页面内容。数据专家中,有两个获取Web页面的函数:HtmlContext和HtmlDownload,区别在于HtmlContext的返回值为字符,HtmlDownload返回的是二进制数组。
获取下载索引页运行Body节点,系统根据URL获取了Web页面的内容,页面内容为HTML格式的字符串。HTML即超文本标记语言(英语:Hyper Text Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。HTML是一种基础技术,常与CSS、JavaScript一起被众多网站用于设计网页、网页应用程序以及移动应用程序的用户界面。网页浏览器可以读取HTML文件,并将其渲染成可视化网页。HTML的语言形式为尖括号包围的HTML元素(如<html>),浏览器使用HTML标签和脚本来诠释网页内容,但不会将它们显示在页面上。
下载索引页地址3、解析矿物名称
接下来需要从HTML中提取的矿物名称,以便于构造矿物卡片的地址。解析工作由新列节点TagA,行数据劈分、筛选和新列节点Minerals四个节点构成。
解析矿物名称分支流程1)获取所有超链接标签
新列节点TagA,以公式方式新建了TagA文本型字段,表达式为GetHtmlAllTags( Body , 'a'),意为从HTML内容中,提抽所有超链接标签(a)的内容,获取的多个标签之间以“|”字符分隔。除GetHtmlAllTags函数之外,数据专家中还提供了HtmlExtract、HtmlTagsCount、GetHtmlCellValue等大量的HTML解析函数,以方便研究者从网页面上提取信息。
2)劈分出超链接标签
行数据劈分节点,一个很有意思的节点,将一个或多个字段中的数据项劈分成多个数据项,这也是唯数不多的几个可以向数据表中增加记录的节点之一。以“|”为分隔字符劈分TagA字段。
辟分成多行运行结果表明,系统将获取的矿物索引页面24条记录,劈分成了4315个记录。其中ColumnIDField字段指示了劈分出字符串在原字符串中的位置。
辟分结果3)剔除无效超链接标签
从运行结果来看,很显然4千多个记录,绝大数据的记录和矿物卡片无相关的链接。发现矿物卡片的标签中都包含一个特定的字符串,于是通过筛选节点将有用的矿物卡片记录过滤出来,筛选条件为HasSubString( TagA , 'miniatures-anglais' )。
4)提取矿物名称
超链接标签文本中属性Href的文件名称,即矿物名称;使用SubStrBetweenS( TagA , 'images-anglais/' , '.jpg' )表达式提取矿物名称,其中SubStrBetweenS函数,意为提取介于两个字符串之间的内容。这是一组函数中的一个,除它之外还有SubStrBetween提取字符串中两个位置之间的内容;SubStrBetweenL提取两个两组列表字符串之间的内容;ReplaceBetweenS替换两个字符串之间的内容等。
抽取矿物结果4、构造矿物卡片链接
构造卡片链接地址,即根据矿物的名称创建图片的网络地址和本地存放的路径,同时需已从下载列表中扣除已下载部分的记录。
这部分有五个节点构成,其中imgURL和LPath为新列节点,通过字符串拼接图片的网络地址和本地路径;扫描目录节点B,给出了本地已下载的文件路径;过滤节点扫描目录的文件路径DocName更名为LPath,以便于合并节点使用。
构造矿物卡片链接合并节点采用的是排除连接(Except JOIN),以网站上获取的矿物卡片地址为左连接,本地已下载文件路径为右连接,从卡片地址列表中扣除已下载部分的记录,生成待下载的矿物卡片列表。
合并分支流程将本地已下载文件信息引入流程中的原因在于,下载过程比较慢,受网络的影响,下载过程可能会中断,通过排除连接将未下载的页面地址过滤出来的,以减少重复下载的工作量。
5)下载卡片
使用数据项转存节点,从geologues-prospecteurs网站上,把矿物卡片下载到本地路径中。数据项转存节点提供BLOB转存、文本转存或网络地址下载三个功能点;BLOB转存,将二进制数据项转存为本地文件;文本转存,将字符串保存为本地文件;网络地址下载,是根据网络路径,下载页面的内容,并保存为本地文件。
下载矿物卡片运行数据项转存节点,查看指定的文件路径,就可以看到一个个矿物卡片神奇般去出现在本地磁盘上。
下载的矿物卡片经过以上的五个步骤,矿物卡片抓取流程到这里就完成了,他从网络上下载了800张卡片。后续的章节中,还会介绍将这些图片制作成演示文档过程。在这里还一点,值得交待一下,数据转存过程中,涉及本地路径,这一特殊的字符串数据。文件路径以\字符一层层地表示出了文件的具体位置,然而在数据专家中,/是转义字符,具有特定的含义,如\r是回车、\n是换行、\t是制表符等。因而两者之间存在冲突。解决方案是在流程属性编辑器中,取消运行时字符转义的勾选状态,以保证流程中的路径正常使用。
路径设置总结
本案例描绘一个网页数据抓取与解析的场景,经过构造网络地址、下载页面、解析页面内容等一系列步骤,抓取了静态页面的内容,并下载了相关的图片数据。对于网页数据抓取与分析,数据专家中并没过多的特有节点,也仅提供了页面下载、解析等几个函数。然而网址和页面有其独特之处,同时它又是满足一定的格式的字符串,将它作为数据专家强大的字符串分析体系,网页数据抓取工作这一复杂的工作变得异常轻松。
案例中涉及三个特殊的节点:补充序列、行数据劈分和数据项转存。
补充序列节点与补全列节点很类似,它们都是在二维数据表的内容缺乏时,向流程中添加数据。区别在于,补充序列是向二维表中添加记录;而补全列则是向二维表中添加列,使流程中的字段完整,常用于数据结构的模型化入库。
行数据劈分与列劈分很类似,都是将已有的数据项劈出新的数据。不同是在对劈分后数据序列的存储上,行数据劈分节点生成多个记录;列劈分则是创建多个数据列,常用于表格文本的拆分。
数据项转存与保存为文件也非常相似,都是把流程中的数据保存到有磁盘上;数据项转存将二维表中一列数据中的数据项为储存单元,把数据列中的每一个数据项分别保存为文件;而保存为文件节点是以整个二维数据表为单元,把流程中的所有数据保存到一个文件。
仔细研究会发现,数据专家中有很多相似的节点,把数据流程看成一张二维数据,把这些节点理解为对二维数据表的一个特定操作,有的是以行为单元进行的操作,有的是针对列而言的,有的则是以整个表二维表为单元的,就很容易把他们区分开了。
网友评论