Selenium 網(wǎng)頁爬蟲開發(fā)基礎(Java)

Overview#


Selenium是一個多平臺的Web應用程序測試的工具,支持包括IE张遭、Mozilla Firefox、Google Chrome等猬仁。他可以模擬人的操作帝璧,如點擊,輸入湿刽,鍵盤操作等的烁。適合于抓取由JavaScript生成的頁面或其他需要互動的頁面。
Anyway诈闺, Selenium是模擬人執(zhí)行瀏覽器一個自動化工具渴庆。
本文介紹的是Java平臺下,如何用Selenium雅镊,與網(wǎng)站交互并爬取相關內(nèi)容

Selenium Project有四個:Selenium WebDriver襟雷、Selenium Grid(已廢棄)、Selenium IDE仁烹、Selenium Remote Control耸弄。本文使用的是WebDriver Project,其中IDE Project是可視化類型的卓缰,適合于非開發(fā)性自動化计呈。

一、準備

1征唬、開發(fā)準備

基礎Java開發(fā)環(huán)境不做贅述捌显,Selenium官方網(wǎng)址:-->seleniumhq官網(wǎng) <-- 這上面有很多資料,純英文的总寒。但不必太糾結扶歪,國內(nèi)中文資料很多,而且十分夠用摄闸,可自行百度善镰。這里給大家推薦按一個:自動化測試
??在官網(wǎng)Download頁面妹萨,找到如下圖所示的下載內(nèi)容即可。不得不說的是炫欺,這個網(wǎng)站偶爾會無法訪問眠副,可能是被墻了。在公司訪問基本都沒出過問題竣稽,因為是比利時節(jié)點。
??為了方便大家霍弹,我在網(wǎng)盤上也給大家分享了毫别,鏈接如下:http://pan.baidu.com/s/1c1KDNI4 密碼:rxnh

官網(wǎng)下載頁面

2、引入Jar

解壓出來的Jar包應該是這樣的典格,lib文件夾中還有更多的岛宦。為了方便管理,可以將Jar放入的User庫耍缴,項目需要就統(tǒng)一加入砾肺。
Lib下包眾多,作者比較好奇每個包具體功能防嗡,想在項目中直接只加入合適的包变汪。這個我查了一下,沒找到蚁趁,如果有了解也可以告訴我裙盾。

文件夾

創(chuàng)建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大致實現(xiàn)思路

  • 配置相關參數(shù)?????????? 驅(qū)動以及瀏覽器位置等等
  • 系統(tǒng)根據(jù)配置加載Drive驅(qū)動????此時自動化操作的瀏覽器打開
  • Drive加載URL??????????訪問URL頁面
  • 操作Drive對瀏覽器執(zhí)行操作????執(zhí)行已設定操作

相關代碼粘貼如下窒升,代碼提供了三種瀏覽器的執(zhí)行方案,分別是IE(速度很)慕匠、FIrefox饱须、Chrome。需要注意的是Chrome在win下只支持32-bit台谊,并且drive的驅(qū)動與瀏覽器版本是相關的蓉媳,向下不兼容譬挚。

     /**
     * 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根據(jù)關鍵字找到輸入框,并點擊搜索玩荠,并將最終結果輸入漆腌。注意:下面這段代碼可能有問題,因為點擊搜索后頁面需要加載后才會出現(xiàn)結果。所以應該有判斷加載結果出來后再抓取結果的過程阶冈,這里為簡便就只是線程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填具、元素定位(按推薦指數(shù)排列,后三個沒用過)

    //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骏庸、元素等待

  • 顯示等待
    ??設定等待的條件毛甲,滿足條件測試代碼才會繼續(xù)向后執(zhí)行,如案例中具被,等待百度的搜索結果玻募。需要注意的是,如果超過設定的最大顯式等待時間閾值一姿, 這測試程序會拋出異常七咧。Selenium預設了一些,可以直接調(diào)用ExpectedConditions下的叮叹。如果沒有艾栋,可以自己實現(xiàn)接口。以下是兩種演示:
   //等待10s蛉顽,出現(xiàn)id為kw元素出現(xiàn)后才繼續(xù)執(zhí)行
   new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.id("kw")));
       //等待驗證碼蝗砾,當驗證碼擁有某些值時候才可以繼續(xù)
        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為等待的秒數(shù)
    driver.manage().timeouts().implicitlyWait(second, TimeUnit.SECONDS);    

4、iframe切換

定位元素最好的方法就是id,如果id確定悼粮,元素很容易找到闲勺。之前開發(fā)中就遇到過一個很復雜的頁面,點擊提交表單后彈出一個iframe扣猫,顯示報表信息菜循。由于元素擁有id,所以想著很容易找到報表中數(shù)據(jù)申尤。用IE一直沒問題癌幕,可是生產(chǎn)部署時要調(diào)整至Chrome瀏覽器,就是找不到昧穿,Always IN ERROR序芦!最后查到的原因就是iframe,所以需要注意的粤咪,不同瀏覽器可能會出現(xiàn)iframe問題

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

5渴杆、瀏覽器操作

   // 最大化
   driver.manage().window().maximize();
   //跳轉(zhuǎn)至Page
   driver.navigate().to("Page");
   // 刷新
   driver.navigate().refresh();
   // 瀏覽器退出...這里需要留意quit和close的區(qū)別寥枝,一般默認quit
   driver.quit();

當然,這些只是一些比較基本的操作磁奖,推薦一個比較完整的博客囊拜,可以去看看,我就不再造輪子了:操作手冊

以上就是Selenium抓取的基本內(nèi)容比搭,利用Selenium做Webservice接口冠跷,將驗證碼抓給用戶填寫并完成整個操作,將會在Selenium實現(xiàn)交互式WebService-處理驗證碼中和大家介紹身诺,謝謝

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜜托,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子霉赡,更是在濱河造成了極大的恐慌橄务,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穴亏,死亡現(xiàn)場離奇詭異蜂挪,居然都是意外死亡,警方通過查閱死者的電腦和手機嗓化,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門棠涮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刺覆,你說我怎么就攤上這事严肪。” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵诬垂,是天一觀的道長劲室。 經(jīng)常有香客問我,道長结窘,這世上最難降的妖魔是什么很洋? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮隧枫,結果婚禮上喉磁,老公的妹妹穿的比我還像新娘。我一直安慰自己官脓,他們只是感情好协怒,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卑笨,像睡著了一般孕暇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赤兴,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天妖滔,我揣著相機與錄音,去河邊找鬼桶良。 笑死座舍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的陨帆。 我是一名探鬼主播曲秉,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疲牵!你這毒婦竟也來了承二?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纲爸,失蹤者是張志新(化名)和其女友劉穎矢洲,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缩焦,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡读虏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了袁滥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盖桥。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖题翻,靈堂內(nèi)的尸體忽然破棺而出揩徊,到底是詐尸還是另有隱情腰鬼,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布塑荒,位于F島的核電站熄赡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏齿税。R本人自食惡果不足惜彼硫,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凌箕。 院中可真熱鬧拧篮,春花似錦、人聲如沸牵舱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芜壁。三九已至礁凡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慧妄,已是汗流浹背顷牌。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腰涧,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓紊浩,卻偏偏與公主長得像窖铡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子坊谁,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355