刘洋 田儒贤 唐兰文
摘要:近年来,随着互联网与通信技术的迅猛发展,数据的快速增长成了许多行业共同面对的严峻挑战和宝贵机遇,各种开发网站技术也呈现出层出不穷的趋势,异步加载技术因此得到了广泛的应用。如何高效完整的获取异步加载数据显得极为重要。以车型CCC证书网站为研究对象,采用WebDriver模拟网页浏览技术请求网站,能够对验证码进行识别,绕过爬虫检测,获取到同Ajax异步加载技术相同的数据。
关键词:WebDriver;定向爬虫;CCC证书网站
中图分类号:TP311
文献标识码:A
文章编号:1009-3044(2020)03-0034-03
1 概述
随着“Web 2.0”的概念诞生和不断发展,当今网站则更注重用户的交互作用,用户既是网站内容的浏览者,也是网站内容的制造者[1]。为了与之内容相适应,网站大量采用了Ajax技术,为了使文件的体积变小,经常会引用被压缩后JavaScript脚本。这些技术在提高网站开发效率、改善用户体验的同时,也对于以静态页面分析为主的传统网页爬虫提出了新的挑战。采用Ajax技术爬虫策略,具有一定的局限性,主要体现在三点:1)Ajax请求的url中含有随机数,2)Ajax请求的url禁止直接访问,必须构建请求头;3)对敏感信息进行加密,每次更改爬取目标时都需要重新分析构建Ajax请求的url,无形之中增加了爬虫重新定向所需的工作量[2]。而WebDriver技术的出现恰好可以解决这个难题,能够在复杂的网页环境中,获取到实际有效的数据[3]。
2 WebDriver技术简介
WebDriver是Selenium(-个浏览器自动化操作框架)一个非常重要的工具,针对各个浏览器而开发,支持Firefox(Firefox-Driver)、IE(IntemetExplorerDriver)、Opera(OperaDriver)和Chrome(ChromeDriver)。 它還支持Android(AndroidDriver)和iPhone(IPhoneDriver)的移动应用浏览器。除了来自浏览器厂商的支持,它还提供了各种语言环境的API,可以采用Python、Ruby、Java、C#等开发人员熟悉的编程语言来编写应用程序。
3 实验与设计
本实验采用WebDriver技术,模拟用户浏览网站,支持Ajax动态加载技术,执行JavaScript脚本,获取页面元素,而无须网络通信、脚本执行流程等细节,借助第三方破解验证码API对其进行识别,绕过机器检测,从而获取到数据[4]。具体设计流程如图1所示。
3.1 搭建实验运行环境
本实验设计的程序所需要的环境配置如表l所示,电脑的硬件要求为Intel Core i5处理器,运行内存为16G,使用wm7操作系统。开发工具为MyEclipse2014,采用Java作为开发语言,jdk版本为1.7,数据存储使用Oracle llg,运用Chrome浏览器作为WebDriver运行的载体,除此之外,还需要下载与之对应的Chrome驱动,需要注意的是,所用到的浏览器必须与驱动相对应,否则会出现无法启动程序的异常。浏览器与驱动版本对应关系如表2所示,由于篇幅有限,本文只列出部分仅供参考。
3.2 处理验证码
搭建好环境之后,便可以借助WebDriver启动浏览器,本实验所爬取的网站,采用了验证码技术对爬虫进行检测校验。实验使用名为“超级鹰”的打码软件,对验证码进行识别,该软件对干扰项较多的验证码识别成功率较高,拥有能够快速集成图片识别API,广泛支持各种编程语言,且支持多种不同类型的验证码格式,同时具有比较高的稳定性。实验截取的其中一张验证码图片如图2所示:
WebDriver提供了丰富的元素定位API(完整的API列表可以查看WebDriver的文档手册),首先调用findElement方法,通过获取img标签的id属性定位到验证码图片的元素[5],然后对目标元素进行截屏成图片并保存到本地,最后调用识别软件的PostPic方法,填人格式类型,本地图片路径,秘钥等参数,返回json字符串示例:
f”err_ no”:0,
”err str”:”OK”,
”pic_id”:”16622285 16102”,
”pic_str':”8vka”,
"md5”:”35d5c7f6f53223fbdc5b72783dbOc2c0"
J.其中pic_str即为我们所需要获取到的验证码数据。
3.3 请求网址
拿到验证码之后,通过请求地址,返回实验所需要获取到的数据,具体步骤如下。
(1)打开指定URL的Web页面,关键代码如下cDriver=new RemoteWebDriver(service.getUrlO,DesiredCapabilities.chromeO);cDriver.get(url),其中cDriver为初始化WebDriver对象,指定打开Chrome浏览器,这一步操作和普通爬虫工具相同,没有与网站进行任何交互,可以获取到整个html文件源码。
(2)定位目标元素,由于本实验背景为某个车型CCC证书查询网站,需要输入对应的证书编号,调用findElement方法查找元素,再调用sendKeys方法来模拟用户输入所需要查询的证书编号,获取验证码详细方法见步骤3.2。
(3)如果返回的源码文件中包含“没有查询到数据”的字样,则直接返回message消息,本次循环结束,否则执行步骤(4)。 (4)执行交互操作。调用上述这些元素定位函数后,会返回一个WebElement对象,通过调用该对象的成员方法即可实现针对此元素的交互操作。通过xPath,根据input标签的type属性,定位到查询按钮,调用click方法去触发Ajax向服务器异步请求数据,最后再调用cDriver.getPageSource0获取到查询条件后的html源码,上述步骤的关键部分代码如下:
WebElement keyword=cDriver. findElement(By. name(”key-word”));keyword.sendKeys(certNumber);
imagePassword.sendKeys (verifyCode);
WebElement button=cDriver. findElement(By. xpath(”//input[@type=submit,]”));
button. click0;
cDriver. manage0. timeouts0. pageLoadTime-out(60, TimeUnit.SECONDS);
String pageSource= cDriver.getPageSource0;,如果验证码正确,则进入步骤(5),否则重复步骤(2),直到获取到数据。
(5)解析数据,存人数据库,结束循环整个请求地址的流程如图3所示:
3.4 解析页面存入数据库
实验采用Jsoup技术来解析获取到html源码文件,它是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容,提供了非常便利的API,可以通过操作DOM节点,或者类似于Jquery的操作方法来解析数据[6]。通过步骤3.3获取到的部分源码文件如图4所示。
拿到html源文件后,调用Jsoup的parse方法对源码进行解析,部门关键代码如下
Document doc= Jsoup.parse(htmlCode);
Element aIITrNode=doc. getElementsByTag(”table”).get(4).getElementsByTag(”tbody”)
.get(O).getElementsByTag(”tr”).get(0);
然后依次獲取tr元素下每个td元素,便可以取到所有数据
4 结束语
本文以车辆CCC证书查询网站为研究背景,分析了传统爬虫方法存在的弊端,将实验分为四个部分:运行环境的搭建,识别验证码,采集数据,解析数据并存人数据库,采用Web-Driver技术启动浏览器,模拟用户完成对页面的交互操作从而获取到实验数据。本文所设计的爬虫程序仍有一些局限性,例如,不能支持多个证书编号同时运行,采集速度上还有待研究,仍然需要对其不断完善,便于后期对该技术的持续利用。
参考文献:
[1]贺杰.基于Webdriver爬虫技术的研究[D].南昌:江西财经大学软件与通信学院,2016.
[2]孙骏雄.基于网络爬虫的网站信息采集技术研究[D].大连:大连海事大学,2014.
[3]时永坤.基于WebDriver的定向网络爬虫设计与实现[D].北京:华北计算技术研究所,2016.
[4]李晓堂,詹峰,龙能,基于SNS的社区网络服务架构与设计[J].软件,2014,35(2):23-24.
[5]洪立印,徐蔚然.一种结构化数据关系特征抽取和表示模型[J].软件,2013,34(12):148-151.