java_爬虫_获取通过js渲染后的网页源码

mdjavascript

弄了一天了……(这个月不会在摸爬虫了,浪费生命)css

 

进入正题:html

起初是想写一个爬虫来爬一个网站的视频,可是怎么爬取都爬取不到,分析了下源代码以后,发现源代码中并无视频的domjava

可是在浏览器检查元素的时候又是有的,这就让我很难过了web

百度了一大天,发现是由于普通方法获取的只是服务器端本地的静态资源,也就是第一手资源浏览器

而浏览器检查元素的资源是通过js渲染后的代码服务器

因此就要想办法去得到渲染后的代码dom

在看了若干个帖子以后……外加上一个httpclient课程和另外一个htmlunit课程……工具

终于,在看完一个帖子后,知道了怎么获取渲染后网页的代码网站

首先,httpclient是普通httlurlConnection的升级版,能够模拟浏览器以防止被服务器封杀

可是抓取的源代码是静态的一手源代码,没有通过js渲染后的内容

因此就须要htmlunit工具,来让页面通过渲染,而后获取源代码

htmlunit的主要功能就是模拟人工操做页面内的元素,因为没有gui,因此要比普通操做要快,可是实际操做后发现仍是须要肉眼可见的时间

具体两个工具的jar包在哪儿下载不在这赘述,相信看到这篇文章的人都应该知道在那里获取资源

下面直接贴上源码,具体语句含义在注释中有

源代码以下:

import java.io.IOException; import java.net.MalformedURLException; import com.gargoylesoftware.htmlunit.BrowserVersion; import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; public class HtmlUnit { public static void main(String[] args) { WebClient webClient = new WebClient(BrowserVersion.FIREFOX_52);//模拟火狐浏览器 try { // HtmlPage page = webClient.getPage("http://www.baidu.com"); // webClient.getOptions().setCssEnabled(false); // webClient.getOptions().setJavaScriptEnabled(false);
            webClient.setJavaScriptTimeout(5000); webClient.getOptions().setUseInsecureSSL(true);//接受任何主机链接 不管是否有有效证书
            webClient.getOptions().setJavaScriptEnabled(true);//设置支持javascript脚本 
            webClient.getOptions().setCssEnabled(false);//禁用css支持 // webClient.getOptions().set
            webClient.getOptions().setThrowExceptionOnScriptError(false);//js运行错误时不抛出异常
            webClient.getOptions().setTimeout(100000);//设置链接超时时间
            webClient.getOptions().setDoNotTrackEnabled(false); // HtmlPage page = webClient.getPage("http://blog.csdn.net/su20145104009?viewmode=contents");
            HtmlPage page = webClient.getPage("http://www.enmeiyiyuan.com/look-5bf3f60b83145.html"); // String res=page.asText();
            Thread.sleep(3000); System.out.println(page.asXml()); } catch (FailingHttpStatusCodeException e) { // TODO 自动生成的 catch 块
 e.printStackTrace(); } catch (MalformedURLException e) { // TODO 自动生成的 catch 块
 e.printStackTrace(); } catch (IOException e) { // TODO 自动生成的 catch 块
 e.printStackTrace(); } catch (InterruptedException e) { // TODO 自动生成的 catch 块
 e.printStackTrace(); }finally { webClient.close(); } } }

 

那些注释掉的是以前尝试的……

而后必定要注意加上线程等待时间,否则获取的大几率仍是第一手代码,由于js渲染须要时间,这里是等待了三秒,而后成功获取通过处理的源码

 

但愿对你们有所帮助

以上

相关文章
相关标签/搜索