.NET 4.x Многопоточный парсер сайтов: как обрабатывать javaScript - C#
Формулировка задачи:
Здравствуйте!
Есть задание написать парсер 3-х сайтов с извлечением определенной информации (для примера картинки). Каждый сайт должен парсится в отдельном потоке. Все бы ничего, кажется создаем поток, в нем объект WebRequest и парсим. Но вся проблема в том, что некоторые картинки можно получить только отработав javaScript функцию на сайте. А как известно WebRequest это не делает.
Можно конечно извратиться и сделать что-то наподобие этого:
Однако если в методе browser_DocumentCompleted выполнять javaScript, то соответственно страница перезагружается и
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(); }
самое интересное
в атрибуте 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 }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д