Playwright‑Java 使用完整教程
Playwright 自带浏览器驱动,不需要手动下载 chromedriver,内置 Chrome、Firefox、Webkit;执行JS渲染页面,拿到渲染完成HTML后,再丢给 Jsoup 解析DOM。 Maven/Gradle 两套,附带可运行demo,包含无头模式、等待页面加载、获取渲染后html、结合Jsoup解析。
1.Maven依赖 pom.xml
<!-- playwright‑java -->
<dependency>
<groupId>com.microsoft.playwright</groupId>
<artifactId>playwright</artifactId>
<version>1.48.0</version><! 最新版是1.6x-->
</dependency>
2.Gradle
implementation 'com.microsoft.playwright:playwright:1.48.0'
安装浏览器二进制
第一次运行代码会自动提示安装浏览器,命令行执行:
mvn exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI -D exec.args="install"
CentOS服务器部署需要安装系统依赖库,CLI会输出缺失的yum安装命令。
3.完整可运行示例:渲染页面 + Jsoup解析动态DOM
import com.microsoft.playwright.*;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class PlaywrightDemo {
public static void main(String[] args) {
// 1. 创建Playwright实例
try (Playwright playwright = Playwright.create()) {
// 启动无头Chrome,headless=true无界面;false弹出浏览器窗口
Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions()
.setHeadless(true)
.setSlowMo(0) // 调试可以设置500,减慢操作速度
);
// 创建页面上下文
Page page = browser.newPage();
// 设置超时,毫秒
page.setDefaultTimeout(30000);
// 访问目标网页
page.navigate("https://xxx-target-page");
// 等待网络空闲:等待ajax/fetch请求完成,动态数据加载完毕
page.waitForLoadState();
// ✅ 获取JS全部渲染完成之后完整HTML
String renderHtml = page.content();
// 交给Jsoup解析!!
Document doc = Jsoup.parse(renderHtml);
// 正常jsoup选择器操作
// doc.select("xxx");
// 资源关闭
page.close();
browser.close();
}
}
}
常用关键API
// 1.等待指定元素出现,适合列表动态加载
page.waitForSelector(".item-list");
// 2.拦截图片、css,节省带宽,爬虫提速
page.route("**/*.{png,jpg,jpeg,gif,css}", route -> route.abort());
// 3.设置请求头 User‑Agent
page.setExtraHTTPHeaders(java.util.Map.of(
"User‑Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
));
// 4.页面滚动加载(滚动到底部加载更多)
page.evaluate("window.scrollTo(0, document.body.scrollHeight)");
page.waitForTimeout(1000); // 等待加载
// 5.获取接口返回数据(捕获XHR)
page.onResponse(response -> {
if(response.url().contains("/api/data")){
String json = response.text();
System.out.println(json);
}
});
生产环境注意点(CentOS服务器)
-
必须headless=true,服务器无图形界面不能弹出浏览器
-
linux缺少系统库会启动失败,执行 playwright CLI install 会打印yum安装命令
-
不要频繁创建销毁Playwright实例,开销很大;>
最佳实践:单例Playwright,复用Browser;Page每次任务新建/关闭。
-
内存:并发任务多的时候,浏览器进程会吃内存;任务量大建议做池化,控制并发数量。
和 Selenium对比
|
|
|
|
|
|
|
|
|
|
内置waitForLoadState/waitForSelector,自动等待
|
|
|
|
|
|
|
|
|
|
⚠️性能提醒
Playwright 比直接 Jsoup http 请求慢很多,优先抓接口;接口搞不定再上Playwright。
SpringBoot项目使用小提示
不要把Playwright.create()写在方法内部反复创建;做成单例Bean复用Browser实例。
实验了一下,效果非常ok,linux暂时没试过。