使用WebDriver进行网络爬虫

一、简介

WebDriver官方对其描述如下:

Webdriver (Selenium2)是一种用于Web应用程序的自动测试工具,它提供了一套友好的API,Webdriver完全就是一套类库,不依赖于任何测试框架,除了必要的浏览器驱动,不需要启动其他进程或安装其他程序,也不必像Selenium 1那样需要先启动服务。
Selenium 2则是通过原生浏览器支持或者浏览器扩展直接控制浏览器。

个人理解WebDriver作为自动化测试工具,可以直接通过浏览器对页面按照之前设置的程序进行操作,因为是完完全全原生浏览器的操作,所以我们人工可以完成的工作原则上WebDriver都可以帮助我们完成,这就是他强大的地方。

本文介绍如何搭建开发环境,以及我爬取的过程中常用的功能,具体的语法请关注Selenium2的中文教程网

二、搭建开发环境

WebDriver支持多种语言调用API,并且支持多种浏览器。这里我们就选择Java
注意的是,这里我们指的是Webdriver (Selenium2)
Webdriver (Selenium3)搭建开发环境会有不同。

WebDriver搭建需要三个东西配合

  • selenium的开发包
  • 浏览器驱动
  • 浏览器
    这里最最最最最坑的是:这三个东西的版本必须相互匹配!!!!!
    因为我一开始搭建的时候就是因为版本问题死活跑不起来,后来在高人的指点下,才终于找到一个都匹配的版本。
    所以大家没有特殊需求建议搭建过程严格使用我这三个版本

2.1selenium的开发包

这里我们使用Maven的方式搭建,注意,我们选择的是Selenium2的版本

<dependency>
     <groupId>org.seleniumhq.seleniumgroupId>
     <artifactId>selenium-javaartifactId>
     <version>2.53.1version>
dependency>

2.2浏览器驱动

Selenium2对于火狐浏览器是不需要驱动的,如果使用谷歌等浏览器就需要下载对应版本的驱动。
但是注意Selenium3对于火狐也是需要驱动的。
并且使用火狐会出现某些元素点击不了的BUG,所以在此建议使用谷歌浏览器
这里我们的驱动也使用谷歌浏览器
在代码中这样设置驱动
System.setProperty("webdriver.chrome.driver","D:\\work\\Webdriver\\chromedriver_x64.exe");
驱动我已经分享到百度云
链接:http://pan.baidu.com/s/1sk92jrn 密码:hgcz

2.3浏览器版本

配合驱动的版本,浏览器只需要升级到最新版本就可以
我这里使用的是Google Chrome 版本 61.0.3163.100(正式版本)
如果你的浏览器不是安装在默认路径下,你还需要设置一下浏览器的路径

System.setProperty("webdriver.chrome.bin", "C:\\Program Files (x86)\\Chrome\\chrome.bin");

这样我们就搭建完成了开发环境,我们简单跑一个测试应用
我们让程序自动打开浏览器,然后百度Java

System.setProperty("webdriver.chrome.driver","D:\\work\\Webdriver\\chromedriver_x64.exe");
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://www.baidu.com");
        webDriver.findElement(By.id("kw")).sendKeys("Java");
        webDriver.findElement(By.id("su")).click();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        webDriver.quit();

使用WebDriver进行网络爬虫_第1张图片

三、定位元素

在操作页面的时候,首先要做的就是定位页面上元素的位置。
定位的方式有很多,这里重点介绍3种

  1. id
  2. className
  3. xpath

1.首先使用id是最准确的,速度也是最快的
2.使用className定位不一定准备,因为搜索到可能不止一个元素
3.xpath是辅助定位的利器,使用谷歌等浏览器非常方便的能获得元素的Xpath
这里写图片描述
在开发工具中像这样找到了这个元素之后,右键-copy-xpath就能获得该元素的xpath://*[@id=”kw”]

Element element = webDriver.findElement(By.id(key));
Element element = webDriver.findElement(By.className(key));
Element element = webDriver.findElement(By.xpath(key));

四、模拟点击

模拟点击主要有两种方式:WebDriver提供的API,JS方法操作,同时鼠标悬停等操作同理。

4.1调用API点击

WebElement element = driver.findElement(By.linkText("登录"));
Actions builder = new Actions(driver);
Action mouserOverlogin=builder.moveToElement(element).click().build();
mouserOverlogin.perform();

首先先找到元素,然后封装一个动作,然后使用perform把这个动作释放。
或者可以这样简单写:

webDriver.findElement(By.id("su")).click();

4.2使用JS点击

有时候使用API在网络状态不好的时候会比较慢,所以使用JS方法模拟点击会更加有效。
WebDriver对象可以转化为一个JS对象,然后使用JS的方法去执行点击操作

JavascriptExecutor javascriptExecutor = (JavascriptExecutor)webDriver;
javascriptExecutor.executeScript("document.getElementById('next-page-top').click();");

4.3智能等待

有时候我们想点击某个按钮,但是还没有加载出来我们就去点击会报错。
所以我们就需要等待这个按钮出现再点击。
一种比较笨的办法就是sleep一段时间,但是这种方法不具备通用性。
这里我们就需要使用WebDriver的智能等待了

WebDriverWait wait = new WebDriverWait(webDriver, 10);
            wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("results-per-page-select")));//设置等待

首先我们先创建一个WebDriverWait对象,第二个参数设置的是等待的秒数
然后使用until方法,直到出现id为指定元素出现时,才会进行下面的操作
这样就更加智能的等待了元素的出现

你可能感兴趣的:(爬虫)