分享网页数据抓取任务,说说Jsoup抓取网页时的不足

费尽心思制作的网页资料被人随意拿去使用,而且连出处都不注明,这让人怎能不心烦!在网页信息采集的领域,挑选合适的工具可是很有讲究的。接下来,我们将对这些相关的问题进行深入的分析。

Jsoup受青睐

网页信息抓取领域,Jsoup工具颇受欢迎。许多程序员在次尝试网页数据抓取时,往往会首选它。原因在于,它的类操作体验非常出色,使用起来就像拼搭积木那般简单。例如,对于一些简单的静态网页数据抓取任务,只需几行代码即可完成,这也使得它在学者中赢得了极高的口碑。



	
		main.html
		
		
		
	
		a {
			line-height: 30px;
			margin: 20px;
		}
	
	
		
		
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"))
		}
}

	
	
		Hello Main HttpUnit!
		

一次抓取任务

图片[1]-分享网页数据抓取任务,说说Jsoup抓取网页时的不足-东山笔记

今天遇到了一个抓取网页数据的任务。心想用Jsoup应该没问题。打开网页,发现数据排列得井然有序。在检查元素时,那些标签和数据都清晰可见,感觉就像是轻而易举的事情。于是迅速编写了代码,满怀信心地认为自己很快就能完成这项任务,之后便愉快地结束了工作。

运行结果打脸

代码编写完毕并执行后,却让人感到意外,发现没有任何数据被捕获。这实在令人困惑,因为代码本身似乎并没有问题。于是再次回到网页界面,仔细检查页面源代码,这才惊讶地发现,body标签内并没有我们期待的数据。原来是在页面加载完毕后,通过ajax技术获取数据,而Jsoup在这种情况下却无法发挥作用,这让人感到非常失望。

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();
		}
	}

Jsoup虽然功能强大,但它的不足之处同样明显。对于那些依赖ajax技术动态加载内容的网页,Jsoup就显得力不从心。据数据统计,目前超过六成的网页都采用了ajax技术来更新数据,这使得Jsoup在很多应用场景中无法发挥其应有的作用。例如,一些电商平台的商品详情页,用户评价部分是通过ajax动态加载的,使用Jsoup就无法获取到的评价信息。

新工具来救场

别担心,有一个开源项目可以应对这个问题。尽管它看起来像是专为测试设计的,但用它来抓取数据也是非常出色的。通过它,你可以编写出类似Jsoup的代码,运行后效果相当完美。它就像是一个没有用户界面的浏览器,能够在页面上的js执行完毕后抓取信息,这样数据抓取就不会受到动态加载的限制了。

推荐方案总结

这里我向大家推荐的是一个切实可行的办法。当遇到Jsoup抓取数据不成功的情况,可以尝试使用这个新的工具。它能够显著提升数据抓取的成效,使得原本较为棘手的任务变得简单易行。在未来的网页数据抓取过程中,大家可以根据不同网页的特点来挑选最合适的工具。

说了这么多,大家在进行网页数据抓取时,若遇到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 links = page.getElementsByTagName("a");
		for (DomElement link : links) {
			System.out
					.println(link.asText() + "  " + link.getAttribute("href"));
		}
	}

© 版权声明
THE END
喜欢就支持一下吧
分享