使用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種
- id
- className
- 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為指定元素出現時,才會進行下面的操作
這樣就更加智慧的等待了元素的出現