java面试题网

普通会员

108

帖子

11

回复

136

积分

楼主
发表于 2018-04-10 11:21:57 | 查看: 2848| 回复: 2

完美解决jsoup获取响应内容不完整


Jsoup抓取网页只能抓取一部分不能完整获取响应内容时,一般有以下几个原因。


1. 网络异常,这个很少发生,jsoup会报告exception


2. 网络超时,可以设置 connection.timeout(n) 增加超时时间。


3. 看起来都正常,没有异常发生。 但是获取的数据就是少了一截。


如果获取到的数据不超过1024k,程序正常,得到的数据也正常。


一旦数据超过1024k时,数据就只有预期得到数据的前1024k字节了。


仔细查找jsoup的api 发现,默认设置下,jsoup最大获取的响应长度正好时1M。


所以这个时候只要设置 connection.maxBodySize(0),设置为0,就可以得到不限响应长度的数据了。


网上有人这样写说可以解决

Document = Jsoup.connect(url)

    .header("Accept-Encoding", "gzip, deflate")

    .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0")

    .maxBodySize(0)

    .timeout(600000)

    .get();

经过测试,这样还是不能解决。


最终发现,下面这样写才能完美解决:

Response  resp = Jsoup.connect(url)

.timeout(60000)

.method(Connection.Method.GET)

.maxBodySize(0)

.followRedirects(false)

.execute();

String htmlStr = new String(resp.bodyAsBytes());


无聊看看网原创,转载请注明出处!


普通会员

0

帖子

1

回复

3

积分
沙发
发表于 2018-04-25 19:47:20

我用你这个方法还是取不到完整的响应内容,而且每次取到的内容大小就只有10k左右,有没有可能是新建对象的时候内存分配太少的缘故啊

普通会员

108

帖子

11

回复

136

积分
板凳
发表于 2018-04-26 16:23:55
oreokariters 发表于 2018-04-25 19:47:20 沙发

我用你这个方法还是取不到完整的响应内容,而且每次取到的内容大小就只有10k左右,有没有可能是新建对象的时候内存分配太少的缘故啊

10k数据这的确有点不可思议,你尝试升级一下jsoup版本试试,我当时是为了解决http://www.wityx.com/bbs/post/287_1_1.html这个问题时偶然找到解决方法的。

您需要登录后才可以回帖 登录 | 立即注册

java面试题网无聊看看网与java建站系统提供技术支持V2.1 网站地图 © 2016-2018