【问题标题】:'System.Net.WebException' in HtmlAgilityPack using Parallel.ForEach loop使用 Parallel.ForEach 循环的 HtmlAgilityPack 中的“System.Net.WebException”
【发布时间】:2013-05-04 16:22:23
【问题描述】:

我有一个网络抓取工具,可以处理大约 2,000 个页面,我尝试使用 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”类型的第一次机会异常

在 HtmlAgilityPack.dll 中发生了“System.Net.WebException”类型的第一次机会异常

操作超时

在并行循环中操作时发生超时的原因是什么?它将通过前 150-300 行,然后对于后续的每一行都会超时。

【问题讨论】:

  • 听起来你想废弃的网站阻止了你,因为你并行执行大量请求,在他们看来这就像 DOS 攻击。
  • @shriek:我不认为该网站阻止了我。当我不断收到超时错误时,我可以从浏览器访问它。另外,如果我重新启动应用程序,它会暂时再次运行。
  • 添加新的 ParallelOptions { MaxDegreeOfParallelism = 4 } 似乎可以将我的问题减少到非常偶然的超时。我在 4 核处理器上运行该应用程序。我仍然很好奇为什么并行不能更好地处理这个问题。

标签: c# html-agility-pack parallel.foreach


【解决方案1】:

我认为这是因为您对同时连接到站点的 HttpWebRequest 的最大数量有限制。检查此 .NET 设置:ConnectionManagement Element (Network Settings)

您也可以通过编程方式进行:How can I programmatically remove the 2 connection limit in WebClient

它与浏览器并行工作,因为它使用另一个进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2021-05-21
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多