JSOUP 超時分析與處理

JSOUP 超時分析與處理

下面說說超時的發現,有可能出現超時的緣由,以及超時處理。瀏覽器

1.請求頭信息得一致

當你捕獲到一個採用JSOUP 去請求超時的連接,我是經過catch 去發現。測試

    try{
        doc = Jsoup.connect(url)
            .header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:49.0) Gecko/20100101 Firefox/49.0")
            .header("Connection", "close")//若是是這種方式,這裏務必帶上
            .timeout(8000)//超時時間
            .get();
    } catch (Exception e) {//能夠精確處理timeoutException
        //超時處理
    }

經過try···catch 去發現超時,而後結合本身的處理,這裏要說幾個問題。網站

  1. 請求頭信息,在你嘗試去爬取對方的內容的時候,須要儘量的和你在http瀏覽器請求的請求頭一致,注意是請求頭,不是相應頭。
  2. 在請求頭裏務必加上Connection:close ,有同窗可能會問,這個不是相應頭裏的嗎?是的,有的時候你看到在請求頭裏,有的時候看到在相應頭裏,並且通常是 Connection:keep-alive ,你加上就能夠了。下面會講到。
  3. 當發現對方拒絕請求的時候,把瀏覽器裏看到的請求頭所有加上,甚至  Cookie  也加上,注意換行和空格,須要本身處理下。儘可能一行。
  4. 若是對方網站過弱,請採用單線程爬取,要否則會大量超時,甚至把對方Kill 了。
  5. 若是對方有  IP  限制,採用  IP  代理,或者頻率放緩慢一點。

2.請求編碼一致

其實下一篇我也會單獨再說一下由於編碼問題影響亂碼的問題,可能有人會問了,編碼問題,怎麼還會影響超時?不是隻會影響亂碼嗎?這裏有一個細節,咱們超時實際上是分兩種,一個是請求超時,一個是讀取超時,而個人是讀取超時。編碼

這個答案我不能確定的告訴你,可是我測試發現是會影響超時。開始是這樣去請求,我還採用屢次,請求最頻繁超時的地方,我甚至失敗重複請求6次。並且每次超時時間設置都是8秒,timeout(8000)//超時時間url

    try{
        doc = Jsoup.connect(url)
            .header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:49.0) Gecko/20100101 Firefox/49.0")
            .header("Connection", "close")//若是是這種方式,這裏務必帶上
            .timeout(8000)//超時時間
            .get();
    } catch (Exception e) {//能夠精確處理timeoutException
        try{
            doc = Jsoup.connect(url)
                .header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:49.0) Gecko/20100101 Firefox/49.0")
                .header("Connection", "close")
                .timeout(8000)
                .get();
        } catch (Exception e2) {
            //超時處理,超時2次
        }
    }

 

也能夠用如下方式處理spa

doc = getDate(url);
public static Document getDate(String url) { Document doc = null; boolean flag = true; while (flag) { try { doc = Jsoup.connect(url).timeout(5000).userAgent("Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 5.0)").get(); flag = false; } catch (IOException e) { // e.printStackTrace(); } } return doc; } 
相關文章
相關標籤/搜索