如何在客户端 C# 应用程序中模拟 JavaScript

发布于 2024-07-21 17:19:59 字数 504 浏览 10 评论 0原文

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

a href = "javascript:buildLink(1)"

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

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

I'm writing a web crawler (web spider) that crawl all links in a website.
My application is a Win32 App, written in C# with .Net framework 3.5.
Now I'm using HttpWebRequest an HttpWebResponse to communicate with the web server.
I also built my own Http Parser that can parse anything I want.
I found all link like "href", "src", "action"... in the parse.
But I can not solve one problem: Simulate Client Script in the page (like JS and VBS)
For example, if a link like:

a href = "javascript:buildLink(1)"

... with buildLink(parameter) is a Javascript function that will make a custom link due to the parameter.

Please help me to solve this problem. How to simulate JavaScript in this app? I can parse the HTML source code and take all JavaScript code to another file, but how to simulate a function of it?
Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

蘸点软妹酱 2024-07-28 17:20:00

您基本上假装是一个浏览器,只不过 HttpWebRequest 只为您做网络工作。

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

以下是我在搜索“ie web 浏览器控件”后发现的一些基本链接:

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

You are basically pretending to be a browser, except that HttpWebRequest only does the networking stuff for you.

I would recommend using the ie web browser control and interop'ing into that from your c# application. That will allow you to run JavaScript, set variables, post, etc etc.

Here's some basic links I found after a search for "ie web browser control":

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

如若梦似彩虹 2024-07-28 17:20:00

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

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

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

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

  1. 使用 Selenium API 告诉浏览器加载页面。
  2. 使用 Selenium API 查找所有 这样,您的蜘蛛仅在必要时使用 Selenium(没有 javascript 链接的

页面可以由您已有的无浏览器蜘蛛代码处理)。 .wikipedia.org/wiki/Embarrassingly_parallel" rel="nofollow noreferrer">令人尴尬的并行工作负载,您可以轻松地同时运行多个 Selenium 进程(无论是在一台计算机上还是在其他计算机上)。

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

为了捕获这种情况(和其他情况),蜘蛛可能必须对所有具有

Your only real option is to automate a browser. As other answers have said, you cannot reliably simulate browser javascript without having a complete DOM.

There are fortunately ways to automate the browser, check out Selenium.

It has a C# API, so you can control the browser from C#.

Use your .NET web crawler code to crawl the site. Whenever you encounter a href="javascript:... link, handle the page containing the link in Selenium:

  1. Use the Selenium API to tell the browser to load the page.
  2. Use the Selenium API to find all links on the page.

This way, your spider only uses Selenium when necessary (pages without javascript links can be handled by the browser-less spider code you already got). And since this is an embarrassingly parallel workload, you could easily have multiple Selenium processes running at the same time (either on one computer or on other computers).

But remember that href="javascript is hardly the only way a page can have dynamic links. The more common case is probably that a onload or $(document).ready() script manipulates the DOM and adds links that way.

To catch that case (and others), the spider probably will have to use Selenium for all pages that have a <script> tag.

故事与诗 2024-07-28 17:20:00

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

如果我要解决这个问题,我可能会在 Rhino,在其之上有某种 RPC 框架,以便我可以从我的主应用程序与它进行通信。

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

This is a problem which is not easily solved. You could consider taking one of the existing JavaScript implementations and porting or interfacing with it somehow.

If I were tackling this problem, I'd probably build a small side application in Java on top of Rhino, with some sort of RPC framework layered on top of that so that I could communicate with it from my primary application.

Unfortunately, without having a complete DOM implementation on top of that, you would be limited to only very simple javascript.

再可℃爱ぅ一点好了 2024-07-28 17:20:00

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

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

You could execute the javascript by using the MS JScript engine or something similar.

This isn't guaranteed to work, especially if the javascript tries to access the DOM, or somesuch... But for simple scripts, it might be enough.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文