在 HtmlAgilityPack 中运行脚本

Posted

技术标签:

【中文标题】在 HtmlAgilityPack 中运行脚本【英文标题】:Running Scripts in HtmlAgilityPack 【发布时间】:2012-07-08 17:38:10 【问题描述】:

我正在尝试抓取特定网页,其工作原理如下。

首先加载页面,然后运行某种 javascript 来获取填充页面所需的数据。我对这些数据感兴趣。

如果我使用 htmlAgilityPack 获取页面 - 脚本不会运行,所以我得到的内容基本上是一个空白页面。

有没有办法强制它运行脚本,以便我可以获取数据?

【问题讨论】:

看看phantomjs.org 也可以考虑研究 Selenium。 【参考方案1】:

您将获得服务器返回的内容 - 与 Web 浏览器相同。当然,Web 浏览器会运行这些脚本。 Html Agility Pack 只是一个 HTML 解析器 - 它无法解释 javascript 或将其绑定到文档的内部表示。如果你想运行脚本,你需要一个网络浏览器。您的问题的完美答案将是一个完整的“无头”网络浏览器。它包含了一个 HTML 解析器、一个 javascript 解释器和一个模拟浏览器 DOM 的模型,所有这些都一起工作。基本上,那是一个网络浏览器,除了没有渲染部分。目前还没有这样的东西可以完全在 .NET 环境中运行。

最好的办法是使用WebBrowser 控件,并在Internet Explorer 中以编程控制方式实际加载和运行页面。这不会很快或很漂亮,但它会做你需要做的事情。

另请参阅我对类似问题的回答:Load a DOM and Execute javascript, server side, with .Net,其中讨论了 .NET 中用于执行此操作的可用技术。不幸的是,大多数部分现在都存在,但还没有完全到位或者没有以正确的方式集成。

【讨论】:

WebBrowser 控件引起的 GDI+Handle/Memory 泄漏是促使我寻求替代方案的原因。很抱歉,这个问题没有适当的解决方案。 无赖。是的,这是尚未完全实现的地方之一,至少如果您将其全部保存在 .NET 中。如果您可以使用混合应用程序,肯定有办法做到这一点,但会更复杂。我一直希望有人能够完全在 .NET 中创建真正统一的无头浏览器。但这绝对不是一项小任务。就像我说的那样,很多东西都在那里,但需要有人把它们放在一起。【参考方案2】:

您可以为此使用 Awesomium,http://www.awesomium.com/。它工作得相当好,但不支持 x64 并且不是线程安全的。我正在使用它 24x7 全天候扫描一些网站,它至少连续几天运行良好,但通常会崩溃。

【讨论】:

以上是关于在 HtmlAgilityPack 中运行脚本的主要内容,如果未能解决你的问题,请参考以下文章

htmlagilitypack - 删除脚本和样式?

使用 HtmlAgilityPack 解析 HTML 页面

ASP.NET 网络爬虫小研究 HtmlAgilityPack

求C# HtmlAgilityPack用法的完整例子。

HtmlAgilityPack 总结

HtmlAgilityPack - 找不到文件