HtmlUnit爬取Ajax动态生成的页面内容
Posted WOTGL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(); } } }
以上是关于HtmlUnit爬取Ajax动态生成的页面内容的主要内容,如果未能解决你的问题,请参考以下文章