首页 > 经验记录 > htmlunit —— 一个强大的模拟浏览器jar包,可在代码中实现浏览器操作(如填写表单,点击按钮)

htmlunit —— 一个强大的模拟浏览器jar包,可在代码中实现浏览器操作(如填写表单,点击按钮)

今天爬数据真是爬的绝望,下午2点多开始写到下班,还主动加了一小时班,然后回到家又码到10点。终于爬出来了。
 
用java自带的 HttpURLConnection 模拟请求,返回的都是乱码。用Jsoup也是一样的。
用postman测了几下,结果一致。
应该是做了什么验证 ,导致代码伪装他的 ajax 请求是不会返回正确数据的。
 
还好 htmlunit 拯救了我。
htmlunit 简介:
一个Java代码版浏览器,它没有图形界面。它可以允许使用网页的一些高级操作,如填写表单、点击链接。你只需要调用getPage(url)方法,然后找到一个超链接,调用click()方法点击它,你就可以得到点击后返回的页面。包括Javascript、Ajax、cookie等都是自动处理的。浏览器能做什么,它就能做什么。
 
导入jar包后直接用,我今天写的代码就贴在下面了。
 
注释大部分都是一点点敲的,从创建到使用,等待加载、获取节点、设置参数、点击事件等等都写了。应该算是比较详细
 

package top.yibobo.htmlunittest;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.*;
import java.io.IOException;
public class HtmlUnitTest {
    public static void main(String[] args) {
        WebClient  webClient = new WebClient(BrowserVersion.CHROME);//模仿谷歌浏览器
        webClient.getOptions().setThrowExceptionOnScriptError(false);//当JS执行出错的时候是否抛出异常, 这里选择不需要
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//当HTTP的状态非200时是否抛出异常, 这里选择不需要
        webClient.getOptions().setActiveXNative(false);
        webClient.getOptions().setCssEnabled(false);//是否启用CSS, 因为不需要展现页面, 所以不需要启用
        webClient.getOptions().setJavaScriptEnabled(true); //很重要,启用JS
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());//很重要,设置支持AJAX
        try {
            HtmlPage page = webClient.getPage("https://www.taodaxiang.com/credit2");
            webClient.waitForBackgroundJavaScript(1000);//等待1秒,等页面加载完
            //得到所有表单,得到第一个,得到该表单下name=‘ww’的input,最后设置他的value值
            HtmlForm htmlForm = page.getForms().get(0);
            HtmlInput ww = htmlForm.getInputByName("ww");
            ww.setValueAttribute("koishipyb");
            //这样好像也能设置焦点,但是很僵硬的是似乎不会去掉原有的参数
            /*HtmlElement ww = (HtmlElement)page.getElementById("ww");
            ww.focus();
            ww.type("koishipyb");*/
            //我这个点击按钮没id就算了,还没得name的,只有class,只能得到所有的input然后遍历咯
            HtmlElement submit = null;
            //得到所有的input
            DomNodeList<DomElement> elementsByTagNameSubmit = page.getElementsByTagName("input");
            for (DomElement domElement : elementsByTagNameSubmit) {
                // 根据目标元素 class 属性循环匹配
                if (domElement.getAttribute("class").equals("uc-button")) {
                    submit = (HtmlElement) domElement;
                }
            }
            page = submit.click();//触发点击事件
            webClient.waitForBackgroundJavaScript(150);//等0.1秒,让ajax跑完基本够了
            System.out.println(page.asXml());//输出该页面的xml表现形式
            //之后还可以使用jsoup对该xml进行别的操作
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

           


EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00