1. 程式人生 > >Selenium 網頁爬蟲開發基礎(Java)

Selenium 網頁爬蟲開發基礎(Java)

Overview

Selenium是一個多平臺的Web應用程式測試的工具,支援包括IE、Mozilla Firefox、Google Chrome等。他可以模擬人的操作,如點選,輸入,鍵盤操作等。適合於抓取由JavaScript生成的頁面或其他需要互動的頁面。
Anyway, Selenium是模擬人執行瀏覽器一個自動化工具。
本文介紹的是Java平臺下,如何用Selenium,與網站互動並爬取相關內容

Selenium Project有四個:Selenium WebDriver、Selenium Grid(已廢棄)、Selenium IDE、Selenium Remote Control。本文使用的是WebDriver Project,其中IDE Project是視覺化型別的,適合於非開發性自動化。

一、準備

1、開發準備

  基礎Java開發環境不做贅述,Selenium官方網址:–>seleniumhq官網 <– 這上面有很多資料,純英文的。但不必太糾結,國內中文資料很多,而且十分夠用,可自行百度。這裡給大家推薦按一個:自動化測試
  在官網Download頁面,找到如下圖所示的下載內容即可。不得不說的是,這個網站偶爾會無法訪問,可能是被牆了。在公司訪問基本都沒出過問題,因為是比利時節點。
  為了方便大家,我在網盤上也給大家分享了,連結如下:http://pan.baidu.com/s/1c1KDNI4 密碼:rxnh
官網下載頁面

2、引入Jar

  解壓出來的Jar包應該是這樣的,lib資料夾中還有更多的。為了方便管理,可以將Jar放入的User庫,專案需要就統一加入。
Lib下包眾多,作者比較好奇每個包具體功能,想在專案中直接只加入合適的包。這個我查了一下,沒找到,如果有了解也可以告訴我。

資料夾

  建立User庫的方法是:Windows–>Preferences–>User libraries下 先New,再分別add Jar即可。在需要的專案上,右擊buildpath配置進去即可。
Eclipse配置

若使用構建工具,相關dependency 如下

--Gradle--
dependencies {
compile("org.seleniumhq.selenium:selenium-java");
}
--Maven--
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.4.0</version>
</dependency>

OK,當你完成以上時候,專案的準備就基本完成了。下面就是具體功能Coding的部分。

二、小試牛刀

1、Selenium大致實現思路

  • 配置相關引數           驅動以及瀏覽器位置等等
  • 系統根據配置載入Drive驅動    此時自動化操作的瀏覽器開啟
  • Drive載入URL          訪問URL頁面
  • 操作Drive對瀏覽器執行操作    執行已設定操作

      相關程式碼貼上如下,程式碼提供了三種瀏覽器的執行方案,分別是IE(速度很)、FIrefox、Chrome。需要注意的是Chrome在win下只支援32-bit,並且drive的驅動與瀏覽器版本是相關的,向下不相容

     /**
     * Get WebDriver
     * @param url
     * @return driver
     */
    public static WebDriver getWebDriver(String url) {
        //Use IE. u need to set drive path and capabilities
/*          System.setProperty("webdriver.ie.driver", "D:/drive/IEDriverServer.exe");
            DesiredCapabilities ieCapabilities = DesiredCapabilities.internetExplorer();
            ieCapabilities.setCapability(InternetExplorerDriver
                            .INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,true);
            WebDriver driver = new InternetExplorerDriver();*/

        //Use Firefox.need set property and install path;
/*          System.setProperty("webdriver.gecko.driver", "D:/drive/geckodriver.exe");
            System.setProperty("webdriver.firefox.bin", "C:\\Program Files\\Mozilla Firefox\\firefox.exe");
            WebDriver driver = new FirefoxDriver();*/

        //Use Chrome ,but support 32-bit only
        System.setProperty("webdriver.chrome.driver", "D:/drive/chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get(url);
        return driver;
    }

2、操作瀏覽器

  以抓取百度為例,使用者瀏覽器開啟後。Selenium根據關鍵字找到輸入框,並點選搜尋,並將最終結果輸入。注意:下面這段程式碼可能有問題,因為點選搜尋後頁面需要載入後才會出現結果。所以應該有判斷載入結果出來後再抓取結果的過程,這裡為簡便就只是執行緒sleep了2秒鐘

        //get input box
        WebElement keyword = driver.findElement(By.id("kw"));
        //enter keyword
        keyword.sendKeys("selenium");
        //get search button and click it
        WebElement searchBtn = driver.findElement(By.id("su"));
        searchBtn.click();
        Thread.sleep(2000);//waiting for the result
        //get result and print out cyclical--搜尋結果是h3標籤class=“t”,故以此為條件
        List<WebElement> titles = driver.findElements(By.cssSelector("h3.t"));
        for(WebElement title:titles){
            WebElement webTitle=title.findElement(By.tagName("a"));
            System.err.println("webTitle:"+webTitle+":"+webTitle.getText());
        }

三、Selenium基本操作

1、元素定位(按推薦指數排列,後三個沒用過)

    //id 定位
    WebElement  webElement = driver.findElement(By.id(“id的值”));
    //name定位
    WebElement  webElement = driver.findElement(By.name(“name的值”));
    //TagName 標籤名稱定位
    WebElement  webElement = driver.findElement(By.tagName(“標籤名稱”));
    //Class 名稱定位
    WebElement  webElement = driver.findElement(By.className(“class屬性”));
    //css 方式定位
    WebElement  webElement = driver.findElement(By.cssSelector(“css表示式”));
    //連結的全部文字定位
    WebElement  webElement = driver.findElement(By.linkText(“連結的全部文字”));
    //連結的部分文字定位
    WebElement  webElement = driver.findElement(By.partialLinkText(“連結的部分文字”));
    //xpath 方式定位
    WebElement  webElement = driver.findElement(By.xpath(“xpath表示式”));

2、元素簡單操作

   // 點選
   webElement .click();
   // 輸入
   webElement .sendKeys("hello selenium");
   // 獲取屬性
   webElement .getAttribute("value");

3、元素等待

  • 顯示等待
      設定等待的條件,滿足條件測試程式碼才會繼續向後執行,如案例中,等待百度的搜尋結果。需要注意的是,如果超過設定的最大顯式等待時間閾值, 這測試程式會丟擲異常。Selenium預設了一些,可以直接呼叫ExpectedConditions下的。如果沒有,可以自己實現介面。以下是兩種演示:
   //等待10s,出現id為kw元素出現後才繼續執行
   new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.id("kw")));
       //等待驗證碼,當驗證碼擁有某些值時候才可以繼續
        try {
            new WebDriverWait(driver, 500).until(new ExpectedCondition<Boolean>(){
                    public Boolean apply(WebDriver d){
                        return d.findElement(By.id("yzm_img"))
                                            .getAttribute("src")
                                            .contains("base64");
                        }
                    });
    } catch (Exception e) {
    }
  • 隱式等待
      隱式等待方式(implicitlyWait)指令碼在查詢元素時的最大等待時間:
    // 其中second為等待的秒數
    driver.manage().timeouts().implicitlyWait(second, TimeUnit.SECONDS);    

4、iframe切換

  定位元素最好的方法就是id,如果id確定,元素很容易找到。之前開發中就遇到過一個很複雜的頁面,點選提交表單後彈出一個iframe,顯示報表資訊。由於元素擁有id,所以想著很容易找到報表中資料。用IE一直沒問題,可是生產部署時要調整至Chrome瀏覽器,就是找不到,Always IN ERROR!最後查到的原因就是iframe,所以需要注意的,不同瀏覽器可能會出現iframe問題

//swith to dialog frame that named "dialog-body"
driver.switchTo().frame("dialog-body");
// 回到主視窗
driver.switchTo().defaultContent();

5、瀏覽器操作

   // 最大化
   driver.manage().window().maximize();
   //跳轉至Page
   driver.navigate().to("Page");
   // 重新整理
   driver.navigate().refresh();
   // 瀏覽器退出...這裡需要留意quit和close的區別,一般預設quit
   driver.quit();

  當然,這些只是一些比較基本的操作,推薦一個比較完整的部落格,可以去看看,我就不再造輪子了:操作手冊

以上就是Selenium抓取的基本內容,利用Selenium做Webservice介面,將驗證碼抓給使用者填寫並完成整個操作,將會在Selenium實現互動式WebService中和大家介紹,謝謝