我需要从一个以框架结构的网站获取源代码。
我已经有一个Windows Forms应用程序,它集成了WebBrowser功能 当我右键单击并选择“查看源代码”时,它会打开一个新的文本文档,其中包含我需要的信息。
我已经尝试了<C-H>
,webBrowser.Document
和webBrowser.DocumentText
,但所有这些只给了我其他信息,我不需要。
该网站不是静态的(这是一个聊天),它不会进行会话,因此我无法使用webBrowser.DocumentStream
。
我需要持续连接几个小时的网站,而无需刷新网站。我没有看到使用Webclient.DownloadFile
中的webBrowser
的方法。
根据要求,这是网站,我在谈论:http://server2.webkicks.de/stackoverflow-test/
您只需在第三个文本框中填写一些用户名即可以访客身份登录。
答案 0 :(得分:1)
由于您希望获得动态html内容,而webBrowser.Document
,webBrowser.DocumentText
和webBrowser.DocumentStream
无法满足您的愿望。
诀窍:您始终可以从C#运行自定义JavaScript代码。以下是您在WebBrowser
控件中获取当前HTML的方法:
webBrowser.Document.InvokeScript("eval", new string[]{"document.body.outerHTML"});
请参阅How to inject Javascript in WebBrowser control?。
<强>更新强>
对于iframe
内的document
,您可以尝试以下操作:
webBrowser.Document.InvokeScript("eval", new string[]{"document.querySelector(\"iframe\").contentWindow.document.documentElement.outerHTML"});
另一次更新
由于您的网站包含frame
而不是iframe
,因此您可以通过以下方式获取frame
的html内容:
webBrowser.Document.InvokeScript("eval", new string[]{"document.querySelector(\"frame[name='mainframe'\").contentWindow.document.documentElement.outerHTML"});
最终测试和工作更新
querySelector
无效WebControl
。因此,解决方法是:向id
提供一些<frame>
,并使用<frame>
获取id
元素。以下是您完成任务的方法。
HtmlElement frame = webBrowser1.Document.GetElementsByTagName("frame").Cast<HtmlElement>().FirstOrDefault(m => m.GetAttribute("name") == "mainframe");
if (frame != null)
{
frame.Id = "RandID_" + DateTime.Now.Ticks;
string html = webBrowser1.Document.InvokeScript("eval", new string[] { "document.getElementById('" + frame.Id + "').contentWindow.document.documentElement.outerHTML" }).ToString();
Console.WriteLine(html);
}
else
{
MessageBox.Show("Frame not found");
}
答案 1 :(得分:0)
如果您的网站目标使用ssl协议(https),您可以尝试添加这样的用户代理:
using (WebClient myWebClient = new WebClient())
{
myWebClient.Headers.Add("User-Agent: Other");
myWebClient.DownloadFile(new System.Uri("https://mywebsite.com//somefile"), "D:\\temp\\somefile");
}
如果您的网站目标需要登录,那么您使用chrome登录您的websitetarget并使用EditThisCookie扩展程序复制您的Cookie并尝试以下内容:
using (WebClient myWebClient = new WebClient())
{
myWebClient.Headers.Add("User-Agent: Other");
myWebClient.Headers.Add(HttpRequestHeader.Cookie, "mycookies copies from EditThisCookie");
myWebClient.DownloadFile(new System.Uri("https://mywebsite.com//somefile"), "D:\\temp\\somefile");
}