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

优采云 发布时间: 2021-12-09 09:10

  抓取网页新闻(

本发明涉及一种基于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);

  Step(106):遍历数据对象或数组类型的输出列表;

  Step (107): 使用网络爬虫采集 step (106)获取输出列表;

  步骤(108):将来自采集的数据存入数据库。

  步骤(101) URL地址包括临时URL地址、重定向地址和添加时间戳参数或签名参数后访问的URL地址。

  重定向地址是指最终重定向的URL地址。

  步骤(101),新闻网页抓取内容库的字段包括:新闻标题、新闻发布时间、新闻抓取时间、新闻来源、新闻内容;

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

  本步骤(102))的浏览器开发工具包括:谷歌Chrome开发工具。

  在步骤(103)中,如果Ajax请求的数据源中存在特殊字符或乱码,则批量替换特殊字符或乱码,转换为可处理的字符。

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

  可以处理的字符有中文引号、中文逗号、中文冒号等。

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

  步骤(102)和步骤(103))之间的步骤如下:

  步骤(1020):如果Ajax请求是跨域请求,通过PHP的CURL方式模拟传入页面,通过主机获取请求数据地址;

  步骤(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语言的字符替换功能过滤,将特殊字符替换为空字符。

  step(1042) JSONP 是JSON格式的一种使用方式,通常用于跨域调用。因为要对请求进行身份识别,通常会在请求头中收录一个回调参数,包裹带引号半角括号的JSON内容,JSON格式是带请求头的JSON格式,但是在JSON格式解析中需要去掉,成为标准的JSON格式,基于以上原因,有必要返回 Remove 请求标头和括号的内容。

  步骤(1043): 因为有些特殊字符会影响格式规范,有些特殊字符无法识别,所以在封装数据之前,必须对这些特殊字符进行处理,即批量替换。空字符。

  步骤 (105):

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

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

  步骤 (105) 将数据视为字符串:

  使用PHP语言的字符串切分函数对字符串的特征值进行切分,并使用字符串拼接函数将字符串的特征值组合起来,最终形成规范格式的数据;

  解析出来的数据是一组新闻数据,包括多条新闻数据,特征值指的是步骤(104)为每条新闻数据之间的分隔符。例如JSON格式使用半角逗号分隔引文。

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

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

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

  一个基于Ajax的新闻网页动态数据采集系统,包括:

  建库模块:建立新闻网络爬取内容库,设置新闻网络爬取内容库的编码方式;获取要爬取的新闻网页的新闻列表页的URL地址;

  访问模块:访问要获取的新闻页面的新闻列表页面的URL地址,使用浏览器开发工具判断新闻列表页面是否通过Ajax动态加载数据;如果是,通过浏览器开发者工具Source找到Ajax请求的数据;如果没有,结束;

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

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

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

  输出模块:遍历数据对象或数组类型的输出列表;使用网络爬虫获取的输出列表采集;将采集收到的数据存入数据库。

  本发明的有益效果:

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

  图纸说明

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

  图2是本发明的功能框图。

  详细方法

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

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

  如果是可以直接解析的JSON格式,则直接进行数据封装过程,但在实际情况下会遇到以下问题:

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

  情况二:如果返回格式有乱码,需要使用转码处理模块进行转码处理;

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

  情况四:如果是跨域请求,则需要通过PHP的cURL方法模拟传入的页面和主机,获取请求地址的返回数据。

  情况五:如果请求方式为POST请求,则必须使用php后台语言的http模块来模拟POST请求

  情况六:Ajax动态生成内容的网页如果使用了一些反蜘蛛技术,也可能导致数据内容不可用。需要 PHP 的 CURL 来伪造访问页面。

  经过一系列的处理,数据仍然无法进行转换和封装,这意味着返回数据的格式与后台语言的格式不匹配。只能将返回的数据作为字符串处理,通过特征值对数据进行分割组合,形成具有标准化格式的数据。

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

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

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

  采集器负责采集站点数据和分析后生成的新闻列表页面,针对不同情况选择采集方案(上述情况一到情况六). 这是基于在不同情况下,采集更有利于对不同类型的数据进行更加精细化的采集,大大提高了爬虫采集数据的效率和准确率。

  数据过滤主要是根据实际操作中遇到的不同情况统一格式的过程,包括上述数据字符集的编码转换、特殊符号的过滤、字符串的标准化等。

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

  数据封装模块负责将解析后的数据封装成对象,通过程序遍历数据生成列表页面。

  以上虽然结合附图对本发明的具体实施例进行了说明,但并不用于限制本发明的保护范围。本领域技术人员应当理解,基于本发明的技术方案,本领域技术人员不需要做出创造性的努力。可以做出的各种修改或变化,仍在本发明的保护范围内。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线