天天看點

2021-04-23

完美解決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());

繼續閱讀