2010-07-29 28 views
1

我有一個履帶式的下載頁面並處理它們。 1小時後,對源的每個請求都需要1分鐘或更長時間才能完成,但在程序開始時,每個地址都在1秒內下載,我懷疑目標網站會限制我的請求或流量,但是當我關閉程序並運行它時性能恢復正常。所以有一些問題,我的代碼 任何幫助將不勝感激頁面抓取器中的HttpWebReqest減慢

public class PageFetcher 
{ 
    public PageFetcher() { } 
    public PageFetcher(string urlAddress) { URLAddress = urlAddress; } 
    private int relayPageCount = 0; 

    public string URLAddress { get; set; } 
    public string FetchingEncoding { get; set; } 

    public PageFetchResult Fetch() 
    { 
     PageFetchResult fetchResult = new PageFetchResult(); 
     HttpWebRequest req = null; 
     HttpWebResponse resp = null; 
     try 
     { 
      req = (HttpWebRequest)HttpWebRequest.Create(URLAddress); 
      req.UserAgent = "Mozilla/4.0"; 
      req.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate"); 
      resp = (HttpWebResponse)req.GetResponse(); 

      string resultHTML = ""; 
      byte[] reqHTML = ResponseAsBytes(resp); 
      Stream resultStream = new MemoryStream(reqHTML); 
      resultStream.Position = 0; 

      string contentEncoding = resp.ContentEncoding.ToLower(); 
      if (contentEncoding.Contains("gzip") || contentEncoding.Contains("deflate")) 
      { 
       if (contentEncoding.Contains("gzip")) 
        resultStream = new GZipStream(resultStream, CompressionMode.Decompress); 

       if (contentEncoding.Contains("deflate")) 
        resultStream = new DeflateStream(resultStream, CompressionMode.Decompress); 
      } 

      StreamReader readerStream = null; 

      if (!string.IsNullOrEmpty(FetchingEncoding)) 
       readerStream = new StreamReader(resultStream, Encoding.GetEncoding(FetchingEncoding)); 
      else if (!string.IsNullOrEmpty(resp.CharacterSet)) 
       readerStream = new StreamReader(resultStream, Encoding.GetEncoding(resp.CharacterSet)); 

      resultHTML = readerStream.ReadToEnd(); 
      req.Abort(); 
      resp.Close(); 
      fetchResult.IsOK = true; 
      fetchResult.ResultHTML = resultHTML; 
      URLAddress = resp.ResponseUri.AbsoluteUri; 
     } 
     catch (Exception ex) 
     { 
      if (req != null) 
       req.Abort(); 
      if (resp != null) 
       resp.Close(); 
      fetchResult.IsOK = false; 
      fetchResult.ErrorMessage = ex.Message; 
     } 
     return fetchResult; 
    } 

回答

1

您的代碼看起來不錯。有幾個可能的原因可能會導致經濟放緩。

第一:上游緩存。例如,如果您在同一組網址上多次運行測試,一旦您點擊一個網址,它將被緩存在許多地方 - 您的代理服務器(如果有的話),您的互聯網提供商的代理(如果他們有目標網站的緩存等),目標網站的緩存等。

因此,對於任何爬蟲速度測試,請確保您從大量URL中隨機選擇URL(足夠大以至於其中任何一個URL被緩存由於你的抓取很小)。

接下來,我會看看你的應用程序的其餘部分。你確定這是實際取得緩慢嗎?或者是您的應用程序的其他部分(例如,存儲提取的數據的部分)可能導致速度放慢。由於大部分數據存儲機制(數據庫中的in-RAM,等等)在你輸入更多數據時會慢得多,所以你應該確保你只對HTTP訪問進行計時,而不考慮整個爬蟲吞吐量,包括存儲。

+0

是提取是放慢速度,我看着HttpWebResponse.GetResponse()這是主要的罪犯!你認爲它與目標網站或另一端有關嗎? – Ehsan 2010-08-01 10:15:22