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