.NET 4.x Многопоточный парсер сайтов: как обрабатывать javaScript - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Есть задание написать парсер 3-х сайтов с извлечением определенной информации (для примера картинки). Каждый сайт должен парсится в отдельном потоке. Все бы ничего, кажется создаем поток, в нем объект WebRequest и парсим. Но вся проблема в том, что некоторые картинки можно получить только отработав javaScript функцию на сайте. А как известно WebRequest это не делает. Можно конечно извратиться и сделать что-то наподобие этого:
private void button1_Click(object sender, EventArgs e) {
            RunThread();
}
 
private void runBrowserThread(Uri url) {
    var th = new Thread(() => {
        var br = new WebBrowser();
        br.DocumentCompleted += browser_DocumentCompleted;
        br.Navigate(url);
        Application.Run();
    });
    th.SetApartmentState(ApartmentState.STA);
    th.Start();
}
 
void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
    var br = sender as WebBrowser;
    HtmlElementCollection collection = br.Document.GetElementsByTagName("a");
                foreach (HtmlElement element in collection)
                {
                    if (element.GetAttribute("rel") == "phone")
                    { 
                         element.InvokeMember("click");
                    }
                }
    HtmlElement element = br.Document.GetElementsByTagName("img")[0];
    if (element.GetAttribute("class") == "contactimg")
    {
         imgUrl = htmlElement.GetAttribute("src");
    }
    this.Invoke(new MethodInvoker(() =>
    {
         //do something;
         }), null);
    Application.ExitThread();
 
}
Однако если в методе browser_DocumentCompleted выполнять javaScript, то соответственно страница перезагружается и

самое интересное

в атрибуте br.DocumentStream выдается NullPointer с текстом ""br.DocumentStream" запустило исключение типа "System.IO.FileNotFoundException"". Может у кого-нибудь есть более изящные способы решения данной задачи? Или хотя бы решение как исправить данную ошибку)) Заранее благодарен

Решение задачи: «.NET 4.x Многопоточный парсер сайтов: как обрабатывать javaScript»

textual
Листинг программы
void BrowserDocumentCompleted(object sender,
        WebBrowserDocumentCompletedEventArgs e)
{
  if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
    return; 
 
  //The page is finished loading 
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы