htmlunit抓取动态网页(何为Ajax动态网页,我想不用我多说了吧 )
优采云 发布时间: 2021-09-23 02:02htmlunit抓取动态网页(何为Ajax动态网页,我想不用我多说了吧
)
什么是ajax动态网页,我不想让我多说,如果你甚至不知道Ajax是,那么你会去谷歌学习Ajax。有了,我将解释此页面作为抓取此页面的示例。 Web链接如下:
很明显,我们必须抓住的数据是
打开Google浏览器开发人员工具,我们会发现他实际上是用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代码将直接抛出,程序被中断。
演示在演示代码中,如何通过单击“下一步”超链接获取每个页面的页面内容以获取页面内容,然后写入磁盘指定目录。程序非常简单,我希望抛出玉,所示的程序依赖罐包: