java爬虫,爬取js渲染完成后的网页

在爬取bilibili的时候发现通过一般的客户端获取网页内容,会发现网页全是乱码,爬取百度等网页不会出现乱码,在我排除编码问题后,推测bilibili的网页采用js加密了网页。

使用

第一步加入maven依赖

一个是必要的htmlunit框架用来获取渲染完成后的网页
另一个是jsoup爬虫框架,用来获取网页中想要获取的内容

 
 <dependency>
     <groupId>org.jsoupgroupId>
     <artifactId>jsoupartifactId>
     <version>1.13.1version>
 dependency>
 
 <dependency>
     <groupId>net.sourceforge.htmlunitgroupId>
     <artifactId>htmlunitartifactId>
     <version>2.43.0version>
 dependency>

第二步、参考代码

String url="https://www.bilibili.com/video/BV1np4y1C7Yf?from=search&seid=4603248115195283453";
final WebClient webClient = new WebClient(BrowserVersion.CHROME);//新建一个模拟谷歌Chrome浏览器的浏览器客户端对象

webClient.getOptions().setThrowExceptionOnScriptError(false);//当JS执行出错的时候是否抛出异常, 这里选择不需要
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//当HTTP的状态非200时是否抛出异常, 这里选择不需要
webClient.getOptions().setActiveXNative(false);//不启用ActiveX
webClient.getOptions().setCssEnabled(false);//是否启用CSS, 因为不需要展现页面, 所以不需要启用
webClient.getOptions().setJavaScriptEnabled(true); //很重要,启用JS
webClient.getOptions().setDownloadImages(false);//不下载图片
webClient.setAjaxController(new NicelyResynchronizingAjaxController());//很重要,设置支持AJAX

HtmlPage page = null;
try {
    page = webClient.getPage(url);//尝试加载上面图片例子给出的网页
} catch (Exception e) {
    e.printStackTrace();
}finally {
    webClient.close();
}

webClient.waitForBackgroundJavaScript(30000);//异步JS执行需要耗时,所以这里线程要阻塞30秒,等待异步JS执行结束

String pageXml = page.asXml();//直接将加载完成的页面转换成xml格式的字符串
Document parse = Jsoup.parse(pageXml);
System.out.println(parse);

完成

你可能感兴趣的:(爬虫)