随着大数据时代的到来,一个大规模生成、分享、处理以及应用数据的时代正在开启。如果能将互联网上异源异构的非结构化或半结构化数据转换为更易处理的结构化数据,可以极大的降低获取数据的门槛,为信息检索和数据挖掘提供基础,更好的挖掘数据中蕴藏的价值。
单纯考虑网页这种半结构化数据的抽取:对于搜索引擎一般需要抽取出页面的标题、实际标题、时间、正文等关键信息;而对于去哪儿、携程这种酒店预定网站则需要进行更精细化的信息抽取,需要抽取出酒店名称、地址、电话、价格、评分、简介等具体属性。
可以看到,大量互联网产品都依赖抽取功能,因此迫切需要一个方便、便捷、高效且准确的网页抽取平台。
目前针对html这种半结构化的页面,业界比较流行的抽取方法大致就两类:dom树分块以及模版抽取。
该方法的基本思想就是对html页面建dom树后,对dom树进行遍历,同时根据事先训练好的分类模型判断遍历到的容器节点的语义块类别,本质上就是分类问题。比如对新闻网页,一般定义的语义块类别有标题、实际标题、时间、正文、相关推荐、相关阅读、版权、广告等。如果用分类模型进行语义块判断,需要用事先标注好的样本进行训练。采用的特征集合包括该节点下的文本长度、特定关键词命中情况、标点符号个数、图片个数、标签宽度、各种html标签的分布情况等等。
通过模型预测节点的语义块类别会有几个候选,整体上会得到若干语义块组合序列,最后可以再用语言模型的思路得到一个最优序列。
该方法的优点是通用性强,主要工作包括定义新类别页面的语义块类别、样本标注、训练模型、抽取程序,一般用于大规模网页的处理;缺点是一般抽取到的语义块比较粗,精度不高。另外样本标注也需要大量的人力成本和时间成本。
针对下面这个页面
图2.1 豆瓣电影详情页
我们希望抽取导演、编剧、主演、类型、语言、上映日期等字段的信息, dom树分块的方法就不太适用了。因为这块区域整体上属于一个容器节点,子节点的特征方面区分度也不大。
因此有了第二类抽取方法:模版类抽取。该方法的基本思想很简单:事先配置好需要抽取内容的模版,模版可以是正则表达式或XPATH, 然后基于html进行精确的模版匹配,将匹配结果输出。该方法的优点是可以实现精细化抽取,缺点是模版的配置和维护成本较高。如正则抽取比较依赖页面中的wording,把wording作为桩,提取出桩周围的有用信息,因此对配置人员的正则能力要求比较高。
精细化抽取现在业界采用比较多的是XPATH,XPATH作为XML文档路径标准语言,通过路径表达式来定位与查找XML文档中的节点。使用XPATH进行精细化抽取的优点有:
(1)很多主流的浏览器都提供获取指定节点XPATH路径的功能,或者可以通过嵌入的JavaScript代码从DOM中获取XPATH路径,因此易于实现可视化配置,降低配置门槛。
(2)XPATH依赖页面DOM结构。而实际上一个网站或者一个子域下的页面结构确实大体一样,或者基本可以穷举,因此配置一组XPATH往往可以覆盖一个子域甚至一个站点下的页面。
(3)作为XML标准集下的一个重要标准,XPATH被广大厂商接受并推广,已经有很多开源且成熟的实现,因此更易得到社区的广泛支持。
本篇重点介绍我们在XPATH模版抽取方面做的工作,包括如何使配置简单化、如何对抽取的结果进行去噪、如何维护模版的更新、如何快速接入抽取等等;
在开始介绍抽取平台之前,先看看刚才那个豆瓣页面我们的抽取效果:
图2.2 豆瓣电影详情页抽取结果
系统分为配置管理、XPATH抽取以及去噪处理三个主要模块:
(1) 配置管理:负责配置的管理、更新与分发。
(2) XPATH抽取:根据配置的XPATH抽取页面中指定的属性。
(3)去噪处理:对抽取的结果做去噪处理。
图3.1 抽取平台整体框图
为了降低配置门槛,做到人人可配、人人会配,因此在设计和实现模板配置的UI和交互的过程尽量做到简洁明了、轻量级、引导式交互、及时响应等原则。
图3.2 XPATH配置页面
整个抽取过程比较简单,因此直接使用流程图来说明抽取过程。
图3.3 XPATH抽取流程
虽然XPATH的抽取能精确到元素粒度,但很多时候仍然有大量的噪音存在。为此,我们提供了四个方面的噪音过滤规则:
(1)文本规则:通过配置正则表达式将属性值中的噪音去除。
(2)URL规则:针对链接元素,通过配置URL规则,将href属性不满足URL规则的节点过滤掉。
(3)元素属性规则:通过配置标签的属性规则进行噪音过滤。
(4)html规则:通过配置起始串与结束串,将html中以起始串开始,以结束串终止的子串过滤掉。
图3.4 噪音过滤规则配置页面
在实现的过程中,发现有一类属性的属性值是一个List,List内元素之间是并列的。比如专辑《吻别》页面中,名称、歌手、发行时间等字段属于普通属性,但专辑下的曲目则属于List类型的属性。
图3.5 百度音乐专辑页
List元素XPATH有以下特点:拥有一个相同的祖先节点,从该祖先节点开始节点名称、层次以及深度都完全相同,并且在某个或某几个层级上是平行关系(偏移不一样)。上述专辑页中任意两首歌曲的XPATH即满足该特点:
《恋爱的人都一样》:/html/body/div[4]/div/div/div[4]/div/div[1]/div[2]/div[2]/div/ul/li[8]/div/span[5]/a
《拥抱阳光》:/html/body/div[4]/div/div/div[4]/div/div[1]/div[2]/div[2]/div/ul/li[9]/div/span[5]/a
根据这一特征,为了更好的表达和抽取这类属性值,我们将上面歌曲属性的XPATH虚化为: /html/body/div[4]/div/div/div[4]/div/div[1]/div[2]/div[2]/div/ul/li[%d]/div/span[5]/a
其中%d作为占位符,抽取匹配的时候会具体化为实际的数字。
List属性的抽取流程为:
图3.6 List属性抽取流程
平台经过近一年的持续迭代和运营,各项指标趋于稳定;平台的稳定性和可靠性得到验证;运营工具趋于完备,监控告警也基本做到全方位无死角。下面从三个方面来说明:
(1)运营指标:各项指标都在稳步上升,数据质量也在持续提高。数据在Qzone资讯推荐、QQ音乐搜索以及部门内数据挖掘类需求中得到应用,数据质量经受住了业务的考验。
最近两周系统主要运营指标如下,可以看到各项指标稳中有升,系统的运营状况良好。
日期 | 站点数 | URL模板数 | XPATH模板数 | 网页数 | 抽取成功数 | 成功率 |
---|---|---|---|---|---|---|
2014-10-23 | 179 | 1159 | 2914 | 57,345,499 | 52,545,262 | 91.63% |
2014-10-27 | 183 | 1168 | 293158,736,758 | 53,096,224 | 90.40% | |
2014-11-03 | 203 | 1295 | 3069 | 68,272,962 | 62,444,849 | 91.46% |
表3.1 平台运营指标
(2)运营工具:提供了下载诊断与查询、快照查询、抽取检查、标准集验证、模板评测、抽样验证、抽取诊断等一系列的运营诊断工具。从配置、下载、快照、抽取到最终数据等环节都力争做到可运营。
(3)监控告警:结合一年以来暴露的运营问题,不断丰富对抽取各项指标的监控,提高系统的可用性和可靠性。目前主要告警有整体抽取失败报警以及模板抽取成功率跌幅超过阈值报警。
通过上面的XPATH抽取平台,我们已经具备将互联网上大部分网页转换为结构化数据的能力。但是对于互联网上存在的“暗网”数据,由于其自身的特殊性,需要专门设计和优化我们的下载和抽取系统,下面主要介绍我们在这方面的思考和解决方案。
WEB2.0时代,随着用户对WEB应用的体验要求越来越高,大量相关技术应运而生,特别是AJAX技术的兴起,使得WEB应用的用户体验接近客户端类的体验,因此被业界广泛采用。这类应用的架构大体是这样的:
图4.1 AJAX请求流程
这类富WEB应用对于用户来说比较友好,却对信息检索提出了考验。现今的搜索引擎爬虫大部分还是基于页面之间的链接关系,但对于这种无法通过超链接扩散以及抓取的动态网页,则无法被搜索引擎收录, 因此形成所谓的“暗网”。
另外,随着移动互联网的兴起,信息出现了多元化、异构化及碎片化的趋势。大量数据从WEB端向移动端转移,甚至有很多数据就是为移动端而生的。这类数据的典型特点是,通过常规的页面链接无法获取,形成一个一个的信息孤岛。为了解决数据获取问题,业界主要从下面两个方面入手:
(1)开发更强大的爬虫系统,以应对信息的孤岛化。从相关新闻可以看到:百度针对搜索引擎的升级和更新中,很大一部分与解决“暗网”问题有关。
(2)与“暗网”网站合作,数据厂商通过平台方开发的API提交结构化的数据,来达到信息的互联互通。像google前不久推出的应用内搜索,就是通过这种方式试图打破信息壁垒。
通过大量的案例分析,发现存在两个方面的问题:
(1)下载扩散
对于常见的网页,我们可以通过页面之间自然的链接关系被爬虫抓取,但是这类暗网页面往往无法通过正常的链接关系获取,接口之间是独立的。因此要扩散到这类动态接口,必须通过特殊的规则生成它们。这里我们归纳并抽象了一类特殊的模板类型:链接工厂模板,该模板是专门用来生产URL的。根据URL中可变的参数,在类型下我们会预定义n个属性参数。然后通过定义一个URL拼接规则,将链接工厂类页面中抽取出来的属性填充到URL拼接规则中,生成最终的数据接口URL。
整个URL生成流程如下:
图4.2 URL生成与扩散流程
(2)抽取
我们的抽取平台是基于XPATH的, 因此对于接口数据格式为XML的异步HTTP请求,我们只要通过上面的方法生成并下载便能进行抽取。但在富WEB应用中JSON已经成为广泛采用的数据格式,为了接入上面的抽取框架, 这里我们采用的是将JSON数据转换成XML格式的方法,然后使用XPATH进行抽取。
图4.3 JSON数据抽取
可以看到,上述对暗网页面的下载与抽取比较好的适配在原有框架里,仅仅增加了一种链接工厂模板用于链接扩散,以及在抽取环节增加了一个数据类型转换的适配器模块。
在Qzone资讯推荐项目开发及运营的的过程中,发现今日头条新闻列表页都是采用AJAX的方式加载的,通过抓包以及分析源码发现,今日头条推荐频道的数据接口地址为:
http://www.toutiao.com/api/article/recent/?category=__all__&count=100&max_behot_time=(time_stamp).00&offset=0&utm_source=toutiao
图4.4 今日头条推荐频道异步HTTP请求
图4.5 今日头条发起异步HTTP请求的JS代码
该接口是JSON格式的接口,而新闻详情页的URL为JSON中的一个字段,如图所示:
图4.6 今日头条JSON数据字段详情
我们将JSON转换为XML文档,转换后的结果为:
图4.7 转换为XML的今日头条接口数据
标红的部分即为新闻详情页的URL,可以通过正常的XPATH抽取出来,然后将该URL推给下载系统下载。通过这种特殊的扩散方法,今日头条的新闻才得以被下载系统下载,进而通过XPATH进行抽取。
未来希望在以下几个方面进行改进和优化,使得结构化抽取平台越来越完善。
同时欢迎有需求的团队联系我们,使用腾讯文智自然语言处理。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。