Соскоб экрана веб-страницы после задержки - PullRequest
1 голос
/ 12 апреля 2011

Я пытаюсь очистить веб-страницу с помощью C #, однако после загрузки страницы она выполняет некоторый JavaScript, который загружает больше элементов в DOM, которые мне нужно очистить.Стандартный скребок просто захватывает HTML страницы при загрузке и не воспринимает изменения DOM, сделанные с помощью javascript.Как мне добавить какую-то функциональность, чтобы подождать секунду или две, а затем захватить источник?

Вот мой текущий код:

private string ScrapeWebpage(string url, DateTime? updateDate)
        {
            HttpWebRequest request = null;
            HttpWebResponse response = null;
            Stream responseStream = null;
            StreamReader reader = null;
            string html = null;

            try
            {
                //create request (which supports http compression)
                request = (HttpWebRequest)WebRequest.Create(url);
                request.Pipelined = true;
                request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
                if (updateDate != null)
                    request.IfModifiedSince = updateDate.Value;

                //get response.
                response = (HttpWebResponse)request.GetResponse();
                responseStream = response.GetResponseStream();
                if (response.ContentEncoding.ToLower().Contains("gzip"))
                    responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
                else if (response.ContentEncoding.ToLower().Contains("deflate"))
                    responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);

                //read html.
                reader = new StreamReader(responseStream, Encoding.Default);
                html = reader.ReadToEnd();
            }
            catch
            {
                throw;
            }
            finally
            {//dispose of objects.
                request = null;
                if (response != null)
                {
                    response.Close();
                    response = null;
                }
                if (responseStream != null)
                {
                    responseStream.Close();
                    responseStream.Dispose();
                }
                if (reader != null)
                {
                    reader.Close();
                    reader.Dispose();
                }
            }
            return html;
        }

Вот пример URL:

http://www.realtor.com/realestateandhomes-search/geneva_ny#listingType-any/pg-4

При первой загрузке страницы вы увидите, что найдено 134 объявления, а через секунду - 187 найденных объектов.

Ответы [ 4 ]

5 голосов
/ 13 апреля 2011

Для выполнения JavaScript я использую webkit для рендеринга страницы, который является движком, используемым в Chrome и Safari. Здесь - пример использования привязок Python.

Webkit также имеет .NET привязок , но я не использовал их.

4 голосов
/ 12 апреля 2011

Подход, который вы используете, не будет работать, независимо от того, как долго вы ждете, вам нужен браузер для выполнения JavaScript (или что-то, что понимает JavaScript).

Попробуйте этот вопрос: Какой хороший инструмент для очистки экрана с поддержкой Javascript?

1 голос
/ 12 апреля 2011

Ответ на на этот похожий вопрос говорит об использовании элемента управления веб-браузера для считывания и обработки страницы перед ее очисткой. Возможно, с некоторой задержкой таймера, чтобы дать javascript некоторое время для выполнения и возврата результатов.

1 голос
/ 12 апреля 2011

Вам нужно будет выполнить javascript самостоятельно, чтобы получить эту функциональность.В настоящее время ваш код получает только то, на что сервер отвечает по указанному вами URL-адресу.Остальные списки «появляются», потому что браузер загружает, анализирует и выполняет сопровождающий javascript.

...