HtmlUnit爬取Ajax动态生成的页面内容

  HtmlUnit说白了就是一个浏览器,这个浏览器是用Java写的无界面的浏览器,正因为其没有界面,因此执行的速度还是可以滴。

  HtmlUnit提供了一系列的API,这些API可以干的功能比较多,如表单的填充,表单的提交,模仿点击链接,由于内置了Rhinojs引擎,因此可以执行JavaScript

  之前用的时候一直抓取不了Ajax动态生成table及其数据,用Firefox和IE浏览器查看网页源代码也看不到table和数据,但是用Firefox查看元素能看到信息

  调研了HtmlUnit好久都没有用,后来更新了HtmlUnit的jar包版本,居然就可以了。之前用的是HtmlUnit2.14,现在用的是2.20版本

  下是我爬取某网站ajax动态生成的table数据。流程是:在首页填写相关查询关键字,然后模拟点击查询按钮,获取table数据

public class CrawlerXXX {    
    private static Logger log = Logger.getLogger(CrawlerXXX.class);
    
    public static void main(String[] args){
        WebClient wc = new WebClient(BrowserVersion.BEST_SUPPORTED);  
        wc.getOptions().setTimeout(10000); //设置连接超时时间 ,这里是10S。如果为0,则无限期等待 
        wc.getOptions().setJavaScriptEnabled(true); //启用JS解释器,默认为true  
        wc.setJavaScriptTimeout(10000);//设置JS执行的超时时间
        wc.getOptions().setCssEnabled(false); //禁用css支持  
        wc.getOptions().setThrowExceptionOnScriptError(false); //js运行错误时,是否抛出异常  
        wc.getOptions().setRedirectEnabled(true);
        wc.getOptions().setUseInsecureSSL(true);  
        try {
            HtmlPage mainPage = wc.getPage("xxx");
            HtmlForm form = mainPage.getFormByName("xxx");  
            HtmlTextInput textField = form.getInputByName("varghost"); 
            HtmlSubmitInput button = form.getInputByName("xxx");  
            textField.setValueAttribute("xxx");
            HtmlPage clickedPage = button.click(); 
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if( clickedPage.asXml().contains("OK") || mainPage.asXml().contains("OK")){
                Document doc = Jsoup.parse(clickedPage.asXml());
                Element table = doc.getElementById("pingtable");
                Elements trs = table.getElementsByTag("tr");
                int len = trs.size();
                for(int i = 1; i < len; i++){
                    Element td = trs.get(i).getElementsByTag("td").last();
                    String xxx = td.text();
                    if(xxx.length() > 0){
                        System.out.println("xxx"+i+" = " + xxx);
                    }
                }
            }
        } catch (FailingHttpStatusCodeException | IOException e) {
            e.printStackTrace();
        }
    }
}
原文地址:https://www.cnblogs.com/vincent-vg/p/7116056.html