zoukankan      html  css  js  c++  java
  • java_爬虫_获取经过js渲染后的网页源码

    md

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

    进入正题:

    起初是想写一个爬虫来爬一个网站的视频,但是怎么爬取都爬取不到,分析了下源代码之后,发现源代码中并没有视频的dom

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

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

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

    所以就要想办法去获得渲染后的代码

    在看了若干个帖子之后……外加上一个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渲染需要时间,这里是等待了三秒,然后成功获取经过处理的源码

    希望对大家有所帮助

    以上

  • 相关阅读:
    css
    Git使用
    Github入门
    flask框架预备知识
    django框架预备知识
    JSON格式
    盒模型详解
    position属性详解
    float属性详解
    display属性详解
  • 原文地址:https://www.cnblogs.com/lavender-pansy/p/10845297.html
Copyright © 2011-2022 走看看