htmlunit爬虫工具使用--模拟浏览器发送请求,获取JS动态生成的页面内容
Htmlunit是一款模拟浏览抓取页面内容的java框架,具有js解析引擎(rhino),可以解析页面的js脚本,得到完整的页面内容,特殊适合于这种非完整页面的站点抓取。
下载地址:
https://sourceforge.net/projects/htmlunit/files/htmlunit/
maven地址:
<dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit</artifactId> <version>2.18</version> </dependency>
代码的实现非常简单,主要分为两种常用场景:
- 解析页面的js
- 不解析页面的js
package cn.qlq.craw.httpunit; import com.gargoylesoftware.htmlunit.BrowserVersion; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; /** * httpunit爬虫 * @author liqiang * */ public class HttpUnitCraw { public static void main(String[] args) throws Exception { HttpUnitCraw crawl = new HttpUnitCraw(); String url = "http://qiaoliqiang.cn/"; System.out.println("----------------------抓取页面时不解析js-----------------"); crawl.crawlPageWithoutAnalyseJs(url); System.out.println("----------------------抓取页面时解析js-------------------"); crawl.crawlPageWithAnalyseJs(url); } /** * 功能描述:抓取页面时不解析页面的js * @param url * @throws Exception */ public void crawlPageWithoutAnalyseJs(String url) throws Exception{ //1.创建连接client WebClient webClient = new WebClient(BrowserVersion.CHROME); //2.设置连接的相关选项 webClient.getOptions().setCssEnabled(false); webClient.getOptions().setJavaScriptEnabled(false); webClient.getOptions().setTimeout(10000); //3.抓取页面 HtmlPage page = webClient.getPage(url); System.out.println(page.asXml()); //4.关闭模拟窗口 webClient.closeAllWindows(); } /** * 功能描述:抓取页面时并解析页面的js * @param url * @throws Exception */ public void crawlPageWithAnalyseJs(String url) throws Exception{ //1.创建连接client WebClient webClient = new WebClient(BrowserVersion.CHROME); //2.设置连接的相关选项 webClient.getOptions().setCssEnabled(false); webClient.getOptions().setJavaScriptEnabled(true); //需要解析js webClient.getOptions().setThrowExceptionOnScriptError(false); //解析js出错时不抛异常 webClient.getOptions().setTimeout(10000); //超时时间 ms //3.抓取页面 HtmlPage page = webClient.getPage(url); //4.将页面转成指定格式 webClient.waitForBackgroundJavaScript(10000); //等侍js脚本执行完成 System.out.println(page.asXml()); //5.关闭模拟的窗口 webClient.closeAllWindows(); } }
主要关注webClient的几个选项配置,
需要将这两个开关打开才可以解析页面的js,css的渲染默认关掉就可以,因为爬虫本身没有界面,所以这块不需要,即下面的配置:
htmlunit在解析js的时候也有可能失败,这块还没有深入研究,后续使用遇到问题再记录
抓取到的内容默认以xml形式获得,即page.asXml(), 因为这样可以通过jsoup去解析html页面数据,jsoup是一个比较方便简洁的工具.
【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】