9
回答
Java_爬虫,如何抓取Js动态生成数据的页面?
【腾讯云】校园拼团福利,1核2G服务器10元/月!>>>   
很多网站是用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
举报
Inszt
发帖于4年前 9回/9K+阅
共有9个答案 最后回答: 2年前

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

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

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

--- 共有 3 条评论 ---
tinshen回复 @waterz : 这个就另一个技术了。httpclient有支持sesssion和cookies保持的方法。本身就是模拟一个完整的浏览器请求。 即使有验证码+用户验证等不是问题,因为程序就是模拟浏览器操作。 4年前 回复
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 4年前 回复
Jeff_sj 4年前 回复

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

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

post type:post

param: nowpage,pagesize,name


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

引用来自“tinshen”的评论

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

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

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

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

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

--

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

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

引用来自“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里 没有,只有一个当前页面的链接的请求啊。

--- 共有 2 条评论 ---
tinshen看全部,不要只看HTML。控制台里也能看到AJAX的交互信息。 4年前 回复
waterz点开firebug后再刷新下网页即可 4年前 回复
在神箭手云爬虫里开发爬虫,只需要勾选上js渲染就可以实现自动爬取js动态生成的数据了,很简单,你可以去试试:http://www.shenjianshou.cn/
顶部