在此簡單說下使用Selenium3與無頭瀏覽器來抓取HAR日誌的過程html
<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>
1)下載chromedriver
經過在谷歌瀏覽器地址欄輸入如下地址來查看瀏覽器版本java
chrome://version/
2)基於瀏覽器的版本,下載對應版本的chromedrivergit
http://chromedriver.chromium.org/downloads
例如個人存放路徑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();
和上面的主要區別就在於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);
其餘的內容再也不贅述服務器