htmlunit抓取动态网页(何为Ajax动态网页,我想不用我多说了吧 )

优采云 发布时间: 2021-09-23 02:02

  htmlunit抓取动态网页(何为Ajax动态网页,我想不用我多说了吧

)

  什么是ajax动态网页,我不想让我多说,如果你甚至不知道Ajax是,那么你会去谷歌学习Ajax。有了,我将解释此页面作为抓取此页面的示例。 Web链接如下:

  很明显,我们必须抓住的数据是

  

  打开Goog​​le浏览器开发人员工具,我们会发现他实际上是用Ajax动态加载的,并且jsonp跨域模式返回,分析如图所示:

  

  

  

  可以推断出页面部分信息通过JavaScript插入DOM。如果模拟HTTP请求获取Web信息,则只需获取Web信息,您得到的内容就不完整。 htmlunit可以做到。

  好的,回到主题,也许你还是要听到一个HTMLUnit这个地方,也许你早点听到了,但我仍然认为是对最大权威的官方解释,我不会是无知的BB,看看图片:

  

  总之,HTMLUnit实际上是一个测试工具,方便测试员执行功能测试,可以模拟常见的主流浏览器(如Google浏览器),Firefox浏览器,即浏览器的行为。不多胡说八道,我直接演示:

  /**

* 上海证券交易所数据抓取测试

* @since 1.0

* @author Lanxiaowei@citic-finance.com

* @date 2015-8-27下午6:16:14

*

*/

public class ShangHaiStockTest {

public static void main(String[] args) throws Exception {

downloadListPage();

}

public static void downloadListPage() throws Exception {

WebClient webClient = new WebClient(BrowserVersion.FIREFOX_38);

webClient.getOptions().setCssEnabled(false);

webClient.getOptions().setJavaScriptEnabled(true);

webClient.getOptions().setActiveXNative(false);

webClient.getOptions().setAppletEnabled(false);

webClient.getOptions().setRedirectEnabled(false);

webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);

webClient.getOptions().setThrowExceptionOnScriptError(false);

webClient.getOptions().setUseInsecureSSL(false);

webClient.getOptions().setTimeout(10000000);

webClient.setAjaxController(new NicelyResynchronizingAjaxController());

int totalPage = 22;

boolean first = true;

HtmlPage page = null;

do {

if(first) {

page = (HtmlPage)webClient.getPage("http://www.sse.com.cn/assortment/stock/list/name/");

FileUtils.writeFile(page.asXml(), "C:/shh/list/" + totalPage + ".html", "UTF-8", false);

first = false;

} else {

HtmlAnchor anchor = null;

if(totalPage == 22 -1) {

anchor = (HtmlAnchor) page.getHtmlElementById("xsgf_next");

} else {

anchor = (HtmlAnchor) page.getHtmlElementById("dateList_container_next");

}

page = (HtmlPage) anchor.click();

FileUtils.writeFile(page.asXml(), "C:/shh/list/" + totalPage + ".html", "UTF-8", false);

}

totalPage--;

} while(totalPage > 0);

//关闭模拟窗口

webClient.closeAllWindows();

}

}

  关键点:

  1. webclient.getOptions()。 setjavascripten(true);

  启用JavaScript

  2. webclient.setajaxcontroller(new nicelyresynchronizingajaxcontroller());

  设置Ajax异步处理控制器以启用AJAX支持

  3. webclient.getOptions()。 SetThrowExceptiononFailingStatuscode(false);

  webclient.getOptions()。 setthrowexceptiononscripterror(false);

  这两个句子很重要。当出现HTTP错误时,程序不会丢弃过程,后者意味着当JavaScript执行异常时,Java代码将直接抛出,程序被中断。

  演示在演示代码中,如何通过单击“下一步”超链接获取每个页面的页面内容以获取页面内容,然后写入磁盘指定目录。程序非常简单,我希望抛出玉,所示的程序依赖罐包:

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线