杜润泽 梁英 方英兰
摘要:随着网页编写技术的不断发展与进步,异步加载技术得到了广泛的应用,如何高效完整的获取异步加载数据显得极为重要。以知乎话题和上交所股票信息为研究对象,利用爬取异步加载时的json请求地址和webdriver模拟网页浏览,设计爬取网页异步加载信息的框架和流程,实现异步加载信息的采集技术,对比采集的速率以及采集到内容的完整性。实验表明,可以使用基于json请求构建的信息爬取方法高效获取普通网页信息,使用基于webdriver的动态信息爬取方法完整的获取社交网站信息。
关键词:网络爬虫;动态网页;异步加载;数据采集
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2018)24-0223-03
根据2018年1月发布的第41次中国互联网发展状况统计报告,动态网页的数量占中国网页总数的24.4%,年增长率为6%[1]。由于动态加载技术具有无须重新加载整个网页便能够更新网页的特性,因此动态网页具有交互性好,用户等待时间短,服务器负载小等特点。现如今最火的社交网站和电商网站,更是离不开动态网页的应用,动态加载技术的应用已经遍布网络的每个角落,纵观所有应用“更好的用户体验”是其共同目标,动态网页的是网页发展的趋势[2]。
动态加载技术的蓬勃发展和广泛应用在改善用户体验的同时,也对于以静态页面分析为主的传统网页 爬虫提出了新的挑战。首先,Ajax 等动态技术的应用,导致传统络爬虫无法获取动态站点中的所有页面,无法充分利用网页数据;其次,基于静态页面分析的传统爬虫难以还原浏览器渲染生成的动态页面,为信息的提取增加了困难[3];同时,反爬虫技术的应用也对传统网络爬虫的发展提出了挑战。时永坤[3]等总结了通过WebDriver爬取异步加载网页的方法。但是由于通过WebDriver爬取动态网页信息的过程中需要通过WebDriver打开网页,因此效率较低,很多情况下具有更优的数据采集策略。
针对上述問题,本文以上交所股票信息和“ 知乎-今日最热”的话题信息为例,设计了一套应用范围较为广泛的定向网页爬取策略。上交所股票信息代表的是反爬机制不强,不需要登陆的非社交网站上通过ajax技术异步加载出的信息。而“知乎-今日最热”的话题信息则代表的是反爬机制完善,常常从api获取信息,大量信息需要登录才能访问的社交网站上通过ajax异步加载出的信息。因此本方法覆盖了大量需要定向爬取网页上异步加载信息的情况。
1 动态网页数据爬取策略
动态网页的创建源于Ajax技术的应用。Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。Ajax技术可在不重新加载整个网页情况下,通过后台与服务器进行少量数据交换,实现网页某个部分的异步更新。Ajax技术可以减少网络传输流量,提高用户体验度。
Ajax技术的应用十分广泛。由于 Ajax页面是由客户端浏览器执行脚本代码动态生成[4]。 因此网络爬虫仅能抓取web服务器返回的html文 件,不能抓取JavaScript动态生成的信息[5]。因此,网络爬虫必须解决网页动态数据获取。
目前对动态网页的爬取策略主要有两种,第一种是通过对ajax技术原理的分析,结合传统爬虫爬取某一url的html代码的特点,找到访问动态加载部分的url,进行动态信息的爬取。第二种方法是通过WebDriver模拟访问网页,实现动态记载对象的触发,在内容加载完成之后爬取页面信息。
1.1 现有爬取策略的局限性
构建ajax请求的方法,实现的难度比较大,在实现的过程中可能面临的阻碍有很多。往往爬取的困难程度同网页信息的敏感度相关,越是敏感的信息,访问量大的网页,越难爬取。会遇到以下问题:
1) ajax请求的url中含有随机数;
2) ajax请求的url禁止直接访问,必须构建请求头;
3) ajax请求的url指向某api,或者加密的信息。
由于构建ajax请求方法相当于爬取访问动态加载数据的url,相对比较直接,效率高,但往往实现难度较大,主要体现在url构造较为烦琐和难以实现登陆操作。并且每次更改爬取目标时都需要重新分析构建ajax请求的url,爬虫重新定向所需的工作量大。
虽然通过WebDriver爬取的策略在实现难度上拥有一定的优势,基本上只要是可以浏览到的网页信息,大多都可以通过这种方法进行爬取,同时这种方法也可以实现模拟登陆。但是,由于WebDriver需要加载并打开网页,所以需要更多的时间成本,效率较低。
1.2 基于网页性质判定的动态网页爬取策略
根据对现有策略的分析,本文提出了一种综合两种策略的采集动态网页异步加载部分信息的策略。相较现有两种策略,具备更高的泛用性和效率。
图1展示了基于网页性质判定的动态网页爬取策略的流程,主要步骤如下:
1) 判断要采集的目标信息是否需要登录才能获取;
2) 判断异步加载json请求访问的url是否含有参数;
3) 若目标信息不需要登陆就可以访问,并且异步加载json请求访问的url中含有参数,则使用基于json请求构建的动态信息爬取方法。否则使用基于webdriver的动态信息爬取方法;
4) 检验爬取结果的完整性。
2 动态网页爬取方法的实现
以知乎、上海证券交易所官网为例进行分析,将“知乎”-“今日最热”作为具备社交网站属性的爬取目标,同时将上海证券交易所官方网站的股票列表作为普通网站爬取目标,通过两种不同的策略,爬取这两个网站的信息。
2.1 基于json请求构建的动态信息爬取方法
基于json请求构建的动态信息爬取方法主要分为构建请求头、构建json请求、爬取信息、清洗数据这四个步骤。下文重点介绍构建请求头、构建json请求内容。
2.1.1 构建请求头
Ajax请求往往需要请求头才可以访问相关数据。因此在浏览器的开发者模式中,除了需要关注ajax请求,还需要关注请求头。
在上面的请求头示例中,‘Host项和‘Referer项需要根据爬取的目标进行设定。
2.1.2 构建json请求
大部分网站的参数命名都比较规范,可以通过参数的名字猜到其大概的意义,进而通过修改参数的值来访问更多信息。而对于参数名意义不强的网页,往往需要多次访问目标信息,并列出每次访问对应的url,通过url间的横向对比来推测参数意义,进而控制相关参数来访问更多信息。
2.2 基于webdriver的动态信息爬取方法
基于webdriver的动态信息爬取方法主要分为设定浏览器、设定目标网页、设定目标信息、采集并分析数据这四个步骤。
2.2.1 浏览器和目标网址的设定
通过语句“driver = webdriver.Chrome()”進行浏览器的设定, webdriver.Chrome()表示的就是选择使用Chrome浏览器。和WebDriver配套使用的浏览器分为两种,一种是有界面的,主要是IE,firefox,Chrome这三种浏览器。另一种是无界面的浏览器,比如PhantomJs。其中,有界面的浏览器在面对一些需要人去操作的网页具备优势(比如登陆),但也因为需要加载界面的原因,速度相对较慢。
大多数目标网址都可以通过效率更高的无界面浏览器来进行爬取。虽然没有界面,但是页面上的各个元素都是齐全的,因此一些固定的点选,输入操作都可以实现,唯独输入验证码之类的操作难以实现,此时就可以使用有界面的浏览器通过人工来识别和输入验证码。通过下面语句进行目标网址的设定。
driver.get("http://www.sse.com.cn/assortment/stock/list/share/")
2.2.2 目标信息的设定和加载条件的触发
由于爬取的目标信息是动态加载的,因此文档解析模块需实现以下功能:
1) 由于目标信息是异步加载的,因此有时需要触发一些条件,才会加载出目标信息,常见的包括对页面中的表格进行翻页,下拉滚动条等等。Webdriver提供了一些操作的函数,对于函数中不包括的操作可以通过在程序中执行js脚本实现。
2) 判断目标信息是否完成加载:通过 WebDriver 提供的 wait.until API可以实现判断配置文件中指定的元素是否存判断页面是否完成加载。
3) 通过浏览器可以获取目标信息的xpath:调用find_element_by_xpath实现目标信息的提取。
3 实验及结果分析
本实验分别使用两种不同的动态信息采集方式,采集了上交所股票信息,和知乎-今日最热话题信息,对采集性能以及采集到的内容完整性进行分析。以下实验部分简称基于webdriver的动态信息爬取方法为webdriver法,简称基于json请求的动态信息爬取方法为url构造法。实验环境如表1所示:
3.1 采集性能比较
通过采集上交所股票信息,进行基于webdriver的动态信息爬取方法和基于json请求的动态信息爬取方法的性能比较。图3所示为爬取1250条记录到12500条记录的爬取用时统计。
在图3中,数据量表示爬取数据的总页数,其中每页又有25条记录。解析法用时为通过构造json请求方法编写的网络爬虫爬取对应数据量的耗时。WebDriver用时表示的是通过WebDriver爬取动态网页方法编写的网络爬虫爬取对应数据量的耗时。WebDriver初始网页用时表示的时WebDriver加载最初网页的耗时。由于在WebDriver方法中,使用的是Chrome浏览器,如果使用phantomJs等无界面浏览器,爬虫效率可能会有进一步提升。
如图3所示,url构造法采集数据的耗时整体更短,其主要原因应该是WebDriver法在下载了网页数据,进行了必要的网络交互后,还经过了浏览器处理并显示网页信息的过程,尤其是还要加载图片等资源。
通过实验数据可以创建url构造法的线性回归方程和WebDriver法的线性回归方程(参见图4)。
通过分析图4是对url构造法线性回归和WebDriver法线性回归的拟合 结果可知url构造法的效率更高,且由于该方法线性回归方程的斜率小于WebDriver法,因此数据量越大,url构造法越省时。
因此得出实验结论,采集相同数据时,基于json请求的动态信息爬取方法采集性能更好。
3.2 采集完整性比较
通过采集知乎-今日最热话题的全部话题标题进行采集完整性比较。用两种方法分别采集,得出了以下实验结果。
1) webdriver法采集到了11.2KB数据,url构造法没有成功采集到数据;
2) webdriver法采集到的数据中包含知乎-今日最热全部199个话题标题,URL构造法在采集过程中程序中断,报错提示HTTP Error 400:Bad Request。
观察访问知乎的话题信息的url,发现url中不含参数,且数据源为知乎api,因此爬虫程序并没有访问权限,并且由于实际url是隐藏的,因此构造url法在面对这种社交网络时难以获取完整信息。
因此基于webdriver的动态信息爬取方法采集完整性更高。
4 结束语
本文从数据采集完整性和数据采集性能的角度分别对基于webdriver的动态信息爬取方法和基于json请求的动态信息爬取方法进行了实验,得出了在获取普通网页信息时,基于json请求的动态信息爬取方法性能更优,而基于webdriver的动态信息爬取方法面对各种网页均能获取到完整的信息。从而提出了一种基于网页性质判定的动态网页爬取策略。该策略通过对进行定向数据采集的网页进行预处理,判断网页的类型,应用适宜的数据采集方法,从而在保证数据采集完整性的前提下,尽可能地提高采集性能。
参考文献:
[1] 中国互联网络信息中心.第41次中国互联网发展状况统计报告[R].北京,中国互联网络信息中心,2018.
[2] 谭日森.Ajax技术的特点及发展前景[J].黑龙江科技信息,2007(31):87.
[3] 时永坤.基于WebDriver的定向网络爬虫设计与实现[J]. 软件,2016,37(9):94-97.
[4] 李华波,吴礼发, 赖海光,等. 有效的爬行Ajax页面的网络爬行算法[J].电子科技大学学报,2013,42(1):115-120.
[5] 钟明翔, 唐晋韬, 谢松县,等.一种基于动态网页解析的微博数据抓取方法[J].舰船电子工程,2015(10):95-99.
【通联编辑:梁书】