• 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();
            }
        }
    }
  • 相关阅读:
    20162307 实验二实验报告
    20162307 第六周学习总结
    20162307 第5周学习总结
    20162306 2016-2017-2《程序设计与数据结构》第八周学习总结
    20162306 2016-2017-2《程序设计与数据结构》第七周学习总结
    第二次实验报告
    20162306 2016-2017-2《程序设计与数据结构》第六周学习总结
    20162306 2016-2017-2《程序设计与数据结构》第五周学习总结
    第一次实验报告
    20162306陈是奇 2016-2017-2《程序设计与数据结构》第四周学习总结
  • 原文地址:https://www.cnblogs.com/vincent-vg/p/7116056.html
Copyright © 2020-2023  润新知