版权声明:本文由文智原创文章,转载请注明出处:
文章原文连接:https://www.qcloud.com/community/article/138css
来源:腾云阁 https://www.qcloud.com/communityhtml
大数据已是个很是热门的话题,文智平台正是基于大数据的背景,利用并行计算系统和分布式爬虫系统,结合独特的语义分析技术, 一站式知足用户NLP、转码、抽取、全网数据抓取等中文语义分析需求的开放平台。现有的研究、工程应用方向基本上都是围绕着大数据的存储、计算等方面展开,可是对于一个基础环节——数据获取却不多有相关的介绍。本文重点围绕如何获取垂直海量数据展开讨论。web
数据的做用不言而喻,在各行各业中,分门别类的数据为用户的在线生活体验提供了基本的素材,附近的餐馆、即将上映的电影、最近热门新闻等等可以涵盖咱们生活的方方面面。同时全部的这一切也成就了今天在各个垂直领域诸如大众点评、豆瓣、今日头条等专业的公司。具体到搜索业务来讲,不管是多么优秀的架构、精准的算法,最终也是须要依赖完备、准确、及时的数据做为落地基础。ajax
从搜索业务来看,数据的价值主要体如今以下几个方面:正则表达式
直接提供搜索数据源。海量的数据为检索提供了必不可少的素材。为此数据工做的一个基本目标是数据完备性。完备性能够从两方面来理解,一方面是实体自己的完备,是0和1的关系,这是刚性需求,例如你搜索《来自星星的你》,若是没有这部片子,那么结果显然不能知足用户需求;另外一方面是实体内部信息的完备,例如《来自星星的你》若是缺乏了演员字段,那么你搜索“金秀贤”的时候可能依然得不到想要的结果。另外要提的一点是完备性一般还对时间有约束,热点资讯、突发事件等若是不能在第一时间呈现,那么对于用户来讲都是个硬伤。算法
改善相关性质量。干净、精确的数据可使得在相关性计算阶段减小歧义,改善召回品质,互联网中的数据鱼龙混杂,各个网站的水平也是参差不齐,不作去噪直接使用的话每每会拔苗助长。经过高质量的数据补充,对最终结果的排序也有良好的辅助做用。例如豆瓣的影评分数、热度因子能够在视频搜索中辅助结果排序,而且能够改善数据刚上架时因为点击量缺失形成排序上不来这种冷启动的过程。浏览器
丰富搜索产品特性,知足搜索直达需求。当数据完备、及时、准确以后就能够对数据作关联聚合,在这个时候超越文本自己的各类语义特征、知识关联等一些高阶应用相继涌现,你们经常听到的Google的Knowledge Graph、Facebook的Graph Search以及百度知心搜索等都是创建在这一个基础之上。将散落在互联网上碎片化的知识整合起来造成直观答案显然是一种更“懂”你的方式。如图1,搜索王菲老公的体重,知识图谱搜索能够直接输出想要的结果。
图一、搜狗知识图谱搜索结果架构
整体而言,数据获取工做主要围绕快、准、全三个要素以及一个高阶的关联需求展开。本文重点分析数据如何发现、抓取、更新等方面作一个介绍。app
互联网中的数据参差不齐,如何从纷繁复杂的互联网中发现有价值的数据是一个有趣的问题。一般数据发现的过程当中存在几个难点:dom
数据海量,没法遍历穷举;
鱼龙混杂,须要甄别出高价值的数据;
存在死链、无效参数、做弊、陷阱等页面使得数据获取的过程当中存在各类坑。
问题3这里咱们须要结合不一样的场景作一些不一样的策略,通常在目标对象很清晰的状况下能够经过人工手段作一些规避,所以这里不展开讨论。咱们重点讨论1和2这种海量网页中发现高价值数据的问题,有了这个清晰的目标后,接下来就转换为另外两个问题:
从哪一个网站获取?
如何获得这个网站内有价值的连接?
通常的url都有一些显著特征,一般能够利用前面的方法2,利用大量的query到综合搜索引擎中作site检索获取大量同站点内url,这里基于一个假设就是搜索引擎能召回的数据都是亿万连接中尽可能有价值的展示给用户,召回的结果已经融合了用户点击、数据自己质量、站点权威等因子在这里,是一个综合权威的结果。获得同站点url后咱们能够分析其特征,对于一些显著特征占比的url能够认为是高价值连接的特征,例如百度百科http://baike.baidu.com/subview/(d+)/(d+).htm
和http://baike.baidu.com/view/(d+).htm
相似这种特殊的片断。在获得高质量的特征的url后能够对库内已经抓取的数据作连接分析,反转父链子链关系汇聚出一些能产生高价值数据的父链做为种子持续发现高价值数据。图5展现了经过库内连接关系能够分析出http://news.163.com/latest/
做为一个高质量种子页持续发现高价值数据。
图五、高质量种子页面
前面咱们介绍了如何获取有价值的url,获得url后一般须要将其抓取下来作后续的处理,若是量小可使用curl库或者wget直接搞定,这里面临两个比较大的问题:
为此,咱们须要一种爬虫引擎可以优雅、柔性的抓取,同时尽量模拟浏览器的行为,使得抓取的结果能尽量的完整。对于问题1能够有两种办法:
有效的压力控制,这里的压力是指单位时间内对目标站点的访问量,一是压力的计算须要根据对方站点规模(参考alexa排名)、pv量以及当前爬虫的规模作一个适当的计算,同时能够根据不一样时间段作合适的调整,例如晚上一般目标网站的pv小咱们能够适当提升咱们抓取压力;
提升出口代理,尽可能复用出口ip,因为外网ip的资源很是珍贵,须要提升出口ip的管理,按照运营商、地域、ip段进行分散管理,同时能够从外网获取一些公用的代理地址作补充。
对于问题2,则一般须要模拟浏览器的行为,研究浏览器js的解析、运行的一些行为,一般能够研究webkit作一些ajax异步拉取的填充,使得抓取的页面尽量的和浏览器中访问看到的一致,这里并不展开webkit引擎的开发使用。
在回答了前面这两个问题后,介绍咱们目前爬虫引擎的一个基本结构,主要由如下几部分组成:
access:接入模块,主要用于屏蔽多业务入口,在这里主要作屏蔽多业务入口,对外屏蔽后台各类处理逻辑,同时将url归一化后按照子域hash到对应的lcs模块中处理;
dns server和robots server:主要是存放请求dns解析的结果和robots解析的结果,采用key-value 的存储方式加上LRU淘汰策略,另外后台有逻辑按期更新。
lcs:引擎核心控制模块,控制了url下发的速度,lcs在收到请求后会先请求dns和robots,用以得到目标网站ip以及是否在robots范围内容许下载,对容许下载的url送入到排队队列中进行排队,同时对上游access发送的超额url作过载截断,使得系统知足压力控制,同时在这里对排队长度作必定的控制,下降排队时长,使得系统能够尽可能的知足实时抓取的需求。
cs:纯粹的抓取模块,负责处理抓取中存在的各类问题,例如死链、跳转、压缩解压、chunck接受等问题,同时带有webkit的解析引擎会负责模拟浏览器行为对动态页面作解析抓取。
主控master:负责各个模块心跳检测,配置下发等一些控制模块
整个系统是一个彻底无状态设计,尽可能多逻辑作简单,除了一些系统内必备的重试以外其他的出错尽可能在上层作重试。
图六、爬虫引擎结构
有了抓取的数据以后须要对原始网页中的信息进行有效信息的加工提取,源于部门多年技术积累,咱们对爬取的数据能够作两类抽取:
1.基于机器学习+规则实现的通用抽取方案,该方案经过预处理、Dom建树和css渲染等过程先对html进行dom解析,以后根据事先训练好的模型对网页进行分型操做,例如识别出新闻、论坛、小说等网页结构,最后根据文本长度、文本位置、标签名称等特征对网页进行分块抽取获得相关的信息。该方法是一个通用的解决方案,主要可以实现标题、正文抽取,网页结构分类等一些基础的抽取需求。对于通常常见的抽取服务便可知足需求。
图七、通用抽取部分抽取结果
2.基于url模板的结构化抽取方案,前面基于机器学习的方案只能知足通用的、相对粗糙的信息提取,没法对精准的字段作抽取。为此咱们提供一种精确到字段的结构化抽取的方法,该方法的主要思路是事先配置好须要抽取内容的模版(模版能够是正则表达式或XPATH),而后基于html进行精确的模版匹配,最后将匹配结果输出便可。这里主要的难点在于xpath的配置的便捷性以及后续一些噪音的处理过程,这里再也不展开赘述。
图八、结构化抽取结果
经过前面的步骤咱们能够完成数据的发现、抓取到入库,一般这个时候已经能够知足使用需求,可是对于影视类、知识类等数据经常是在更新变化的,对于此类数据为了保证数据的时新性、权威性须要进行不断的更新。更新的难点一般仍是因为库内的数量巨大,若是须要全量短期内更新的话在现有的资源规模基本上难以实现,一般主流的办法都是按照必定的策略作选取,选取出候选更新集作更新,以后再同步到全量数据集合中。
图九、数据更新
选取策略一般须要结合不一样的业务特性作不一样的策略。以视频为例,一般视频的剧集更新都是在必定的时间范围,国产剧集通常是天天凌晨24点,美剧则是周一周二,综艺则是周六周日。为此每次新抓取的数据都记录一个更新时间,经过分析库内连续剧集更新时间咱们能够推断出下一次更新的时间,那么咱们能够通过一轮大的选取,从全量数据中选取出当天可能会更新的数据,对这一批量小的数据进行更新。
图十、视频更新策略
另外对于一些剧集,各大视频播放网站正在热播的数据则须要作到分钟级别的更新,通常这种量比较小,可是因为热度很高,因此其更新频率须要作到更高,为此对于榜单数据,咱们经过分析抓取各垂直站点的热门榜单及分析微博数据,获得热门资源列表。
图十一、榜单数据
更新则主要是体如今两个方面:一是页面发生变化,例如字段发生更新等状况;二是页面失效,变成死链。页面变化更新一般例如电视剧追剧、app应用版本的升级相应的内容发生变化。通常这里从新走一遍以前结构化抽取的流程便可。对于页面失效、死链这种能够从页面展示形态区分为页面级死链和内容级死链。页面级死链能够经过http返回码404直接识别。对于内容级死链咱们一般有两个步骤同步进行验证:
经过前面这两个步骤基本能够完成一轮失效检测。为了进一步修正模型,提升失效置信度,咱们外加了一层人工抽样审核,而且将结果反馈到模型中,指导下一轮迭代运行。
图十二、失效检测
整体而言,对于一个垂直的数据获取平台咱们构建了以下的一个流程,主要分为下载发现、离线存储、抽取清洗三大块。调度发现包括了前面提到的页面发现、数据抓取、压力控制等内容,抓取后的数据主要由tbase、cfs等存储介质进行存储,以后咱们有一套结构化抽取平台和通用抽取平台对数据进行规整、关联聚合造成独立供业务使用的结构化数据。
图1三、垂直数据获取流程
数据抓取平台是咱们一个基础平台,后续咱们也会开放出相应的服务,而且持续对体验作优化,但愿咱们的服务可以更普遍的应用,为业务提供更大的价值。