您的位置:首页 > Web前端 > JavaScript

网页信息抓取进阶 Jsoup的不足之处

2014-11-14 00:07 387 查看
说道网页信息抓取,相信Jsoup基本是首选的工具,完全的类JQuery操作,让人感觉很舒服。但是,今天我们就要说一说Jsoup的不足。

1、首先我们新建一个页面
<script type=text/javascript> var datas = [ { href : http://news.qq.com/a/20140416/017800.htm, title : 高校一保安长相酷似作家莫言 }, { href : http://news.qq.com/a/20140416/015167.htm, title : 男子单臂托举悬空女半小时 }, { href : http://news.qq.com/a/20140416/013808.htm, title : 女子上门讨房租遭强奸拍裸照 }, { href : http://news.qq.com/a/20140416/016805.htm, title : 澳洲骆驼爱喝冰镇啤酒解暑 } ]; window.onload = function() { var infos = document.getElementById(infos); for( var i = 0 ; i < datas.length ; i++) { var a = document.createElement(a); a.href
= datas[i].href ; a.innerText = datas[i].title; infos.appendChild(a); infos.appendChild(document.createElement(br)) } } </script>Hello Main HttpUnit!


页面上观察是这样显示的:





我们审查元素:



如果你看到这样的页面,你会觉得拿Jsoup来抓取,简直就是呵呵,小菜一叠,于是我们写了这样的代码:

@Test
public void testUserJsoup() {
    try {
        Document doc = Jsoup.connect(
                http://localhost:8080/strurts2fileupload/main.html)                 .timeout(5000).get();
        Elements links = doc.body().getElementsByTag(a);
        for (Element link : links) {
            System.out.println(link.text() +   + link.attr(href));
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}


?

你会觉得就这几行代码,轻轻松松搞定,快快乐乐下班。于是运行发现,其实什么的抓取不到。



于是我们再回到页面,打开页面源代码,也就是上面的HTML代码,你恍然大悟,我靠,body里面根本没有数据,难怪抓不到。这就是Jsoup的不足,如果Jsoup去抓取的页面的数据,全都是页面加载完成后,ajax获取形成的,是抓取不到的。

下面给大家推荐另一个开源项目:HttpUnit,看名字是用于测试的,但是用来抓取数据也不错

我们开始编写类似Jsoup的代码:

@Test
public void testUserHttpUnit() throws FailingHttpStatusCodeException,
        MalformedURLException, IOException {
 
    /** HtmlUnit请求web页面 */
    WebClient wc = new WebClient(BrowserVersion.CHROME);
    wc.getOptions().setUseInsecureSSL(true);
    wc.getOptions().setJavaScriptEnabled(true); // 启用JS解释器,默认为true
    wc.getOptions().setCssEnabled(false); // 禁用css支持
    wc.getOptions().setThrowExceptionOnScriptError(false); // js运行错误时,是否抛出异常
    wc.getOptions().setTimeout(100000); // 设置连接超时时间 ,这里是10S。如果为0,则无限期等待
    wc.getOptions().setDoNotTrackEnabled(false);
    HtmlPage page = wc
            .getPage(http://localhost:8080/strurts2fileupload/main.html);
 
    DomNodeList<domelement> links = page.getElementsByTagName(a);
 
    for (DomElement link : links) {
        System.out
                .println(link.asText() +    + link.getAttribute(href));
    }
}




?

再看一下运行结果:





完美解决,HttpUnit其实就相当于一个没有UI的浏览器,它可以让页面上的js执行完成后,再抓取信息,具体的介绍,google一下就行。主要给大家介绍一种方案!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: