javafx爬取网页并且初始化网页数据
一、需求场景
编写爬虫爬取网页的信息,而网页的信息经常是未初始化,没有办法获取网页的数据信息。
网页加载数据有两种类型:第一种是网页请求回来,数据已经加载好了;第二种是网页的数据信息还没有初始化,通过浏览器的脚本进行异步请求初始化数据。
二、解决方法
通过使用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);*/
}
}
注意: