1. 程式人生 > >資料提取-Selenium專治各種頑固性客戶端

資料提取-Selenium專治各種頑固性客戶端

         說起Selenium,很多人想到的是Selenium用在自動化web測試上,的確,Selenium是一個很好的自動化測試工具,能夠實現很多便利的測試功能。其實Selenium也是一款資料抽取的神器。我們知道現在很多網站使用了很多javascript,ajax,cookie,session等等,或者人為設定了很多規則來防止/限制爬蟲,有過提取資料的都知道在提取資料的過程中,會遇到各種頑固性問題,像上篇介紹的httpclient之類,雖然做了一些東西,但還是存在很多不足,尤其是JS解析,支援很有限。這個時候就可以試試Selenium這款神器了。

        Selenium IDE


        先來說說Selenium IDE,這個是Selenium通過圖形介面的方式,很方便支援web頁面操作,而且可以記錄操作的過程,形成指令碼,不過目前只有FireFox外掛,其他的瀏覽器不支援。 所以我們說的Selenium IDE其實就是一個FireFox外掛。下載/安裝好外掛之後,FireFox瀏覽器右上角就多了一個Se的圖示,就是Selenium IDE了,就可以使用。


一如你般聰明,很容易就知道怎麼開始了。想要匯出各種指令碼,也是很容易的


         多種語言可以選擇,你值得擁有。

         不過話說這種方式還是有不少坑的,

          首先下載外掛都不容易,Selenium官網好像被強了,基本下載不了;

          FireFox版本和Selenium IDE版本要對應,不然就經常出現很多錯誤;

          錄製的指令碼經常回放不了,這個比較悲催了。

          Selenium RC

          Selenium server端,也就是Selenium Remote Control簡稱RC,RC主要包括三個部分,launcher,http proxy,selenium core, 其中selenium core是由一堆javascript函式構成,通過呼叫這些函式,來實現對瀏覽器的各種操作。Selenium2主要解決了幾點1.沒有原生的滑鼠和鍵盤事件;2.XSS/HTTP同源資料問題;3.popup dialog問題。Webdriver對不同瀏覽器的處理和Selenium1.0有著明顯的不同,Selenium1.0不管是什麼瀏覽器,都是由javascript來處理,而webdriver是選擇瀏覽器最容易識別的語言來處理,比如在Firefox中javascript最容易,在IE中C++最容易識別,通過靈活選擇最容易識別的語言來處理多瀏覽器,我們就可以很好的迴避某些瀏覽器對javascript的安全限制,Webdriver不僅可以處理這方面的問題,而且可以呼叫作業系統API,尤其是當用戶需要模擬滑鼠或鍵盤操作時,這項能力的作用表現的尤其明顯。目前支援主流的瀏覽器,包括chrome,firefox,IE等,使用的時候要下載對應的driver.

        有了server端,我們就可以通過程式碼來控制各種操作,傳送命令給服務端,接受到返回的結果,解析返回的結果。

        下面通過簡短的程式碼片段來說明下:

               // System.setProperty("webdriver.firefox.bin",
          // "D:/Program Files/Mozilla firefox33/firefox.exe");
         System.setProperty("webdriver.chrome.bin",
        "C:/Program Files/Google/Chrome/Application/chrome.exe");

                WebDriver driver = new ChromeDriver();

                driver.get(baseUrl + "/");  //訪問一個頁面
              driver.manage().window().maximize();//瀏覽器最大化
             // Thread.sleep(2000);
             Actions a = new Actions(driver);
             a.click(driver.findElement(By.linkText("供應商")));// not work???
             // driver.findElement(By.linkText("供應商")).click();


            // Thread.sleep(2000);
           driver.findElement(By.id("alisearch-keywords")).clear();
           driver.findElement(By.id("alisearch-keywords")).sendKeys(key);
           driver.findElement(By.id("alisearch-submit")).submit();
           Actions action = new Actions(driver);
          action.sendKeys(Keys.ENTER);// 模擬按下並釋放 TAB鍵

                經常遇到滑鼠點選資料不工作,沒有效果,可以試試這個:

                WebElement we = driver.findElement(By.linkText("" + i));
               act.moveToElement(we).perform();   //先移動到某個元素,然後執行

              需要說明的是,程式碼中有很多sleep的時候,因為由於網路等各方面的原因,經常需要等待,不然會現在元素不存在的異常。

              每次跳轉到新的頁面,我們可以遍歷元素或者driver.getPageSource()得到所有的響應,來解析響應提取的部分,這樣也是很方便的。