【问题标题】:c# Webbrowser control cannot get generated HTML sourcec# Webbrowser控件无法获取生成的HTML源
【发布时间】:2018-08-27 09:09:09
【问题描述】:

我正在尝试获取数据(由脚本生成)并且我正在使用 webbrowser 控件应用来自:C# webbrowser Ajax call的介绍

我的第一个主要代码是:

webBrowser1.Navigate("https://mobile.bet365.com/#type=Coupon;key=1-1-13-33977144-2-8-0-0-1-0-0-4100-0-0-1-0-0-0-0-0-0-0-0;ip=0;lng=1;anim=1");
while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
{
    System.Threading.Thread.Sleep(10);
    Application.DoEvents();
}
File.WriteAllText(@"C:\pagesource.txt", webBrowser1.DocumentText);

我得到的页面源不是浏览器显示的。 当我修改如下代码时:

webBrowser1.Navigate("https://mobile.bet365.com/#type=Coupon;key=1-1-13-33977144-2-8-0-0-1-0-0-4100-0-0-1-0-0-0-0-0-0-0-0;ip=0;lng=1;anim=1");
while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
{
    System.Threading.Thread.Sleep(10);
    Application.DoEvents();
}
MessageBox.Show("Loading completed");
File.WriteAllText(@"C:\pagesource.txt", webBrowser1.DocumentText);

当然我必须在显示对话框时按 OK。现在页面源是正确的。

我不明白怎么会这样。我只想自动获取页面源(无需任何点击或用户操作)。

【问题讨论】:

  • 是需要浏览器控件还是只是想获取文档源?
  • webbrowser 控件不需要。我尝试解决并找出问题,但不知道如何解决它
  • 您的网址是否可能包含敏感数据? (关键属性)刚测试的时候记下...
  • 不是真的,它已经发布了。它显示了 bet365 网站上的足球比赛时间表。 (关键数据包含 ids)

标签: javascript c# ajax webbrowser-control


【解决方案1】:

因此不需要 webbrowser 我会尝试切换到获取页面源的不同方法(同时避免 webbrowser 控件的开销)。

请注意,阅读 HTML 源代码非常困难 - 一旦页面布局发生更改或额外的 javascript 脚本启动,您就会遇到问题。要从网页中检索数据,您应该搜索 rss 提要,例如。你可以比html页面源更好地解析。

但是,由于您提到的网址目前正在维护中,我无法测试我的以下代码。我再次测试了我自己的页面,它在那里工作。当然,在我自己的页面上,没有像你的 url 上那么多的 javascript。

下面我展示了3种不同的获取页面源的方法:

        string pageSource1 = null, pageSource2 = null, pageSource3 = null;
        try
        {
            using (System.Net.WebClient webClient = new System.Net.WebClient())
            {
                // perhaps fake user agent?
                webClient.Headers.Add("USER_AGENT", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36 OPR/51.0.2830.55");

                //
                // option 1: using webclient download string (simple call)
                pageSource1 = webClient.DownloadString(url);

                //
                // option 2: getting a stream... (if you prefer using a stream, eg. not reading the whole page until the end)
                var webClientStream = webClient.OpenRead(url);
                if (webClientStream != null)
                {
                    using (System.IO.StreamReader streamReader = new System.IO.StreamReader(webClientStream))
                    {
                        pageSource2 = streamReader.ReadToEnd();
                    }
                }
            }

            //
            // option3: using webrequest (with webrequest/webresponse you can rebuild the browser behavior eg. walking pages)
            System.Net.WebRequest webRequest = System.Net.WebRequest.Create(url);
            webRequest.Method = "GET";

            var webResponse = webRequest.GetResponse();
            var webResponseStream = webResponse.GetResponseStream();
            if (webResponseStream != null)
            {
                using (System.IO.StreamReader streamReader = new System.IO.StreamReader(webResponseStream))
                {
                    pageSource3 = streamReader.ReadToEnd();
                }
            }
        }
        catch (System.Net.WebException exc)// for web
        {
            Console.WriteLine($"Unable to download page source: {exc.Message}");
            // todo - safely handle...
        }
        catch (System.IO.IOException exc)//for stream
        {
            Console.WriteLine($"Unable to download page source: {exc.Message}");
            // todo - safely handle...
        }

希望对你有所帮助!

【讨论】:

  • 谢谢,但它不起作用。此页面包含由 javascript 生成的内容,因此我认为获取页面源(如果可能)的唯一方法是使用 webbrowser 控件或 Selenium。我专注于网络浏览器控制。
  • 使用 firefox 开发者网络插件,我找到了以下网址:mobile.bet365.com/V6/sport/coupon/… - 这样我就可以使用 webbrowser 下载。检查'
    谢谢。这是我应该检索的数据。但我的问题不仅是关于最终结果,还有关于 webbrowser 控件的工作方式:为什么加载只有在我做了一些愚蠢的事情之后才完全完成(显示一个对话框并关闭它)。
  • 我认为问题出在 WebBrowser 控件的设计上。我假设您的网络浏览器正在主 STA GUI 线程中运行。请尝试让它在另一个 STA 线程中运行,直到您收到 documentcompleted 事件。在下面so post中有很好的解释
猜你喜欢
相关资源
最近更新 更多
热门标签