.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
}