一、需求场景
编写爬虫爬取网页的信息,而网页的信息经常是未初始化,没有办法获取网页的数据信息。
网页加载数据有两种类型:第一种是网页请求回来,数据已经加载好了;第二种是网页的数据信息还没有初始化,通过浏览器的脚本进行异步请求初始化数据。
二、解决方法
通过使用javafx的WebEngine 把网页加载回来初始化,并执行脚本把初始化网页转成html。
import com.sun.javafx.application.PlatformImpl;
import javafx.concurrent.Worker.State;
import javafx.scene.web.WebEngine;public class Test {public static void main(String[] args) throws InterruptedException {PlatformImpl.startup(() -> {doDom();System.out.println("finish");});}static WebEngine webEngine;//webEngine必须要有引用在使用,不能定义成局部变量,否则被gc回收就没有输出结果public static void doDom(){webEngine = new WebEngine();webEngine.getLoadWorker().stateProperty().addListener((obs, oldValue, newValue) -> {if (newValue == State.SUCCEEDED) {String html = (String) webEngine.executeScript("document.documentElement.outerHTML");System.out.println(html);System.exit(0);}System.out.println(newValue + " ");}); // addListener()webEngine.load("https://www.w3cschool.cn/java/javafx-webengine.html");/*String s="<html>\n" +"\n" +"<head>\n" +"<title>我的第一个 HTML 页面</title>\n" +"</head>\n" +"\n" +"<body>\n" +"<p>body 元素的内容会显示在浏览器中。</p>\n" +"<p id='a'>title 元素的内容会显示在浏览器的标题栏中。</p>\n" +"</body>\n" +"<script>var a =document.getElementById('a');\n" +"a.style.color='red';</script>\n" +"</html>\n";webEngine.loadContent(s);*/}
}
注意:在编写过程中遇到了gc坑