【问题标题】:How to simulate JavaScript in a client C# Applications如何在客户端 C# 应用程序中模拟 JavaScript
【发布时间】:2009-05-27 04:38:35
【问题描述】:

我正在编写一个网络爬虫(网络蜘蛛)来爬取网站中的所有链接。 我的应用程序是一个 Win32 应用程序,用 C# 和 .Net framework 3.5 编写。 现在我正在使用 HttpWebRequest 和 HttpWebResponse 与 Web 服务器进行通信。 我还构建了自己的 Http Parser,它可以解析任何我想要的东西。 我在解析中找到了像“href”、“src”、“action”这样的所有链接。 但我无法解决一个问题:在页面中模拟客户端脚本(如 JS 和 VBS) 例如,如果链接如下:

a href = "javascript:buildLink(1)"

... with buildLink(parameter) 是一个 Javascript 函数,它会根据参数创建自定义链接。

请帮我解决这个问题。如何在这个应用程序中模拟 JavaScript?我可以解析 HTML 源代码并将所有 JavaScript 代码放到另一个文件中,但是如何模拟它的功能呢? 谢谢。

【问题讨论】:

  • c0mm3nt 你找到解决办法了吗?

标签: javascript simulation simulate


【解决方案1】:

您唯一真正的选择是自动化浏览器。正如其他答案所说,如果没有完整的 DOM,您将无法可靠地模拟浏览器 javascript。

幸运的是,有一些方法可以使浏览器自动化,请查看Selenium

它有一个C# API,所以你可以用C#控制浏览器。

使用您的 .NET 网络爬虫代码来爬取网站。每当遇到href="javascript:... 链接时,请在 Selenium 中处理包含该链接的页面:

  1. 使用 Selenium API 告诉浏览器加载页面。
  2. 使用 Selenium API 查找页面上的所有链接。

这样,您的蜘蛛仅在必要时使用 Selenium(没有 javascript 链接的页面可以由您已经获得的无浏览器蜘蛛代码处理)。由于这是embarrassingly parallel 工作负载,您可以轻松地同时运行多个 Selenium 进程(在一台计算机或其他计算机上)。

但请记住,href="javascript 并不是页面拥有动态链接的唯一方式。更常见的情况可能是 onload$(document).ready() 脚​​本操作 DOM 并以这种方式添加链接。

为了捕捉这种情况(和其他情况),蜘蛛可能必须对所有具有<script> 标签的页面使用 Selenium。

【讨论】:

    【解决方案2】:

    你基本上是在假装自己是一个浏览器,除了 HttpWebRequest 只为你做网络工作。

    我建议使用 ie web 浏览器控件并从您的 c# 应用程序中互操作。这将允许您运行 JavaScript、设置变量、发布等。

    以下是我在搜索“ie web browser control”后发现的一些基本链接:

    http://www.c-sharpcorner.com/UploadFile/mahesh/WebBrowserInCSMDB12022005001524AM/WebBrowserInCSMDB.aspx http://support.microsoft.com/kb/313068

    【讨论】:

      【解决方案3】:

      这是一个不容易解决的问题。您可以考虑采用现有的 JavaScript 实现之一并以某种方式移植或与之交互。

      如果我要解决这个问题,我可能会在 Rhino 之上用 Java 构建一个小型侧应用程序,并在其上放置某种 RPC 框架,以便我可以从我的主应用程序与其通信.

      不幸的是,如果没有完整的 DOM 实现,您将只能使用非常简单的 javascript。

      【讨论】:

        【解决方案4】:

        您可以通过 using the MS JScript engine 或类似的方式执行 javascript。

        这不能保证有效,特别是如果 javascript 尝试访问 DOM 或类似的...但对于简单的脚本,这可能就足够了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-11
          • 1970-01-01
          • 1970-01-01
          • 2013-05-11
          • 1970-01-01
          • 2020-04-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多