2010-07-29 48 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