Java_爬虫,如何抓取Js动态生成数据的页面?

Inszt 发布于 2014/07/25 17:27
阅读 10K+
收藏 8
很多网站是用js或Jquery 生成数据的,到后台获取到数据以后,用 document.write()或者("#id").html="" 的方式 写到页面中,这个时候用浏览器查看源码是看不到数据的。

HttpClient是不行的,看网上说HtmlUnit,说  可以获取后台js加载完后的完整页面,但是我按照文章上说的 写了 ,都不好使。一般的代码是这样写的:


String url = "http://xinjinqiao.tprtc.com/admin/main/flrpro.do";
		try {
			WebClient webClient = new WebClient(BrowserVersion.FIREFOX_10);
			//设置webClient的相关参数
			webClient.getOptions().setJavaScriptEnabled(true);
			webClient.getOptions().setCssEnabled(false);
			webClient.setAjaxController(new NicelyResynchronizingAjaxController());
			//webClient.getOptions().setTimeout(50000);
			webClient.getOptions().setThrowExceptionOnScriptError(false);
			//模拟浏览器打开一个目标网址
			HtmlPage rootPage = webClient.getPage(url);
			System.out.println("为了获取js执行的数据 线程开始沉睡等待");
			Thread.sleep(3000);//主要是这个线程的等待 因为js加载也是需要时间的
			System.out.println("线程结束沉睡");
			String html = rootPage.asText();
			System.out.println(html);
		} catch (Exception e) {
		}

其实根本不好使。


求解答,其中典型的就是这个链接的页面,怎么能在java程序中获取其中的数据?

http://xinjinqiao.tprtc.com/admin/main/flrpro.do
加载中
0
tinshen
tinshen

http://xinjinqiao.tprtc.com/admin/main/pro!lrprolist.do?date=1406281728304&name=flr&nowpage=1&pagesize=100

你的方向错了。你应该抓取实际的数据源。而不那个显示页面。

我给你的地址就实际数据源。恭喜你页面大小你可以自己控制。

tinshen
tinshen
回复 @waterz : 这个就另一个技术了。httpclient有支持sesssion和cookies保持的方法。本身就是模拟一个完整的浏览器请求。 即使有验证码+用户验证等不是问题,因为程序就是模拟浏览器操作。
waterz
waterz
但这种做法也有局限,有一些数据请求无法脱离原网页,比如/ 原网页http://122.227.67.197:8081/rainInfo/ssyl.aspx 数据请求http://122.227.67.197:8081/ajax/dal.raininfo.rain,dal.ashx?_method=ssylxx1&_session=r
J
Jeff_sj
0
开源中国首席攻城师
开源中国首席攻城师
帮顶下吧,我最近也遇到这个问题未解决。。。
0
头号大宝贝
头号大宝贝

url:http://xinjinqiao.tprtc.com/admin/main/pro!lrprolist.do?date=[timestamp]

post type:post

param: nowpage,pagesize,name


0
xoHome
xoHome
写个浏览器插件  根据DOM树自己生成源代码
0
Inszt
Inszt

引用来自“头号大宝贝”的评论

url:http://xinjinqiao.tprtc.com/admin/main/pro!lrprolist.do?date=[timestamp]

post type:post

param: nowpage,pagesize,name


所以只能是找到js请求的地址,然后获取JSON数据的方式了?
0
Inszt
Inszt

引用来自“tinshen”的评论

http://xinjinqiao.tprtc.com/admin/main/pro!lrprolist.do?date=1406281728304&name=flr&nowpage=1&pagesize=100

你的方向错了。你应该抓取实际的数据源。而不那个显示页面。

我给你的地址就实际数据源。恭喜你页面大小你可以自己控制。

·我之前也是用找到Js请求地址,然后获取未print的数据的方式,这种方式确实可以。

我问一下 你是怎么找这个地址的,我一般是在firedebug里看网络请求的,不行采取看js代码,不过js代码都是 各种相互调用,找起来很麻烦,你有什么好的方法吗?

--

还有 除了上述方法,关于用HtmlUnit (或其他工具)获取加载完数据的页面的方式 是实现不了的吗?

tinshen
tinshen
firebug可以完全的看到数据交互,你仔细的看firebug的请求路径就可以知道了。 如果你去到了后台的数据交互。 不就直接解析json不就完了,何必又要去再次通过HtmlUnit获取内容。不更麻烦了。 大部分的复杂交互都是有规律的。 找到顾虑了只要解析后台的返回数据就可以了。
0
Inszt
Inszt

引用来自“tinshen”的评论

http://xinjinqiao.tprtc.com/admin/main/pro!lrprolist.do?date=1406281728304&name=flr&nowpage=1&pagesize=100

你的方向错了。你应该抓取实际的数据源。而不那个显示页面。

我给你的地址就实际数据源。恭喜你页面大小你可以自己控制。

引用来自“assasszt”的评论

·我之前也是用找到Js请求地址,然后获取未print的数据的方式,这种方式确实可以。

我问一下 你是怎么找这个地址的,我一般是在firedebug里看网络请求的,不行采取看js代码,不过js代码都是 各种相互调用,找起来很麻烦,你有什么好的方法吗?

--

还有 除了上述方法,关于用HtmlUnit (或其他工具)获取加载完数据的页面的方式 是实现不了的吗?

麻烦再问一下,你看  我看了firedebug里 没有,只有一个当前页面的链接的请求啊。

tinshen
tinshen
看全部,不要只看HTML。控制台里也能看到AJAX的交互信息。
waterz
waterz
点开firebug后再刷新下网页即可
0
g
gtchjc
同求,网上很多没有说明具体方法,用于获取js加载后的网页
0
数据工厂
数据工厂
在神箭手云爬虫里开发爬虫,只需要勾选上js渲染就可以实现自动爬取js动态生成的数据了,很简单,你可以去试试:http://www.shenjianshou.cn/
返回顶部
顶部