APP下载

基于页面集的异步刷新页面爬取技术研究

2020-03-02张萌

科技创新导报 2020年24期
关键词:网络爬虫

张萌

摘  要:对于网络爬虫来说,页面都是“静态”的。在实际的HTML页面中,静态的数据很少,并且很多数据通常通过异步刷新的方式填充到页面中。如何在静态页面中捕获异步刷新填充的数据是网络爬虫研究的关键。为了解决异步刷新获取的问题,多个相互关联的HTTP请求被合并,并加以解析。此外,进一步提出了页面集的概念,即对需要抓取的数据进行归类,将同一被抓取的链接中所有的请求链接归在同一个集合中进行处理,使得数据的层次更清晰。

關键词:网络爬虫  静态页面  请求  异步刷新  页面集

中图分类号:TP393                              文献标识码:A                      文章编号:1674-098X(2020)08(c)-0127-03

Abstract: For web crawlers, the pages are all "static". In actual HTML pages, there is very little static data, and a lot of data is usually filled into the page by asynchronous refresh. How to capture asynchronously refreshed and filled data in static pages is the key to web crawler research. In order to solve the problem of asynchronous refresh acquisition, multiple interrelated HTTP requests are merged and parsed. In addition, the concept of page set is further proposed, that is, to classify the data that needs to be crawled, and to process all the requested links in the same crawled link in the same set for processing, so that the data hierarchy is clearer.

Key Words: Web crawler; Static page; Request;Asynchronous refresh; Page set

网络爬虫[1]是一种计算机程序或自动脚本,可根据人们设置的规则自动获取或下载网络信息。使用网络爬虫来采集信息,对数据进行一定的过滤后,利用大数据分析,能够总结经验、发现规律、预测趋势、辅助决策。它不仅可以充分利用和释放海量数据资源所包含的巨大价值,而且可以促进新一代信息技术与各行各业之间的深度耦合和交叉创新[2]。

传统的网络爬虫存在着一定的局限性,本文在开源网络爬虫框架WebMagic的基础上,对异步刷新页面内容的抓取进行研究,拟提出页面集的概念,使得网络爬虫可以高效、平稳地运行,从而提高网络爬虫的采集效率,降低运维成本。

1  异步刷新页面的研究

1.1 目前爬虫存在的问题

当前,网页中大多数有用的数据都是通过Ajax来动态获取的,还有一些Ajax的请求参数是依赖于JavaScript动态生成的。JavaScript可以执行的某些操作,是爬虫程序很难甚至不能模仿的[3]。实际上,这些弊端是由搜寻器不是浏览器并且没有JavaScript解析引擎引起的。为了解决这个问题,主要的应对策略是将JavaScript引擎引入网络爬虫。但是,这样做有明显的缺点。例如,当服务器同时执行多个爬取任务时,将会浪费太多的资源。另外,这些无窗口的JavaScript引擎通常不用作浏览器环境。当页面内有跳转时,将使过程难以控制[3]。

1.2 页面集

传统获取异步刷新页面的方案是:爬虫取得URL之后,交给无头浏览器渲染。这种方法处理起来比较简单,但是也存在性能的问题。页面集是本文提出的一个新的概念,即对需要抓取的数据进行归类,将同一被抓取的链接中所有的请求链接归在同一个集合中进行处理[4],使得数据的层次更清晰。

当种子URL中存在接口异步刷新的数据,且需要建立多层级联任务时,解决方案如下:

(1)通过网页调试工具postman向系统发送前端请求。

(2)当构建级联任务时,对新的待下载URL进行分析。当系统判断出待下载URL中包含特定的标签时,表示该URL包含接口异步刷新的数据。从待下载URL中提取对应接口参数的值,作为下一层级联任务的起始请求参数[5]。

(3)在下一层级联任务中,根据baseUrl和步骤(2)中系统解析出的接口参数,可以获得第二层级联任务的接口异步刷新数据。更多层的级联任务,均以此类推。

(4)将来自同一个父任务的链接,通过for循环批量获取接口参数。并且,批量构造任务提交到待下载队列中。

(5)采用rootJobId、parentJobId和jobId这三个参数,记录链接之间的级联关系以及构造页面集。算法流程见图1所示。

当请求传递到持久化模块时,对任务的执行采取的是责任链模式。对本系统来说,将不同类型的接口定义为不同的处理节点,使用parallelStream()遍历责任节点,并发地执行每个责任节点。

2  对比实验

为了对比页面集的抓取效率和无头浏览器的抓取效率,现将级联深度分别定为3和4,对同一个URL进行抓取。

当级联深度为3时,无头浏览器的抓取时间是4min3s,而页面集的抓取时间仅需2s。当级联深度为4时,采用无头浏览器进行抓取时,内存几乎被占满而导致无法继续执行下去,需要通过限制最大同时打开窗口数来解决此问题。这种方式的弊端是限制了无头浏览器的并发量。

无头浏览器最大的弊端,就是依赖于浏览器,且非常耗资源,严重影响了整体的并行抓取能力。而页面集是纯服务接口级抓取,吞吐量极高,不会随级联深度的增加导致服务性能下降。

3  结语

本系统仅以京东的商品链接为例,进行接口异步刷新数据的抓取。因为不同的网站HTML的参数不尽相同,无法用统一成一种相同的格式。针对不同的网站,进行接口异步刷新数据的抓取时,需要根据用户的需求进行定制化修改。而且,一个京东商品链接中,纵向的相关商品链接与横向的相关商品链接的接口都不相同。也就是说,当我们对京东商品链接进行数据抓取时,首先要分析一个HTML页中,有哪些数据是由接口异步刷新填充的。其次,要分析这些接口是不是同一种接口。如果不是同一种接口,该如何获取每一个接口异步刷新的数据。本系统针对不同的接口采取了不同的抓取数据的方式,是否能将不同的接口采用更简化的方式进行数据的抓取,仍是今后需要讨论研究的问题。

本系统的优势在于,遇到不同的网站,只需要分析该网站的异步接口请求参数,扩充处理节点即可[6]。这种方式的好处在于程序的延展性好,避免了针对不同风格的网站开发相应爬虫的繁琐工作,节约了资源的同时使系统易于维护。

參考文献

[1] Kevin.网络爬虫技术原理[J].计算机与网络,2018,578(10):41-43.

[2] 张鹏.工信部解读《大数据纲要》:推动信息技术与传统产业深度耦合、交叉创新[J].通信世界,2015(25):5.

[3] 沈春泽,李加庆.“放下你手里的代码”:爬虫技术的善与恶、罪与罚[EB/OL].(2019-10-29).https://www.chinaz.com/news/2019/1029/1058770.shtml.

[4] 欧阳春.支持动态网页解析的分布式网络爬虫系统的设计与实现[D].南京:东南大学,2017.

[5] 马蕾.分布式爬虫技术研究与实现[D].抚顺:辽宁石油化工大学,2019.

[6] 樊宇豪.基于Scrapy的分布式网络爬虫系统设计与实现[D].成都:电子科技大学,2018.

猜你喜欢

网络爬虫
炼铁厂铁量网页数据获取系统的设计与实现