Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2015, 03:39   #1
BecomeBetter
 
Регистрация: 18.10.2015
Сообщений: 5
По умолчанию Поймать конец веб страницы

Задача: получить код определенной веб страницы, выполнить поиск фразы в полученном коде.
Проблема: как определить, что страница загружена до конца?
Использую компонент WebBrowser. Подписываюсь на событие DocumentCompleted, но, к примеру, при загрузке страниц с динамической загрузкой контента это событие может произойти несколько раз.

Код:
public partial class Form1 : Form
    {
        WebBrowser wb = new WebBrowser();    
        
        public Form1()
        {
            InitializeComponent();
            wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted); 
//Подписываюсь на событие завершения загрузки
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            wb.Navigate("https://www.site.net/");
        }

        void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
//Обработка события завершения загрузки страницы
        {
            richTextBox1.AppendText(e.Url.AbsoluteUri.ToString() + Environment.NewLine);
//Показать ресурс, который закончил загружаться
            richTextBox1.AppendText(e.Url.PathAndQuery.ToString() + Environment.NewLine);
            richTextBox1.AppendText("----------------" + Environment.NewLine);

            if ()//Здесь должна быть проверка на то, что событие DocumentCompleted и есть последнее
            {
                return;//Загрузка не закончена, 
            }
            else
            {//загрузка страницы завершена, приступаем к анализу
                HtmlElementCollection links = wb.Document.Links; //Получаем все ссылки
                foreach (HtmlElement link in links)             //Переносим ссылки в Листбокс
                   { listBox1.Items.Add(link.OuterText + "---" + link.OuterHtml); }
                richTextBox1.AppendText(CountOfSubstring("Искомая фраза").ToString()); 
//Ищем искомую фразу, получаем ко-во, записываем в Ричбокс
            }            
        }
...
  }

Последний раз редактировалось Stilet; 18.10.2015 в 07:40.
BecomeBetter вне форума Ответить с цитированием
Старый 18.10.2015, 07:43   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я тебе больше скажу: Динамически контент может подгружаться при работе с страницей. Или вообще в таймере. Так что я бы не гнался за выяснением окончания загрузки.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.10.2015, 14:24   #3
BecomeBetter
 
Регистрация: 18.10.2015
Сообщений: 5
По умолчанию

Да. Согласен. Тогда конкретизирую. Есть сайт, который, как вы сказали, периодически (каждые 5-10 мину) обновляет (подгружает) контент. При загрузкие страницы сего сайта, мне необходимо получить полный код страницы с первой порцией динамически подгруженного контента. То есть я хочу поймать момент, когда сайт при первом запросе подгрузит все свои части.

Хотя меня здесь возникла мысль... Возможно, как-нибудь обрабатывать отдельно подгружаемые части, по каждому событию завершения загрузки. Тогда как получить "эту самую очередную порцию" отдельно?

В общем, вопрос актуален.
BecomeBetter вне форума Ответить с цитированием
Старый 18.10.2015, 14:42   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Зависит от сайта и того как он подгружает.

Например можно просто периодически (таймер и т.п.) проверять страницу и как-нибудь определять не обновились ли данные.

А может быть легче посмотреть снифером (Fiddler или по F12 в любом браузере) HTTP запросы и повторять периодически запрос на получение данных.

Кстати, вместо WebBrowser для автоматизации обычно гораздо проще использовать Selenium.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 18.10.2015, 14:53   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Возможно, как-нибудь обрабатывать отдельно подгружаемые части, по каждому событию завершения загрузки. Тогда как получить "эту самую очередную порцию" отдельно?
Признаюсь честно - как это делать в компоненте ослика я не знаю. Но я не очень понимаю почему нужно именно самое последнее событие...
Какая разница какое оно, если после можно пройтись по загруженному?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.10.2015, 15:03   #6
BecomeBetter
 
Регистрация: 18.10.2015
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Зависит от сайта и того как он подгружает.
Да, если б мне один сайт нужен был, тогда, соглашусь, отдельно бы его разобрал по косточкам. Но, еще конкретизируя задачу, мне необходимо просматривать произвольных 10-20 сайтов, которые пользователь введет.

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Например можно просто периодически (таймер и т.п.) проверять страницу и как-нибудь определять не обновились ли данные.
А вот здесь вы мне подали хорошую идею. Мне как раз опрос этих сайтов нужно делать с периодичностью в 5 минут. Выходит, можно работать с контентом после несколькосекундной задержки после загрузки... Оказалось все просто, для моей задачи такое решение допустимо.

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Кстати, вместо WebBrowser для автоматизации обычно гораздо проще использовать Selenium.
Спасибо, посмотрю.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Признаюсь честно - как это делать в компоненте ослика я не знаю. Но я не очень понимаю почему нужно именно самое последнее событие...
Какая разница какое оно, если после можно пройтись по загруженному?
Если начать анализ не по последнему событию, то сайт может оказаться загруженным частично. Вот например, я "с чистого листа" отправляю запрос на получение страницы. Так, как это самый первый запрос и у меня до этого никаких данных нет, то и получается, что мне необходимо именно в этот первый раз дождаться загрузки всех частей.

Последний раз редактировалось Stilet; 18.10.2015 в 16:43.
BecomeBetter вне форума Ответить с цитированием
Старый 18.10.2015, 16:44   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Если начать анализ не по последнему событию, то сайт может оказаться загруженным частично.
А какая разница? Аккумулируй подкачанное сайтом, и по ходу накапливания анализируй: "Это то, это не то"...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.10.2015, 09:12   #8
BecomeBetter
 
Регистрация: 18.10.2015
Сообщений: 5
По умолчанию

Вот с накопление данных мне идея и понравилась. С помощью Selenium, я так понимаю это так же можно сделать?
BecomeBetter вне форума Ответить с цитированием
Старый 19.10.2015, 09:33   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
С помощью Selenium, я так понимаю это так же можно сделать?
Да это и с твоим способом можно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.10.2015, 09:41   #10
BecomeBetter
 
Регистрация: 18.10.2015
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Да это и с твоим способом можно.
Ну, что ж, спасибо. Пойду подсказанным вами путем.
BecomeBetter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Невизульное определение неправильной кодовой страницы веб-страницы Pcrepair Общие вопросы Delphi 5 15.09.2013 13:51
вытащить текст с веб страницы patch JavaScript, Ajax 4 01.10.2012 12:19
Загрузка веб страницы usersat Общие вопросы Delphi 1 13.05.2010 16:51
CppWebBrowser, проблема поймать завершение загрузки страницы Time Общие вопросы C/C++ 0 22.08.2009 23:37
Картинка из веб страницы vinixp Мультимедиа в Delphi 9 17.02.2009 19:33