页面提取器中的HttpWebRequest减慢

时间:2010-07-29 05:41:33

标签: .net httpwebrequest web-crawler

我有一个抓取工具,可以下载页面并对其进行处理。 1小时后,每个请求来源需要1分钟或更长时间才能完成,但是在程序开始时,每个地址都会在1秒内下载,我怀疑目标网站限制了我的请求或流量,但是当我关闭程序并运行它时再次表现恢复正常。所以我的代码存在一些问题 任何帮助都会非常感激

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 个答案:

答案 0 :(得分:1)

您的代码看起来不错。您可能会看到减速的几个原因。

第一:上游缓存。例如,如果您在同一组URL上多次运行测试,一旦您点击URL,它将被缓存在许多地方 - 您的代理服务器(如果有的话),您的互联网提供商的代理(如果他们有他们),目的地网站的缓存等。

因此,对于任何抓取工具速度测试,请确保您从一组非常大的网址中随机选择网址(足够大,以至于因抓取而导致其中任何网站被缓存的可能性非常小)。

接下来,我会查看您应用的其余部分。你确定它的实际读取速度很慢吗?或者是应用程序的其他部分(例如存储获取数据的部分)可能导致速度减慢。由于大多数数据存储机制(在RAM中,在数据库中等)因为在其中放入更多数据而变得慢得多,因此您应该确保只对HTTP访问进行计时,而不是考虑整体爬虫吞吐量,包括存储。