«System.Net.WebException» в HtmlAgilityPack с использованием цикла Parallel.ForEach

У меня есть парсер, который обрабатывает около 2000 страниц, которые я пытался ускорить с помощью цикла Parallel.ForEach. Мой текущий код (обрезанный для краткости):

Parallel.ForEach(dataTable1.AsEnumerable(), row =>
{
    scrape();
}
);

public void scrape()
{
    HtmlWeb htmlWeb = new HtmlWeb();
    HtmlAgilityPack.HtmlDocument doc = htmlWeb.Load("http://www.website.com");
    doScraping(doc);
}

Когда это использовало обычный цикл foreach, это сработало. Теперь он будет обрабатывать некоторое количество строк, а затем я начинаю получать следующие исключения при попытке получить HTMLDocument:

В System.dll произошло первое случайное исключение типа «System.Net.WebException».

Возникло первое случайное исключение типа «System.Net.WebException» в HtmlAgilityPack.dll.

Время операции истекло

Что вызывает тайм-аут при работе в параллельном цикле? Он пройдет через первые 150-300 строк, а затем истечет время ожидания для каждой последующей строки.


person Soma Holiday    schedule 04.05.2013    source источник
comment
Похоже, что сайт, который вы хотите удалить, блокирует вас из-за огромного количества запросов, которые вы выполняете параллельно, что выглядит для них как DOS-атака.   -  person shriek    schedule 04.05.2013
comment
@shreek: Я не думаю, что сайт меня блокирует. Я могу получить к нему доступ из браузера, хотя постоянно получаю ошибки тайм-аута. Кроме того, если я перезапускаю приложение, оно временно снова работает.   -  person Soma Holiday    schedule 05.05.2013
comment
Добавление новых ParallelOptions { MaxDegreeOfParallelism = 4 }, похоже, уменьшает мою проблему до очень случайного тайм-аута. Я запускаю приложение на 4-ядерном процессоре. Мне все еще любопытно, почему параллель не справляется с этим лучше.   -  person Soma Holiday    schedule 05.05.2013


Ответы (1)


Я думаю, это потому, что у вас есть ограничение на максимальное количество одновременных подключений HttpWebRequest к сайту. Проверьте этот параметр .NET: элемент ConnectionManagement (сетевые настройки).

Вы также можете сделать это программно: Как я могу программно удалить ограничение на 2 соединения в WebClient

Он работает с браузером параллельно, потому что использует другой процесс.

person Simon Mourier    schedule 05.05.2013