淺談網絡爬蟲爬js動態加載網頁(二)

  沒錯,最後我仍是使用了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

  發現確實快了不少。上面只是一個大體的原型,若是真正的要用,還須要封裝。

相關文章
相關標籤/搜索