想要爬取某寶的商品,如果只是用HttpURLConnection發個請求,失敗率是很高的。一般想要保證成功率的話,都會選擇真實的瀏覽器去抓取。
以前常用的解決方案是selenium或phantomjs,但是它兩的環境配置太麻煩了,對程序員極度不友好,自從谷歌推出Puppeteer后,puppeteer迅速流行起來,獲得大家一致稱贊。它是一個NodeJS庫,但今天並不是要使用它來爬取某寶商品,而是使用Java語言寫的Jvppeteer,Jvppeteer與Puppeteer是同樣的實現原理。
Jvppeteer通過[DevTools](https://chromedevtools.github.io/devtools-protocol/)控制 Chromium 或 Chrome。
默認情況下,以headless模式運行,也可以通過配置運行'有頭'模式。
你可以在瀏覽器中手動執行的絕大多數操作都可以使用 Jvppeteer 來完成! 下面是一些示例:
- - 生成頁面 PDF。
- - 抓取 SPA(單頁應用)並生成預渲J染內容(即“SSR”(服務器端渲染))。
- - 自動提交表單,進行 UI 測試,鍵盤輸入等。
- - 創建一個時時更新的自動化測試環境。 使用最新的 JavaScript 和瀏覽器功能直接在最新版本的Chrome中執行測試。
- - 捕獲網站的 [timeline trace](https://developers.google.com/web/tools/chrome-devtools/evaluate-performance/reference),用來幫助分析性能問題。
- - 測試瀏覽器擴展。
開始使用
啟動瀏覽器
//設置基本的啟動配置,這里選擇了‘有頭’模式啟動 LaunchOptions options = new OptionsBuilder().withHeadless(false).withExecutablePath("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe").build(); //啟動 Puppeteer.launch(options);
導航到某個頁面
package com.ruiyun.example; import com.ruiyun.jvppeteer.core.Puppeteer; import com.ruiyun.jvppeteer.core.browser.Browser; import com.ruiyun.jvppeteer.options.LaunchOptions; import com.ruiyun.jvppeteer.options.LaunchOptionsBuilder; import com.ruiyun.jvppeteer.core.page.Page; import java.util.ArrayList; public class PageGotoExample { public static void main(String[] args) throws Exception { // String path = new String("F:\\java教程\\49期\\vuejs\\puppeteer\\.local-chromium\\win64-722234\\chrome-win\\chrome.exe".getBytes(),"GBK"); String path ="D:\\develop\\project\\toString\\chrome-win\\chrome.exe"; ArrayList<String> arrayList = new ArrayList<>(); LaunchOptions options = new LaunchOptionsBuilder().withArgs(arrayList).withHeadless(false).withExecutablePath(path).build(); arrayList.add("--no-sandbox"); arrayList.add("--disable-setuid-sandbox"); Browser browser = Puppeteer.launch(options); Page page = browser.newPage(); page.goTo("https://www.taobao.com/about/"); browser.close(); } }
生成頁面PDF
package com.ruiyun.example; import com.ruiyun.jvppeteer.core.Puppeteer; import com.ruiyun.jvppeteer.core.browser.Browser; import com.ruiyun.jvppeteer.core.page.Page; import com.ruiyun.jvppeteer.options.LaunchOptions; import com.ruiyun.jvppeteer.options.LaunchOptionsBuilder; import java.util.ArrayList; public class PagePDFExample2 { public static void main(String[] args) throws Exception { //String path = new String("F:\\java教程\\49期\\vuejs\\puppeteer\\.local-chromium\\win64-722234\\chrome-win\\chrome.exe".getBytes(),"UTF-8"); ArrayList<String> arrayList = new ArrayList<>(); String path = "D:\\develop\\project\\toString\\chrome-win\\chrome.exe"; //生成pdf必須在無厘頭模式下才能生效 LaunchOptions options = new LaunchOptionsBuilder().withArgs(arrayList).withHeadless(true).withExecutablePath(path).build(); arrayList.add("--no-sandbox"); arrayList.add("--disable-setuid-sandbox"); Browser browser = Puppeteer.launch(options); Page page = browser.newPage(); page.goTo("https://www.baidu.com/?tn=98012088_10_dg&ch=3"); page.pdf("/tmp/test.pdf"); } }
頁面截圖
package com.ruiyun.example; import com.ruiyun.jvppeteer.core.Puppeteer; import com.ruiyun.jvppeteer.core.browser.Browser; import com.ruiyun.jvppeteer.core.page.Page; import com.ruiyun.jvppeteer.options.Clip; import com.ruiyun.jvppeteer.options.LaunchOptions; import com.ruiyun.jvppeteer.options.LaunchOptionsBuilder; import com.ruiyun.jvppeteer.options.ScreenshotOptions; import java.util.ArrayList; public class PagescreenshotExample { public static void main(String[] args) throws Exception { // String path = new String("F:\\java教程\\49期\\vuejs\\puppeteer\\.local-chromium\\win64-722234\\chrome-win\\chrome.exe".getBytes(),"UTF-8"); ArrayList<String> arrayList = new ArrayList<>(); String path = "D:\\develop\\project\\toString\\chrome-win\\chrome.exe"; LaunchOptions options = new LaunchOptionsBuilder().withArgs(arrayList).withHeadless(true).withExecutablePath(path).build(); arrayList.add("--no-sandbox"); arrayList.add("--disable-setuid-sandbox"); Browser browser = Puppeteer.launch(options); Page page = browser.newPage(); page.goTo("https://www.baidu.com/?tn=98012088_10_dg&ch=3"); // ScreenshotOptions screenshotOptions = new ScreenshotOptions(); // //設置截圖范圍 // Clip clip = new Clip(1.0,1.56,400,400); // screenshotOptions.setClip(clip); // //設置存放的路徑 // screenshotOptions.setPath("test.png"); // page.screenshot(screenshotOptions); ScreenshotOptions screenshotOptions = new ScreenshotOptions(); //設置截圖范圍 Clip clip = new Clip(1.0,1.56,400,400); screenshotOptions.setClip(clip); //設置存放的路徑 screenshotOptions.setPath("test.png"); page.screenshot(screenshotOptions); } }
頁面性能分析
package com.ruiyun.example; import com.ruiyun.jvppeteer.core.Puppeteer; import com.ruiyun.jvppeteer.core.browser.Browser; import com.ruiyun.jvppeteer.core.page.Page; import com.ruiyun.jvppeteer.options.LaunchOptions; import com.ruiyun.jvppeteer.options.LaunchOptionsBuilder; import java.util.ArrayList; public class PageTracingExample { public static void main(String[] args) throws Exception { //String path = new String("F:\\java教程\\49期\\vuejs\\puppeteer\\.local-chromium\\win64-722234\\chrome-win\\chrome.exe".getBytes(),"UTF-8"); ArrayList<String> arrayList = new ArrayList<>(); String path = "D:\\develop\\project\\toString\\chrome-win\\chrome.exe"; LaunchOptions options = new LaunchOptionsBuilder().withArgs(arrayList).withHeadless(true).withExecutablePath(path).build(); arrayList.add("--no-sandbox"); arrayList.add("--disable-setuid-sandbox"); Browser browser = Puppeteer.launch(options); Page page = browser.newPage(); //開啟追蹤 page.tracing().start("C:\\Users\\howay\\Desktop\\trace.json"); page.goTo("https://www.baidu.com/?tn=98012088_10_dg&ch=3"); page.tracing().stop(); //waifor tracingComplete } }
Jvppeteer的項目源碼:https://github.com/fanyong920/jvppeteer