Jsoup抓取网页只能抓取一部分不能完整获取响应内容时,一般有以下几个原因。
1. 网络异常,这个很少发生,jsoup会报告exception
2. 网络超时,可以设置 connection.timeout(n) 增加超时时间。
3. 看起来都正常,没有异常发生。 但是获取的数据就是少了一截。如果获取到的数据不超过1024k,程序正常,得到的数据也正常。一旦数据超过1024k时,数据就只有预期得到数据的前1024k字节了,其他的超过响应长度就得不到了。
解决办法:
String URL="http://49.235.90.76:5000/";
//通过延迟50000000毫秒,设置响应body不限制
Document doc= Jsoup.connect(URL).timeout(50000000).maxBodySize(0).get();
超时时间可根据自己需求调整,越大越不容易超时,maxBodySize(0),设置为0,就可以得到不限响应长度的数据了。
再贴个项目中源码以供参考:
@GetMapping("/read")
public AjaxResult read() throws IOException {
String URL="http://49.235.90.76:5000/";
//通过延迟50000000毫秒,设置响应body不限制
Document doc= Jsoup.connect(URL).timeout(50000000).maxBodySize(0).get();
// 通过class的名字得到(即XX),一个数组对象Elements里面有我们想要的数据,至于这个div的值呢你打开浏览器按下F12就知道了;
Elements elements = doc.getElementsByTag("ol");
System.out.println("Result---------------------start:");
int i=0;
for (Element element : elements) {
Elements elements1=element.getElementsByTag("li");
for (Element element2: elements1) {
//获取题目大类
//Elements category=element2.getElementsByTag("i");
//获取题目内容
Elements content=element2.getElementsByTag("div");
//获取题目选项
Elements options=element2.getElementsByTag("ul");
//获取答案
Elements answer=element2.getElementsByTag("b");
if(StringUtils.isNotEmpty(answer)) {
i++;
XxqgCategory ct = new XxqgCategory();
if (StringUtils.isNotEmpty(options.text())) {
ct.setCategory("选择题");
}else{
ct.setCategory("填空题");
}
ct.setAnswer(answer.text());
ct.setContent(content.text().replace("【", "").replace("】", "").replace("A", "").replace("B", "").replace("C", "").replace("D", "").trim());
ct.setOptions(options.text());
//写入数据库
//categoryService.insertCategory(ct);
//System.out.print("题目大类:"+category.html());
System.out.print(i + ":题目内容:" + content.text().replace("【", "").replace("】", "").replace("A", "").replace("B", "").replace("C", "").replace("D", "").trim());
System.out.print(" ,题目选项:" + options.text());
System.out.println(" ,题目答案:" + answer.text());
}
}
}
System.out.println("Result---------------------End");
return toAjax(1);
}