基于Ajax的新闻网页动态数据的抓取方法及系统与流程

文档序号:11155558阅读:381来源:国知局
基于Ajax的新闻网页动态数据的抓取方法及系统与制造工艺

本发明涉及一种基于Ajax的新闻网页动态数据的抓取方法及系统。



背景技术:

目前,新闻网站的信息具有类别繁多,更新频率快,多平台发布的特点,数据的调取方式也十分灵活。很多新闻网站的页面都采用Ajax调用数据的方式,这样通过一个数据来源,可以在不同的平台进行解析,比如PC端网页和手机版网页可以共享一个数据请求,通过不同的模板来呈现出不同的排版样式。

在采集和抓取网络站点的新闻数据时,会发现很多网站数据是通过Ajax获取的动态内容,并没有一个固定的静态模板。获取数据的JavaScript脚本程序往往是在整个页面的DOM结构加载完之后才会执行。如果整个网页页面的DOM结构尚未加载完,网络爬虫访问此地的时候并不会获取到数据内容,这就大大降低了网络数据采集的效率和质量。

如果需要获取到通过Ajax请求动态加载的数据,就需要对网站的请求的数据源地址进行分析,Ajax调用的数据格式往往是JSON、JSONP、XML或Inc等格式。经过分析之后,不同网站采用的网络技术不同,所以调用Ajax请求时采取的方案也有很大差别,数据源存储的格式也是多种多样的。

通过对现有技术进行分析,发现目前并没有一个统一的自动化分析Ajax数据源的方法,已有的方法不能一次性解决所有的Ajax获取动态内容的问题。

首先,大部分的实现方法还是通过JavaScript脚本中的特征值来检索,从而进一步猜测和推断Ajax的请求内容。然而这样做并不能准确地找出想要采集的目的数据。当前来看,一个页面当中很可能包含多个Ajax请求,有些是关于用户信息认证的请求,有些是订阅信息的返回数据,还有一些广告推送信息。这些信息混杂在一起,只靠脚本代码中的特征值很难分辨出哪些是需要采集的数据源。另外,对脚本代码的特征值分析也只限于JavaScript代码没有加密的情况,现在很多站点基于安全性的和访问效率的要求,可能会对多个JavaScript脚本文件进行合并然后做加密处理,这样一来会使本来存在的特征值消失。

其次,Ajax的调用方式本身会存在跨域问题,这是它自身所特有的一种安全机制。即不在同一个域名下,使用脚本语言仍然无法成功执行请求并返回数据。在处理这样的调用方式时,因为不具备统一域名下的网络环境,就难以自动完成Ajax触发请求。还有一些站点在程序中会有反爬虫的程序,如果频繁访问会出现二维码等内容阻断新闻数据的继续采集。

最后,即便是找到了Ajax请求的数据源,也会存在格式和编码方式不匹配的问题。比如JAVA语言生成的JSON数据,PHP语言就无法直接处理。有些返回数据中会带有英文双引号与JSON格式本身的符号冲突问题。还有些请求采取的是JSONP的请求方式,即附带请求头的JSON格式。



技术实现要素:

本发明的目的就是为了解决上述问题,提供一种基于Ajax的新闻网页动态数据的抓取方法及系统,它把重点放在数据源的策略分析上,对不同的情况采取定制化的方案。

为了实现上述目的,本发明采用如下技术方案:

基于Ajax的新闻网页动态数据的抓取方法,包括如下步骤:

步骤(101):建立新闻网页爬取内容数据库,设置新闻网页爬取内容数据库的编码方式;获得待抓取新闻网页的新闻列表页面的URL地址;

步骤(102):访问待抓取新闻网页的新闻列表页面的URL地址,通过浏览器开发者工具判断新闻列表页面是否是通过Ajax动态加载数据的;如果是,通过浏览器开发者工具找到Ajax请求的数据源;如果不是,就结束;

步骤(103):判断Ajax请求的数据源和步骤(101)的编码方式是否一致,如果不一致,则对数据源进行编码转换,然后,进入步骤(104);如果一致,就直接进入步骤(104);

步骤(104):解析数据格式:将数据源的格式解析成为新闻列表页面的后台语言处理的对象格式或者数组格式;

步骤(105):将步骤(104)解析后的数据封装成对象或数组类型;判断封装是否成功,若成功就直接进入步骤(106);否则将数据作为字符串来处理;完成后进入步骤(106);

步骤(106):将数据对象或数组类型遍历输出列表;

步骤(107):利用网络爬虫采集步骤(106)得到的输出列表;

步骤(108):将采集到的数据存储到数据库中。

所述步骤(101)URL地址包括临时存在的URL地址、跳转地址、需要添加时间戳参数或者签名参数后访问到的URL地址。

所述跳转地址是指最终跳转的URL地址。

所述步骤(101)的新闻网页爬取内容数据库的字段包括:新闻标题、新闻发布时间、新闻爬取时间、新闻来源和新闻内容;

所述步骤(101)的新闻网页爬取内容数据库的编码方式包括:UTF-8的编码方式或GBK编码方式;

所述步骤(102)的浏览器开发者工具包括:谷歌浏览器开发者工具。

所述步骤(103)如果Ajax请求的数据源存在特殊字符或者乱码,则把特殊字符或者乱码进行批量替换,转换成为可以进行处理的字符。

所述特殊字符包括:斜线、反斜线、冒号、星号、问号、引号、大于号、小于号或竖线符号等可能对JSON格式产生影响的字符。

所述可以进行处理的字符例如:中文引号、中文逗号、中文冒号等。

步骤(103):如果编码方式不同,则将编码方式统一,统一采用UTF-8的编码方式。

所述步骤(102)和步骤(103)之间设有步骤如下:

步骤(1020):如果Ajax请求是跨域请求,则通过PHP的CURL方式模拟来路页面,并通过host来获取请求数据地址;

所述步骤(1020)通过PHP函数修改Referer来模拟在一个域名下进行请求,可以获得请求数据地址返回来的结果,从而解决了跨域请求没有权限获取数据的问题。

步骤(1021):如果Ajax请求是POST请求,使用PHP语言http_build_query函数来模拟HTTP的POST请求,以便获取到POST请求返回的数据。

步骤(1022):如果无法获取数据内容,则通过PHP的CURL来伪造来路页面对Ajax请求的数据源进行访问。

所述步骤(104)闻列表页面的后台语言包括JAVA,C++、PHP。

所述步骤(104)的步骤如下:

步骤(1041):如果数据是JSON格式,则直接进入步骤(105);

步骤(1042):如果数据是JSONP格式,则进行过滤处理;所述过滤处理是将JSONP格式数据的请求头及括弧剔除,然后进入步骤(105);

步骤(1043):如果返回的内容中出现中英文单双引号使用不规范的问题,则通过PHP语言的字符替换函数进行过滤,将特殊字符替换为空字符。

所述步骤(1042)的JSONP是JSON格式的一种使用模式,通常用来进行跨域调用时使用。因为要对请求做出标识,通常会带有一个callback的参数作为请求头,使用引文半角圆括号将JSON内容包裹起来。JSON格式为带请求头的JSON格式。然而在JSON格式解析中,需要将其去掉才可以成为标准的JSON格式。基于上述原因,需要将返回内容的请求头及括号剔除掉。

所述步骤(1043):因为有些特殊字符会影响格式的规范,有些特殊字符则不能够被识别,所以在封装数据之前,要对这些特殊字符进行处理,即把它们批量替换成空字符。

所述步骤(105):

如果步骤(104)解析后的数据不是键值对类型,则将步骤(104)解析后的数据封装成为数据对象,

如果步骤(104)解析后的数据是键值对类型,则将步骤(104)解析后的数据转换成为数组类型。

所述步骤(105)将数据作为字符串来处理:

利用PHP语言的字符串分割函数对字符串的特征值进行分割,利用字符串拼接函数对字符串的特征值进行拼合,最终形成格式规范的数据;

解析后的数据是一个新闻数据的集合,包含了多篇新闻数据,所述特征值是指步骤(104)是每一篇新闻数据之间的分割字符。例如,在JSON格式中采用引文半角的逗号来分割。

如果不是通过逗号来分割,则分析数据找到数据单元的分割符号来进行处理,并把分割符号更新到特征值库中。特征值需要不断积累才能提高对各种类型数据特征值分隔符的识别程度。

所述步骤(106)相当于通过解析需要抓取的新闻列表页面的请求数据源在自己的服务器上面重新还原了新闻网页。因为这个新闻网页并不是Ajax调用的,而且是在自己的服务器中,不存在跨域问题或者请求数据的脚本程序在网页DOM结构加载后执行的问题,网络爬虫可以进行采集。

所述步骤(106)的输出列表包括:新闻标题、新闻发布时间、新闻爬取时间、新闻来源、新闻内容和新闻链接。

基于Ajax的新闻网页动态数据的抓取系统,包括:

数据库建立模块:建立新闻网页爬取内容数据库,设置新闻网页爬取内容数据库的编码方式;获得待抓取新闻网页的新闻列表页面的URL地址;

访问模块:访问待抓取新闻网页的新闻列表页面的URL地址,通过浏览器开发者工具判断新闻列表页面是否是通过Ajax动态加载数据的;如果是,通过浏览器开发者工具找到Ajax请求的数据源;如果不是,就结束;

判断模块:判断Ajax请求的数据源和步骤(101)的编码方式是否一致,如果不一致,则对数据源进行编码转换,然后,进入步骤(104);如果一致,就直接进入步骤(104);

解析数据格式模块:将数据源的格式解析成为新闻列表页面的后台语言处理的对象格式或者数组格式;

封装模块:将解析后的数据封装成对象或数组类型;判断封装是否成功,若成功就直接进入输出模块;否则将数据作为字符串来处理;完成后进入输出模块;

输出模块:将数据对象或数组类型遍历输出列表;利用网络爬虫采集得到的输出列表;将采集到的数据存储到数据库中。

本发明的有益效果:

本方案可以解决Ajax等动态生成内容的多种复杂情况的采集问题,包括跨域调用,加密脚本数据源。另外本方案不仅仅适用于各种复杂网页新闻的采集,可以应用到微信数据的采集和处理。

附图说明

图1为本发明的方法流程图;

图2为本发明的功能模块图。

具体实施方式

下面结合附图与实施例对本发明作进一步说明。

如图1所示,首先需要通过开发者工具的网络请求探测的XHR(XMLHttpRequests)和JavaScript来监听数据源地址。通过获得数据源地址来判断Ajax请求的模式。

如果是能够直接解析的JSON格式,则直接进行数据封装处理,但实际情况中会遇到如下问题:

情况一:如果是JSONP格式,则需要通过请求头过滤器把请求头过滤掉;

情况二:如果返回格式中存在乱码,则需要通过转码处理模块进行转码处理;

情况三:如果返回格式中出现中英文单双引号使用不规范和乱码问题,需要经过特殊字符过滤器进行过滤;

情况四:如果是跨域请求,则需要通过php的cURL方式来模拟来路页面和host来获取请求地址的返回数据。

情况五:如果请求方式是POST请求的,还要使用php后台语言的http模块进行模拟POST请求

情况六:如果Ajax动态生成内容的网页采用了一些反蜘蛛技术也可能导致无法获取数据内容。需要通过PHP的CURL来伪造来路页面进行访问。

经过一系列处理,仍不能对数据进行够转换封装的,就说明返回数据的格式与后台语言的格式不相匹配。只能够将返回数据作为字符串来处理,通过特征值对数据进行分割和拼合,形成格式规范的数据。

关于特殊字符过滤和特征值库的建立除了基本的常规过滤还需要在实践中不断积累和补充。在数据抓取的过程中,还有一些链接是动态的或者是跳转链接,这些链接有可能是临时存在的,需要通过解析器的函数进行预加载处理,把生成的静态链接输出到列表页当中。

可以用后台语言对这些存储格式进行结构解析,封装成为对象或者集合类型,然后遍历输出成为列表存储到服务器某个地址。这样一来可以继续采用网络爬虫对生成的列表地址进行采集,也可以直接导入到数据采集的库中

Ajax抓取内容的主要架构如图2所示。

采集器负责采集站点数据和经过解析生成的新闻列表页面,针对不同情况(上文提到的情况一至情况六)来选择采集方案。这样根据不同情况进行来采集更有利于对不同类型的数据更加精细化的采集,大大提高了爬虫采集数据的效率和准确率。

数据过滤器主要是根据在实际运行中遇到的不同的情况进行格式统一化的过程,包括前面所提到的数据字符集的编码转换,特殊符号的过滤,字符串的规范化处理。

解析器负责处理站点访问的数据源,把JSON,XML等格式解析成为可以存储和读取的数据库格式。主要是通过分析数据地址的数据结构来进行聚合数据的工作。

数据封装模块负责把解析的数据封装成对象通过程序把数据遍历输出生成列表页。

上述虽然结合附图对本发明的具体实施方式进行了描述,但并非对本发明保护范围的限制,所属领域技术人员应该明白,在本发明的技术方案的基础上,本领域技术人员不需要付出创造性劳动即可做出的各种修改或变形仍在本发明的保护范围以内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1