1. 程式人生 > >使用WebDriver進行網路爬蟲

使用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.selenium</groupId>
     <artifactId>selenium-java</artifactId>
     <version>2.53.1</version>
</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();

這裡寫圖片描述

三、定位元素

在操作頁面的時候,首先要做的就是定位頁面上元素的位置。
定位的方式有很多,這裡重點介紹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為指定元素出現時,才會進行下面的操作
這樣就更加智慧的等待了元素的出現