使用Selenium3和無頭瀏覽器抓取HAR數據

在此簡單說下使用Selenium3與無頭瀏覽器來抓取HAR日誌的過程html

1,添加須要的依賴包

<dependency>
      <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
       <version>3.141.59</version>
</dependency>
<dependency>
       <groupId>com.github.crashvb</groupId>
       <artifactId>chromedriver</artifactId>
       <version>2.41</version>
</dependency>
  <dependency>
       <groupId>net.lightbody.bmp</groupId>
       <artifactId>browsermob-core</artifactId>
       <version>2.1.5</version>
   </dependency>
<dependency>
       <groupId>edu.umass.cs.benchlab</groupId>
       <artifactId>harlib</artifactId>
       <version>1.1.2</version>
</dependency>

2,使用ChromeDriver

1)下載chromedriver
經過在谷歌瀏覽器地址欄輸入如下地址來查看瀏覽器版本java

chrome://version/

使用Selenium3和無頭瀏覽器抓取HAR數據

2)基於瀏覽器的版本,下載對應版本的chromedrivergit

http://chromedriver.chromium.org/downloads

使用Selenium3和無頭瀏覽器抓取HAR數據

例如個人存放路徑
使用Selenium3和無頭瀏覽器抓取HAR數據github

3)設置系統參數web

System.setProperty("webdriver.chrome.driver",
                "src/main/resources/drivers/chromedriver/v2.46/win32/chromedriver.exe");
// 設置日誌
System.setProperty("webdriver.chrome.logfile", "D:\\chromedriver.log");
System.setProperty("webdriver.chrome.verboseLogging", "true");

4)建立代理ajax

// 經過Proxy訪問網絡,用Proxy端的HAR內容以分析web應用的行爲
BrowserMobProxyServer proxy = new BrowserMobProxyServer();
proxy.setTrustAllServers(true);
proxy.start();

5)建立ChromeDriverchrome

Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
ChromeOptions options = new ChromeOptions();
options.setAcceptInsecureCerts(true);
options.setHeadless(true);
options.setProxy(seleniumProxy);

/*
* (1) NONE: 當html下載完成以後,不等待解析完成,selenium會直接返回 
 * (2) EAGER:要等待整個dom樹加載完成,即DOMContentLoaded這個事件完成,僅對html的內容進行下載解析 
* (3) NORMAL:即正常狀況下,selenium會等待整個界面加載完成(指對html和子資源的下載與解析,如JS文件,圖片等,不包括ajax)
*/
options.setPageLoadStrategy(PageLoadStrategy.NORMAL);
options.addArguments("--disable-gpu");
options.addArguments("--disable-infobars");
// 忽略不可信證書錯誤。
options.addArguments("--ignore-certificate-errors");
// options.addArguments("--window-size=1920,1080");
// 啓動就最大化
// options.addArguments("--start-maximized");
// 禁止默認瀏覽器檢查
options.addArguments("no-default-browser-check");
options.addArguments("--disable-cache");
options.addArguments("--disk-cache-size=0");
options.addArguments("--disable-icon-ntp");
options.addArguments("--disable-ntp-favicons");

// 設置用戶代理
String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36";
options.addArguments(userAgent);

driver = new ChromeDriver(options);

driver.manage().timeouts().implicitlyWait(1, TimeUnit.MINUTES);
driver.manage().timeouts().pageLoadTimeout(60,TimeUnit.SECONDS) ;

proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT,
                    CaptureType.RESPONSE_HEADERS);

proxy.newHar();
try {
    driver.get("http://www.baidu.com");
} catch (TimeoutException e) {
    System.out.println("解析地址有誤,超時," + e.getMessage());
}
Har har = proxy.endHar();
HarLog harLog = har.getLog();

// 全部請求的列表
List<HarEntry> entries = harLog.getEntries();
for (HarEntry entry : entries) {
            // 響應的詳細信息
            HarResponse harResponse = entry.getResponse();
            //響應狀態碼
            int status = harResponse.getStatus();

            HarContent harContent = harResponse.getContent();
            // 響應體的長度
            long contenSize = harContent.getSize();

            // 返回內容的MIME類型
            String mimeType = harContent.getMimeType();

            // 已鏈接服務器的IP地址(DNS解析的結果)[v1.2版本]
            String serverIp = entry.getServerIPAddress();

            // 請求的詳細信息。
            HarRequest harRequest = entry.getRequest();
            // 請求地址
            String reqUrl = harRequest.getUrl();

            // 有關請求/響應往返的詳細時間信息。
            HarTimings harTimings = entry.getTimings();
            // >>>>排隊等待網絡鏈接所花費的時間,若是不支持則返回-1
            long blocked = harTimings.getBlocked(TimeUnit.MICROSECONDS);

            // >>>> DNS解析時間,若是不使用當前請求則返回-1
            long dns = harTimings.getDns(TimeUnit.MICROSECONDS);

            // >>>> 建立TCP鏈接所需的時間,若是不支持則返回-1
            long connect = harTimings.getConnect(TimeUnit.MICROSECONDS);

            // >>>> 向服務器發送HTTP請求所需的時間
            long send = harTimings.getSend(TimeUnit.MICROSECONDS);

            // >>>> 正在等待服務器的響應[等待收到第一個數據包]
            long wait = harTimings.getWait(TimeUnit.MICROSECONDS);

            // >>>> 從服務器(或緩存)讀取整個響應所需的時間[接收響應數據總耗時]
            long receive = harTimings.getReceive(TimeUnit.MICROSECONDS);
            pageInfo.setReceive(receive);

            // 從發起請求到完成響應的總耗時[阻塞等待耗時+DNS解析耗時+TCP鏈接耗時+發送HTTP請求耗時+等待HTTP響應耗時+接收HTTP響應包耗時].不包括-1值
            long totalTime = entry.getTime(TimeUnit.MILLISECONDS);

            // SSL/TLS協商所需的時間。若是定義了此字段,則時間也包括在鏈接字段中(以確保與har
            // 1.1向後兼容)。若是時間不適用於當前請求,請使用-1。
            long ssl = harTimings.getSsl(TimeUnit.MICROSECONDS);
        }

driver.quit();
proxy.stop();

3,使用FirefoxDriver(geckodriver)

和上面的主要區別就在於driver的建立
1)設置系統參數瀏覽器

//注意:需是瀏覽器的安裝路徑
public static String BROWSER_PATH = "C:\\Program Files\\Mozilla Firefox\\firefox.exe";
public static String GECKODRIVER_PATH = "C:\\Program Files\\Mozilla Firefox\\geckodriver.exe";

System.setProperty("webdriver.firefox.bin", BROWSER_PATH);
System.setProperty("webdriver.gecko.driver",GECKODRIVER_PATH);

2)建立driver緩存

FirefoxOptions options = new FirefoxOptions();
options.setAcceptInsecureCerts(true);
options.setHeadless(true);
options.setProxy(seleniumProxy);

driver = new FirefoxDriver(options);

其餘的內容再也不贅述服務器

相關文章
相關標籤/搜索