说道网页信息抓取,相信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一下就行。主要给大家介绍一种方案!