大数跨境

Playwright‑Java(动态网站数据抓取) 怎么使用

Playwright‑Java(动态网站数据抓取) 怎么使用 全球CTO俱乐部
2026-09-07
3

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服务器)

  1. 必须headless=true,服务器无图形界面不能弹出浏览器
  2. linux缺少系统库会启动失败,执行 playwright CLI install 会打印yum安装命令
  3. 不要频繁创建销毁Playwright实例,开销很大;>

最佳实践:单例Playwright,复用Browser;Page每次任务新建/关闭。

  1. 内存:并发任务多的时候,浏览器进程会吃内存;任务量大建议做池化,控制并发数量。

和 Selenium对比

项目
Playwright‑Java
Selenium
驱动管理
✅内置,无需下载chromedriver
❌需要手动维护驱动版本
等待策略
内置waitForLoadState/waitForSelector,自动等待
需要手动写WebDriverWait
网络拦截、抓XHR请求
原生支持
需要额外插件
反爬特征
指纹更好
容易被识别爬虫

⚠️性能提醒

Playwright 比直接 Jsoup http 请求慢很多,优先抓接口;接口搞不定再上Playwright

SpringBoot项目使用小提示

不要把Playwright.create()写在方法内部反复创建;做成单例Bean复用Browser实例。 

实验了一下,效果非常ok,linux暂时没试过。



【声明】内容源于网络
0
0
全球CTO俱乐部
CTO俱乐部,一个汇集CTO、CIO、首席技术官、技术总监、研发总监、IT总监、技术专家等人脉平台,涉及人工智能AI、跨境电商、出海、低空经济、新能源、软件服务、IT服务、人才外包等行业,官网:www.ctoclub.com
内容 206
粉丝 0
全球CTO俱乐部 CTO俱乐部,一个汇集CTO、CIO、首席技术官、技术总监、研发总监、IT总监、技术专家等人脉平台,涉及人工智能AI、跨境电商、出海、低空经济、新能源、软件服务、IT服务、人才外包等行业,官网:www.ctoclub.com
总阅读3.9k
粉丝0
内容206