javafx爬取网页并且初始化网页数据

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);*/
    }
}

注意: