Управление веб-браузером C #: переход к списку URL-адресов - PullRequest
1 голос
/ 17 августа 2010

Я работаю над веб-сканером.Я использую элемент управления Webbrowser для этой цели.У меня есть список URL-адресов, хранящихся в базе данных, и я хочу просмотреть все эти URL-адреса один за другим и проанализировать HTML.

Я использовал следующую логику

            foreach (string href in hrefs)
            {
                webBrowser1.Url = new Uri(href);
                webBrowser1.Navigate(href);
            }

Я хочу выполнить некоторую работу в событии "webBrowser1_DocumentCompleted" после полной загрузки страницы.Но «webBrowser1_DocumentCompleted» не получает элемент управления, поскольку я использую цикл здесь.Он получает управление только тогда, когда последний URL-адрес в "hrefs" перемещается и элемент управления выходит из цикла.

Каков наилучший способ решения такой проблемы?

Ответы [ 2 ]

4 голосов
/ 17 августа 2010

Храните список где-нибудь в вашем штате, а также указатель того, куда вы попали.Затем в событии DocumentCompleted проанализируйте HTML-код и перейдите к следующей странице.

(Лично я бы не использовал элемент управления WebBrowser для сканирования в Интернете ... Я знаю, это означает, чтосправиться с JavaScript, но распараллеливание будет намного сложнее, чем использование нескольких WebRequest или WebClient объектов.)

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

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

Есть только один способ сделать это одновременно,

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

foreach(string href in hrefs){
   TabItem item = new TabItem();
   WebBrowser wb = new WebBrowser();
   wb.DocumentCompleted += wb_DocumentCompleted;
   wb.Url = href;
   item.Child = web;
   tabControl1.Items.Add(item);
}


private void wb_DocumentCompleted(object sender, EventArgs e){
 /// do your stuff...
}

Чтобы улучшить описанный выше метод, вы должны увидеть, как вы можете создать несколько элементов вкладок в разных потоках пользовательского интерфейса, это довольно интересная тема для обсуждения здесь, но это все еще возможно.

Другой способ - использовать очередь ...

private static Queue<string> queue = new ...

foreach(string href in hrefs){
    queue.Enqueue(href);
}

private void webBrowser1_DocumentCompleted(object sender, EventArgs e){
    if(queue.Count>0){
        webBrowser1.Url = queue.Dequeue();
    }
}
...