【Java】爬取渲染后的网页内容

本文介绍了如何使用HtmlUnit库来抓取和处理动态加载的网页内容。通过模拟浏览器行为,包括设置JavaScript支持和Ajax控制器,可以获取完全渲染后的网页XML。示例中提供了两种场景:一是直接获取静态内容;二是模拟POST登录操作后获取渲染内容。遇到问题时,确保开启JS和CSS支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目的

如果网页是静态内容,就直接httpclient获取就行了。但如果网页是动态加载的,比如利用js加载,就需要等网页完全渲染之后再去获取内容。

使用的jar包

        <dependency>
            <groupId>net.sourceforge.htmlunit</groupId>
            <artifactId>htmlunit</artifactId>
            <version>2.27</version>
        </dependency>

没用maven的,就下载jar包(依赖的有些多)

例1. 只获取渲染后的网页内容

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import org.junit.Test;

public class MyTest {
    @Test
    public void test() {
        // 新建一个模拟谷歌Chrome浏览器的浏览器客户端对象
        final WebClient webClient = new WebClient(BrowserVersion.CHROME);
        // 当JS执行出错的时候是否抛出异常, 这里选择不需要
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        // 当HTTP的状态非200时是否抛出异常, 这里选择不需要
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
        webClient.getOptions().setActiveXNative(false);
        // 是否启用CSS, 因为不需要展现页面, 所以不需要启用
        webClient.getOptions().setCssEnabled(true);
        // 启用JS
        webClient.getOptions().setJavaScriptEnabled(true);
        // 很重要,设置支持AJAX
        webClient.setAjaxController(
new NicelyResynchronizingAjaxController());

        HtmlPage page;
        try {
            page = webClient.getPage("https://www.baidu.com/");
            System.out.println(page.asXml());
        } catch (Exception ignored) {
        }finally {
            webClient.close();
        }
    }
}

例2. 模拟post请求登录,然后获取渲染后的网页内容

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import org.junit.Test;


public class MyTest {
    @Test
    public void test() {
        // 新建一个模拟谷歌Chrome浏览器的浏览器客户端对象
        final WebClient webClient = new WebClient(BrowserVersion.CHROME);
        // 当JS执行出错的时候是否抛出异常, 这里选择不需要
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        // 当HTTP的状态非200时是否抛出异常, 这里选择不需要
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
        webClient.getOptions().setActiveXNative(false);
        // 是否启用CSS, 因为不需要展现页面, 所以不需要启用
        webClient.getOptions().setCssEnabled(true);
        // 启用JS
        webClient.getOptions().setJavaScriptEnabled(true);
        // 很重要,设置支持AJAX
        webClient.setAjaxController(
new NicelyResynchronizingAjaxController());

        HtmlPage page = null;
        try {
            page = webClient.getPage("https://www.baidu.com/");
        } catch (Exception ignored) {
        }
        if(page == null) {
            return;
        }
        // 填入用户名和密码
        try {
            HtmlInput username = page.getElementByName("username");
            if (username != null) {
                username.setValueAttribute("admin");
            }
        } catch (Exception ignored) {
        }
        try {
            HtmlInput userName = page.getElementByName("userName");
            if (userName != null) {
                userName.type("admin");
            }
        } catch (Exception ignored) {
        }
        try {
            HtmlInput account = page.getElementByName("account");
            if (account != null) {
                account.type("admin");
            }
        } catch (Exception ignored) {
        }
        try {
            HtmlInput user = page.getElementByName("user");
            if (user != null) {
                user.type("admin");
            }
        } catch (Exception ignored) {
        }
        try {
            HtmlInput password = page.getElementByName("password");
            password.setValueAttribute("1111");
        } catch (Exception ignored) {
        }
        // 提交
        try {
            HtmlSubmitInput submit = page.getElementByName("submit");
            HtmlPage nextPage = submit.click();
            System.out.println(nextPage.asXml());
        } catch (Exception ignored) {
        } finally {
            webClient.close();
        }
    }
}

注意

如果报错或者没有获取到渲染内容,开启js和css试试。有时候没开css也加载不出内容。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

winrh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值