- 场景描述:一些网站的 response 中拿不到我们想要的数据,这些数据是在浏览器渲染后才显示在页面上的
- 解决方案:上一篇中我介绍了使用 Java 8 Nashorn 动态执行js脚本,这篇中使用 cdp4j 直接在Java端调用 chrome 浏览器,返回浏览器渲染后的html,简单粗暴,完美解决。
cdp4j - Chrome DevTools Protocol for Java (官方文档)
<dependency>
<groupId>io.webfolder</groupId>
<artifactId>cdp4j</artifactId>
<version>2.2.1</version>
</dependency>
import java.util.ArrayList;
import io.webfolder.cdp.Launcher;
import io.webfolder.cdp.session.Session;
import io.webfolder.cdp.session.SessionFactory;
public class Test {
public static void main(String args[]) {
ArrayList<String> command = new ArrayList<String>();
//不显示google 浏览器
command.add("--headless");
Launcher launcher = new Launcher();
try (SessionFactory factory = launcher.launch(command);
Session session = factory.create()) {
session.navigate("https://webfolder.io");
session.waitDocumentReady();
String content = (String) session.getContent();
System.out.println(content);
//已经拿到渲染后的html,下面就可以用jsoup去抓取想要的数据了
}
}
}
注意:由于cdp4j需要chrome的支持,所以更适合在windows环境下运行
总结:执行效率上没有测过,不敢说那种方法效率更高,但是使用cdp4j确实简单粗暴,更方便
转载请注明出处,原文作者:殷天文
系列教程
Java爬虫入门篇(一)HttpClient+jsoup,以及防盗链简述
Java爬虫入门篇(二)Java 8 Nashorn 动态执行js脚本