我有一个web scraper,处理大约2,000页,我尝试使用Parallel.ForEach循环加速。我当前的代码(修剪简洁)是:使用Parallel.ForEach循环的HtmlAgilityPack中的'System.Net.WebException'
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.Net.WebException”的第一次机会异常出现在System.dll中
类型“System.Net.WebException”的第一次机会异常出现在HtmlAgilityPack.dll
的操作超时
是什么原因导致的超时在并行循环操作时会发生什么?它将通过第一个150-300行,然后每个后续行超时。
听起来像你想要报废的网站会阻止你,因为你并行做了大量的请求,这看起来像DOS攻击。 – shriek 2013-05-04 17:32:12
@shriek:我不认为该网站阻止了我。我可以从浏览器访问它,同时我不断收到超时错误。另外,如果我重新启动应用程序,它会暂时再次运行。 – 2013-05-05 03:28:36
添加新的ParallelOptions {MaxDegreeOfParallelism = 4}似乎将我的问题减少到非常偶然的超时。我正在4核心处理器上运行应用程序。我仍然很好奇为什么并行不能更好地处理这个问题。 – 2013-05-05 04:12:42