htmlunit 抓取网页(Htmlunit模拟浏览页面内容的java框架,具有js解析引擎(rhino))
优采云 发布时间: 2022-01-06 00:19htmlunit 抓取网页(Htmlunit模拟浏览页面内容的java框架,具有js解析引擎(rhino))
Htmlunit 是一个模拟浏览和抓取页面内容的java框架。自带js解析引擎(rhino),可以解析页面的js脚本,得到完整的页面内容,特别适合这种不完整页面的站点抓取。
以下使用的是htmlunit版本:
net.sourceforge.htmlunit
htmlunit
2.14
代码的实现很简单,主要分为两种常见的场景:解析页面的js和不解析页面的js
public class CrawlPage {
public static void main(String[] args) throws Exception {
CrawlPage crawl = new CrawlPage();
String url = "http://www.baidu.com/";
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几个选项的配置,
webClient.getOptions().setJavaScriptEnabled(true); //需要解析js
webClient.getOptions().setThrowExceptionOnScriptError(false); //解析js出错时不抛异常
默认需要打开这两个开关来解析页面的js和css渲染。因为爬虫本身没有接口,所以不需要这部分,即如下配置:
webClient.getOptions().setCssEnabled(false);
Htmlunit 在解析 js 时也可能会失败。此篇未深入研究,后续使用中遇到问题记录
抓到的内容默认以xml的形式获取,即page.asXml(),因为这样可以通过jsoup解析html页面数据,jsoup是一个更方便简洁的工具,后续有follow -up 关于jsoup的使用实践,欢迎大家来打砖~~
相关文件:
htmlunit官网-
jsoup官网-