自定规则的AJAX网页信息采集功能的设计
扫描二维码
随时随地手机看文章
引 言
当前在数据量庞大的互联网世界中,网络上的信息存在诸多问题。虚假信息、重复信息、广告干扰等这些信息往往都是冗余或者无用的信息,加上互联网技术的发展与AJAX 技术的兴起,许多站点从可维护性和增加用户体验的角度将数据与网页分离,通过AJAX 从数据库动态生成数据,而有用的信息往往存在于这些数据中,但搜索引擎无法直接搜索到AJAX 网页信息[1]。自定规则的动态网页信息能够采集AJAX 网页信息,并且用户可以自由选取网站并自定采集规则,功能垂直,目标专一,能够高效且快速地获取网页信息。
1 AJAX网页信息生成原理
据中国互联网中心统计,当前中国的网站有百分之四十多都是动态网站,几乎占据了中国互联网的半壁江山,而日常人们主要通过搜索引擎来获取自己感兴趣的信息,搜索引擎的核心之一是网络蜘蛛(Web Spider)。网络蜘蛛通过给定的起始页面按照一定的规则提取页面中的链接,直到没有链接,蜘蛛才停止提取[2]。这其中的过程仅仅解析了网页的源代码,却没有把网页信息写入网页源代码中,因此爬虫收集的只是没有加载动态信息的网页资源。当用户浏览动态网页时,首先在浏览器的地址栏输入网页的URL,向对应的服务器发送请求获取该 URL对应的页面,当获取到页面时,此时并没有获取到网页的信息,浏览器的JS(JavaScript)解析器会继续解析写在网页中的JS 代码,作为动态网页,数据通过页面中的JS 继续向服务器请求数据库中的数据,而传统的网络蜘蛛并没有执行这些后续请求,蜘蛛的功能仅相当于浏览器的第一个请求网页的动作,在浏览器中通过查看网页源代码可以看到一些AJAX 信息并没有显示在源代码中,而网页中能够显示信息, 正是由于浏览器中后续的JS 解析。该过程的原理图如图1 所示。
如图 1 所示,在该网页信息生成的过程中,只有当客户端请求到页面之后,再通过客户端中的JS 解析器解析网页中的JS 数据请求代码,才会从数据库请求数据并写入页面。
2 自定规则采集功能设计
根据前面所分析的原理可知,仅单纯的使用一个 get 请求来获取 AJAX 页面中的信息在原理上是不可行的,因为服务器端并不能解析JS 代码,只有在客户端才能解析,服务器端只能够将网页原封不动地返回给客户端,存在于网页源代码中的JS 数据请求并没有运行。作为一套信息采集系统,该系统的全部功能模块必须都放在服务器环境中,只有通过一个可以完全解析网页的引擎才能使服务器端解析JS 获取网页信息。经过摸索和查找,认为JS 的开源工具包 PhantomJS 可以完成该项功能。可以将PhantomJS 引擎存放于服务器端,通过服务器端语言来调用,这里使用PHP 语言。
2.1 自定规则功能结构的设计
属于一个网站的所有页面的结构基本类似,网站与网站之间的结构可以完全不同,也可以类似,但网页结构几乎不可能完全一样,即使存在轻微差别,也会导致一些信息的提取规则完全不同。因此一旦写死了某一个网站的提取规则,随着网站的改版,可能其中页面的结构发生了变化,仅HTML 标签名属性发生变化就会导致抽取规则的改变,因此用户自定规则能够很好地解决问题[3-8]。提取信息的规则写在JS 文件中, 除开 PhantomJS 函数,用户只需要写提取网站信息的DOM 规则。在前台设计一个用户上传规则和选取规则的功能,服务器端设定一个专门存放规则的文件夹,前台能够读取用户上传的规则,从而完成目标页面信息的提取。自定规则工作原理图如图 2 所示。
用户写入核心的DOM 规则上传到规则库。当用户需要使用该规则时,前台可以加载规则库中的文件,通过选取指定的文件,服务器将文件名传入PhantomJS 引擎中,接收网站的链接以目标网页进行信息提取,返回信息经处理后返回客户端。
2.2 PhantomJS与PHP通信
服务器中存放一个 PhantomJS 可执行文件, 称其为PhantomJS 引擎, 该引擎通过命令窗口运行一个JS 为后缀的文件,该文件中写入一些PhantomJS 的接口函数和网页链接以及信息提取规则。作为单纯的信息提取,JS 文件中的PhantomJS 接口函数是固定的,它们可以完成解析和加载网页,使网页内部的 JS 源代码完全执行。PHP 函数库中存在一个 调用可执行文件的函数 exec()。利用该函数调用 PhantomJS 可执行文件,PhantomJS 运行用户自定规则的 JS 文件,从而 进行动态信息的提取。例如 exec("chcp 65001 && cd /d f :/ phantomJS/phantomjs-2.0.0-windows && phantomjs sample.js
{$url}",$arr,$i),该语句表示通过 phantomJS 执行 sample. js 文件,传入页面的链接为 $url,返回的结果存入 $arr 中。 Sample.js 文件中的代码如下:
根据该代码可以提取图 2 中的价格信息,将对应的 URL 写入上面 exec 的 $url 中,得到图 3 所示的结果,由图 3 可知, 价格 5 799 能够被正确提取出来。提取结果如图 4 所示。
![自定规则的AJAX网页信息采集功能的设计](/images/21ic_nopic.gif)
结 语
本文提出了一种能够自定规则提取 AJAX 网页信息功能的设计,通过测试能够成功提取动态 AJAX 网页信息,相较于传统的网络蜘蛛,自定规则设计可以更好更贴合用户需求来对指定网站进行信息提取,避免了虚假网站的干扰和重复信息的冗余。相较于传统的dom 信息提取系统,该信息提取功能加入了 PhantomJS 包,能够提取传统dom 无法提取的动态信息,功能得到了加强。