HttpWebReqest в сборщике страниц замедляется - PullRequest
1 голос
/ 29 июля 2010

У меня есть сканер, который загружает страницы и обрабатывает их.через 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 Ответ

1 голос
/ 01 августа 2010

Ваш код выглядит хорошо.Есть несколько возможных причин замедления.

Первое: восходящее кэширование.Например, если вы запускаете тест несколько раз для одной и той же группы URL-адресов, после того, как вы нажмете URL-адрес, он будет кэширован во многих местах: ваш прокси-сервер (если он у вас есть), прокси-серверы вашего интернет-провайдера (если оникеширование целевого сайта и т. д.

Так что для любого теста скорости сканирования убедитесь, что вы выбираете случайные URL-адреса из очень большого набора URL-адресов (достаточно больших, чтобы вероятность любого из нихкэширование в результате вашего сканирования очень мало).

Далее я посмотрю на остальную часть вашего приложения.Вы уверены, что это медленная загрузка?Или какая-то другая часть вашего приложения (например, часть, которая хранит извлеченные данные), возможно, вызывает замедление.Поскольку большинство механизмов хранения данных (в оперативной памяти, в базе данных и т. Д.) Работают намного медленнее, когда вы помещаете в них больше данных, вы должны убедиться, что вы только синхронизируете свой HTTP-доступ и не смотрите на общую пропускную способность сканера, включая хранилище,

...