4

我正在编写一个网络爬虫(网络蜘蛛)来爬取网站中的所有链接。我的应用程序是一个 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 代码放到另一个文件中,但是如何模拟它的功能呢?谢谢。

4

4 回答 4

3

你基本上是在假装自己是一个浏览器,除了 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

于 2009-05-27T04:53:58.103 回答
3

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

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

它有一个C# API,因此您可以从 C# 控制浏览器。

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

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

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

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

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

于 2009-05-27T05:12:28.953 回答
2

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

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

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

于 2009-05-27T04:49:23.003 回答
1

您可以使用 MS JScript 引擎或类似的东西来执行 javascript 。

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

于 2009-05-27T05:07:48.597 回答