0

大家好,在过去的几周里,我有一个问题困扰着我。

我要完成的工作:我需要一个能够更改用户代理(在启动时)和引用者的网络浏览器控件。但最重要的是查看 url 响应的能力。我的意思是,例如,如果您导航到一个网站,您会返回图像/Javascripts 文件/动态 URL 作为响应,我需要访问其中一些具有动态变量的那些 url(常规 Web 浏览器控制不会向您显示这些并且您可以除了使用提琴手核心之外,不要以任何方式访问它)。

我可以使用 webbrowser + fiddlercore 来做到这一点,我可以使用这些 url 地址查看并执行任何操作。问题是如果你运行这个程序的几个实例(或者有时如果程序有一些自动化来处理 url 响应)它会卡住或不起作用。我尝试修复它并使其工作,但这是一种无法正常工作的 hacky 解决方案。我需要一种简单的方法来访问这些 url,就像你使用 httpwebrequest 一样,但是作为一个 webbrowser。为什么我需要它作为网络浏览器?我的工作方式我需要执行所有跟踪像素、脚本和图像等。httpwebrequest 中的普通 webbrowser 行为你不能只是导航,所有脚本都将作为 webbrowser 执行,或者你可以吗?

4

1 回答 1

1

使用 WinForms 应用中的 System.Windows.Forms.WebBrowser 控件,将 webBrowser.URL 属性设置为您感兴趣的页面的 URL。

webbrowser 的 DocumentCompleted 事件在页面加载后触发。任何动态加载的 JavaScript 都应该在那时完成。挂钩 DocumentCompleted 事件并使用 webbrowser.Document.Images 获取页面上所有图像元素的列表。从这些图像中,您可以获取它们的 SRC 属性,其中包含它们的 URL,包括任何挂在末尾的查询参数。您可以使用 webbrowser.Document.Links 获取页面上所有超链接的列表。对于其他感兴趣的 HTML 元素,您可以使用 GetElementsByTagName("foo") 从页面中获取具有该标签名称的所有元素,然后挖掘它们的属性以提取 URL 属性。

使用 webbrowser.Document,您可以访问任何 HTML 元素,无论是静态创建的还是动态创建的。

您无法通过 webbrower.Document 获得的是使用 XMLHttpRequest() 异步加载的数据,因为该数据不是浏览器文档对象模型的一部分。带有脚本错误按钮的网页将难以拦截。

但是,如果您知道页面上执行的 JavaScript 将数据存储在何处,则可以使用 webbrowser.Document.InvokeScript() 访问它。例如,如果页面上的 JavaScript 将 URL 存储在窗口对象的 mydata 属性中,您可以尝试使用 webbrowser.Document.InvokeScript("window.mydata") 或一些变体来将 mydata 的值检索到 C# 应用程序中。

于 2012-11-08T20:14:12.263 回答