沒錯,最後我仍是使用了Selenium,去實現上一篇我所說的問題,別的沒有試,只試了一下firefox的引擎,整體效果對我來講仍是能夠接受的。javascript
繼續昨天的話題,既然要實現上篇所說的問題,那麼就須要一個能夠執行js代碼的框架。我首先選擇的是htmlunit,先簡單介紹一下htmlunit。下面一段摘自網絡。css
htmlunit 是一款開源的 java 頁面分析工具,啓動 htmlunit 以後,底層會啓動一個無界面瀏覽器,用戶能夠指定瀏覽器類型:firefox、ie 等,若是不指定,默認採用 INTERNET_EXPLORER_7: WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6); 經過簡單的調用: HtmlPage page = webClient.getPage(url); 便可獲得頁面的 HtmlPage 表示,而後經過: InputStream is = targetPage.getWebResponse().getContentAsStream() 便可獲得頁面的輸入流,從而獲得頁面的源碼,這對作網絡爬蟲的項目來講,頗有用。 固然,也能夠從 page 中得更多的頁面元素。 很重要的一點是,HtmlUnit 提供對執行 javascript 的支持: page.executeJavaScript(javascript) 執行 js 以後,返回一個 ScriptResult 對象,經過該對象能夠拿到執行 js 以後的頁面等信息。默認狀況下,內部瀏覽器在執行 js 以後,將作頁面跳轉,跳轉到執行 js 以後生成的新頁面,若是執行 js 失敗,將不執行頁面跳轉。 |
最後能夠取得page.executeJavaScript(javascript).getNewPage(),獲取執行後的頁面。換句話說,javascript須要在這裏人爲的執行,顯然與個人初衷不符,另外多是我水平太差,在抓取sina新聞的頁面時老是出錯,暫時還沒發現錯誤在何處,但按照網絡上查詢的結果來分析,極有可能錯誤的緣由是在於htmlunit執行某些帶參數的請求時,因爲參數的順序或者編碼問題會致使請求失敗而報錯。關鍵是,運行後並無獲得我須要的結果。html
那麼就另尋解決辦法,這個時候就找到了Selenium WebDriver,他是我須要的一個解決方案。java
參考了資料和例子,就能夠開始使用他了。實例代碼以下。web
1 File pathToBinary = new File("D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"); 2 FirefoxBinary ffBinary = new FirefoxBinary(pathToBinary); 3 FirefoxProfile firefoxProfile = new FirefoxProfile(); 4 FirefoxDriver driver = new FirefoxDriver(ffBinary,firefoxProfile); 5 6 7 driver.get("http://cq.qq.com/baoliao/detail.htm?294064"); 8 9 ArrayList list = new ArrayList(); 10 list.add("http://www.sina.com.cn"); 11 list.add("http://www.sohu.com"); 12 list.add("http://www.163.com"); 13 list.add("http://www.qq.com"); 14 15 long start,end; 16 17 for(int i=0;i<list.size();i++){ 18 start = System.currentTimeMillis(); 19 driver.get(list.get(i).toString()); 20 end = System.currentTimeMillis(); 21 System.out.println(list.get(i).toString() + ":" + (end - start)); 22 } 23 24 driver.close();
使用了firefox的引擎,獲得的結果以下,並且確實知足了個人要求。瀏覽器
http://www.sina.com.cn:6638
http://www.sohu.com:5796
http://www.163.com:7567
http://www.qq.com:9384緩存
能夠看見如上的結果時間仍是蠻長的,那如何加快速度呢。其實仔細考慮一下,爲何他要這麼久,就是由於他在下載網頁元素,咱們請求一個網站的時候是發起一個req,獲得一個res,而res中是隻有元素沒有內容的,換句話說,他不用執行css,js,不用下載圖片,flash,加載廣告等等。而若是咱們須要加快效率,那就須要移除一切與我分析無關的東西,那麼仿照瀏覽器同樣,咱們須要屏蔽掉css,圖片,flash等等,從而加速網頁的速度,更關心其中的內容。網絡
簡單方法以下:框架
1 //去掉css
firefoxProfile.setPreference("permissions.default.stylesheet", 2); 2 //去掉圖片 3 firefoxProfile.setPreference("permissions.default.image", 2); 4 //去掉flash
firefoxProfile.setPreference("dom.ipc.plugins.enabled.libflashplayer.so",false);
那麼在去除掉全部firefox緩存後,再次運行一下,會有什麼結果呢。結果以下dom
http://www.sina.com.cn:5085
http://www.sohu.com:3520
http://www.163.com:3329
http://www.qq.com:2048
發現確實快了不少。上面只是一個大體的原型,若是真正的要用,還須要封裝。