【问题标题】:HtmlAgility Pack Parallelisation VS Winforms HtmlDocument SpeedHtmlAgilityPack 并行化 VS Winforms Html 文档速度
【发布时间】:2026-01-03 18:30:01
【问题描述】:

我有一个程序,我正试图尽快开始工作。该程序会加载许多不同的网站并对它们进行一些抓取。

我曾经使用 Forms.HtmlDocument 执行抓取(我基本上是使用 WebRequests 下载它,然后使用 WebBrowser 控件将其推送到文档中) - 但是由于无法强制执行,因此不可能干净地并行化当它不是主线程时要更新的 WebBrowser。

所以我决定尝试 HtmlAgilityPack,认为也许我可以并行化它。但是后来我阅读了以下帖子:

How to get max performance using Parallel.For/ForEach? (performance timings included)

这表明它并不能很好地并行化。

转换所有代码需要一些时间(由于怪癖和这一切的复杂性) - 但是我想知道它是否值得。如果我避免使用 WebGet(而是使用 WebRequest 获取流并将其推送到 AgilityPack) - 这会给我带来有用的性能提升吗?目前每次迭代大约需要 19 秒,大部分时间都在等待页面下载。

将考虑任何其他想法。谢谢。

编辑:当我们在这里时,使用这两种方法是否会提高速度(即使在单线程环境中?)

【问题讨论】:

    标签: c# webbrowser-control html-agility-pack dom


    【解决方案1】:

    就我而言,htmlagilitypack 运行良好。一个大问题是 RFC 合规性,当您创建运行速度尽可能快的应用程序时,应该覆盖它。

    1)在 main 方法的开头添加这个

    System.Net.ServicePointManager.DefaultConnectionLimit = 100;
    

    2) 与普通多线程库而不是 tpl 并行化。

    【讨论】:

    • “普通多线程库”我假设您的意思是启动 Threads 而不是 System.Parallel?
    • 是的,启动线程为您提供更多控制。虽然我没有深入研究细节,但 TPL 已针对创建处理器可以支持的尽可能多的线程进行了优化。相反,在这种情况下并行化应用程序的原因不是为了使处理器饱和,而是为了并行建立许多 http 连接。