java Selenuim 的無頭模式的HtmlUnitDriver的maven的jar包依賴和使用

<dependency>
    <groupId>net.sourceforge.htmlunit</groupId>
    <artifactId>htmlunit</artifactId>
    <version>2.36.0</version>
</dependency>
webclient.getOptions().setUseInsecureSSL(true);
// 禁用css ,一般來說 css沒啥用
webclient.getOptions().setCssEnabled(false);
webclient.getOptions().setThrowExceptionOnFailingStatusCode(false);
// 設置支持 js
webclient.getOptions().setJavaScriptEnabled(true);
// 不拋出異常
webclient.getOptions().setThrowExceptionOnScriptError(false);
webclient.getOptions().setDoNotTrackEnabled(true);
// 最好設置一下超時
webclient.getOptions().setTimeout(5*1000);
// 支持ajax
webclient.setAjaxController(new NicelyResynchronizingAjaxController());

如果簡單的看,這樣也就解決了,但是我們試着回想一下,當我們自己打開網頁的時候是不是都得等半天(有一段時間,肯定不是半天),於是問題來了,如果我們直接寫代碼。

HtmlPage page = webclient.getPage(url);

可以確定,如果是比較小的js操作,在你餘下操作完成之前,js可能能夠執行完成,如果是那種比較繁瑣的js操作或者是ajax還需要去請求其他服務器的操作,多半在於你餘下操作(例如解析html等)之前,js是無法執行完的,那麼我們得到的就是不完成的網頁。所以設置一個超時時間是很有必要的,也就是這樣:
 

HtmlPage page = webclient.getPage(url);
// TODO: 2019/11/26 10秒鐘是爲了讓js能夠充分執行(特別是ajax)
webclient.waitForBackgroundJavaScript(10*1000);
webclient.setJavaScriptTimeout(5*1000);

將上訴代碼放到項目中進行測試,我們可以發現可以得到結果了(這裏只能說得到了結果,誰也不清楚正確的網頁到底爬下來是怎麼樣的,這是爲做一個通用的爬蟲準備的,沒人能夠預測這些不同網站的網頁裏面的Js究竟會執行多久)。

於是,又出現了幾個問題:
1、如何確定某類網站的js平均響應時間,一般來說,同種類型的網站(由於跟響應需求有關,有些網站沒必要性能很好這個可以理解)可以算個js平均響應時間。這個時間用來設置 webclient.waitForBackgroundJavaScript webclient.waitForBackgroundJavaScriptwebclient.waitForBackgroundJavaScript 。
2、是否可以優化js 執行時間
3、如果每個頁面都等待那麼長時間(而且這種等待是必然每個頁面都會等待),那麼如果量比較大,比如爬取一千個不同的網站,該如何優化,使得整體的性能不至於非常差。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章