美文网首页
Java获取js执行完的网页

Java获取js执行完的网页

作者: 柳岸花开 | 来源:发表于2017-04-07 09:49 被阅读1675次

    httpunit是一个没有界面的浏览器,模拟访问网址,可以获得最终网页,即js赋值,ajax拉取数据等。

    模拟文本框与模拟按钮提交,下面我们模拟实现模拟百度搜索关键字。

    // 得到浏览器对象,直接New一个就能得到,现在就好比说你得到了一个浏览器了  
        WebClient webclient = new WebClient();  
    
        // 这里是配置一下不加载css和javaScript,因为httpunit对javascript兼容性不太好
        webclient.getOptions().setCssEnabled(false);  
        webclient.getOptions().setJavaScriptEnabled(false);  
    
        // 做的第一件事,去拿到这个网页,只需要调用getPage这个方法即可  
        HtmlPage htmlpage = webclient.getPage("http://baidu.com");  
    
        // 根据名字得到一个表单,查看上面这个网页的源代码可以发现表单的名字叫“f”  
        final HtmlForm form = htmlpage.getFormByName("f");  
        // 同样道理,获取”百度一下“这个按钮  
        final HtmlSubmitInput button = form.getInputByValue("百度一下");  
        // 得到搜索框  
        final HtmlTextInput textField = form.getInputByName("q1");  
        //搜索我的id
        textField.setValueAttribute("th是个小屁孩");  
        // 输入好了,我们点一下这个按钮  
        final HtmlPage nextPage = button.click();  
        // 我把结果转成String  
        String result = nextPage.asXml();  
    
        System.out.println(result);  //得到的是点击后的网页

    网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源HtmlUnit包,4行代码就OK啦,例子如下:

    1

    2

    3

    4

    final

    WebClient webClient=

    new

    WebClient();

    final

    HtmlPage page=webClient.getPage(

    "http://www.yanyulin.info"

    );

    System.out.println(page.asText());

    webClient.closeAllWindows();

    在程序中写上上面的4行代码,运行,就可以得到烟雨林博客首页的全部内容,上面代码在运行的过程中会出现很多警告,出现这些警告的主要原因是由于以下两点:

    1、HtmlUnitJavascript的支持不是很好

    2、HtmlUnitCSS的支持不是很好

    明白了上面的两点后,将代码重新改写一下,该禁用的就禁用,同时禁用一些不必要的功能,也有利于提高程序的运行效率,再者说网络爬虫也不需要CSS的支持滴

    1

    2

    3

    4

    5

    6

    final

    WebClient webClient=

    new

    WebClient();

    webClient.getOptions().setCssEnabled(

    false

    );

    webClient.getOptions().setJavaScriptEnabled(

    false

    );

    final

    HtmlPage page=webClient.getPage(

    "http://www.yanyulin.info"

    );

    System.out.println(page.asText());

    webClient.closeAllWindows();

    HtmlUnit的使用: 简介:HtmlUnit说白了就是一个浏览器,这个浏览器是用Java写的无界面的浏览器,正因为其没有界面,因此执行的速度还是可以滴,HtmlUnit提供了一系列的API,这些API可以干的功能比较多,如表单的填充,表单的提交,模仿点击链接,由于内置了Rhinojs引擎,因此可以执行Javascript

    作用:web的自动化测试(最初的目的),浏览器,网络爬虫

    重要API的使用 在介绍API的使用之前要先明白的一个问题是,WebClient,WebWindow,Page三者之间的关系,所有的页面最终都是在一个WebWindow对象里面,WebClient在创建时会自动的创建一个WebWindow对象,当调用getPage时会将新页面加载到WebWindow里,你可以理解成WebClient就是IE内核,WebWindow就是呈现页面的浏览器窗口,三者之间的关系图如下图所示:

    1、模拟特定浏览器,也可以指定浏览器的相应版本(HtmlUnit最新版2.13现在可以模拟的浏览器有Chrome/FireFox/IE)

    1

    2

    //模拟chorme浏览器,其他浏览器请修改BrowserVersion.后面

    WebClient  webClient=

    new

    WebClient(BrowserVersion.CHROME);

    2、查找特定元素,通过get或者XPath可以从HtmlPage中获得特定的Html元素,如下例子

    方法一,通过get方法获取

    1

    2

    3

    HtmlPage page=webClient.getPage(

    "http://www.yanyulin.info"

    );

    //从[烟雨林博客]上获取标签hed的内容

    HtmlDivision div=(HtmlDivision)page.getElementById(

    "hed"

    );

    方法二,通过XPath获取,XPath通常用于无法通过Id搜索,或者需要更为复杂的搜索时,XPath的相关教程

    XPath相关教程请查看我的个人博客

    1

    2

    3

    4

    //同样可以打印出hed的内容,//div中//表示搜索整个文档中的div,并将这些div

    //放入list中,然后获取第一个div

    final

    HtmlDivision div = (HtmlDivision) page.getByXPath(

    "//div"

    ).get(

    0

    );

    System.out.println(div.asXml());

    3、代理服务器的配置,代理的配置很简单,只需要配置好地址,端口,用户名与密码即可

    1

    2

    3

    final

    WebClient webClient =

    new

    WebClient(BrowserVersion.CHROME,

    "http://127.0.0.1"

    ,

    8087

    );

    final

    DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();

    credentialsProvider.addCredentials(

    "username"

    ,

    "password"

    );

    4、模拟表单的提交

    1

    2

    3

    4

    5

    6

    7

    8

    9

    //获取表单 

    final

    HtmlForm form = page.getFormByName(

    "form"

    );

    //获取提交按扭

    final

    HtmlSubmitInput button = form.getInputByName(

    "submit"

    );

    //一会得输入的

    final

    HtmlTextInput textField = form.getInputByName(

    "userid"

    );

    textField.setValueAttribute(

    "test"

    );

    //点击提交表单

    final HtmlPage page = button.click();

    API的使用就介绍到这,网络爬虫中主要目的就是获取页中所有的链接,代码如下:

    1 2 3 4 java.util.List<HtmlAnchor> achList=page.getAnchors(); for(HtmlAnchor ach:achList){ System.out.println(ach.getHrefAttribute()); }

    相关文章

      网友评论

          本文标题:Java获取js执行完的网页

          本文链接:https://www.haomeiwen.com/subject/xucjottx.html