当前位置:编程学习 > C#/ASP.NET >>

C#模拟点击网页,等待网页加载完成再执行代码的问题

大概情况是这样的
winform里面有个webbrowser控件,指向一个网页,比如论坛网页
当我抓取完第一页数据的时候我要抓取第二页,我用的是模拟点击的方法加载下一页
HtmlDocument doca = this.webBrowser1.Document;  
            for (int i = 0; i < doca.All.Count; i++)          //循环查找这个对象的每一个元素
            {
                if (doca.All[i].TagName == "A")           //如果这个元素是A
                {
                    HtmlElement myelement = doca.All[i];       //就把这个元素实例化成一个HtmlElement对象
                    if (myelement.OuterText == "下一页")       //如果这个元素的文字是“下一页"
                    {
                             this.webBrowser1.Document.All[i].InvokeMember("click");
                    }
                }
            }
现在问题是我不知道怎么等webbrower加载完成下一页再执行抓取操作,总是webbrower还没加载完就往下执行了,
我用while (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete)
                Application.DoEvents();
让webbrower第一次加载首页的时候没问题,但是用上面方法再加载下一页就不行了,哪位大侠能教教我
--------------------编程问答-------------------- 为什么要用webbrowse做分页,winform不能写分页吗!真是多此一举! --------------------编程问答--------------------
引用 1 楼 qingfeng_wu 的回复:
为什么要用webbrowse做分页,winform不能写分页吗!真是多此一举!
--------------------编程问答-------------------- 在webBrowser1里有个页面加载完成后触发的时间,你找找看。 --------------------编程问答-------------------- 控件里面找个加载完成的事件里面,在这个事件里面进行相应的操作。 --------------------编程问答-------------------- 抓取500个歌名
//测试链接 http://music.baidu.com/top/dayhot
            string myHtml = string.Empty;//得到歌曲名称列表
            private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                
                WebBrowser wb = sender as WebBrowser;
                if (wb.ReadyState == WebBrowserReadyState.Complete)//是否加载完成
                {
                    HtmlDocument doca = wb.Document;
                    //开始抓取歌曲名称
                    var song_list = Regex.Matches(wb.DocumentText, @"(?i)<span[^>]*?class=(['""])song-title\s*?\1[^>]*?>\s*?<a[^>]*?>([^<>]*?)</a>\s*?(?:(?!</span>)[\s\S])*?</span>").Cast<Match>().Select(a => a.Groups[2].Value);
                    myHtml += string.Join("|", song_list);
                    foreach (HtmlElement item in doca.GetElementsByTagName("A"))//读取所有A
                    {
                        if (item.OuterText == "下一页>")//判断下一页
                        {
                            item.InvokeMember("click");
                            break;
                        }
                    }
                }
            }
--------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 5 楼 Return_false 的回复:
抓取500个歌名
//测试链接 http://music.baidu.com/top/dayhot
            string myHtml = string.Empty;//得到歌曲名称列表
            private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                
                WebBrowser wb = sender as WebBrowser;
                if (wb.ReadyState == WebBrowserReadyState.Complete)//是否加载完成
                {
                    HtmlDocument doca = wb.Document;
                    //开始抓取歌曲名称
                    var song_list = Regex.Matches(wb.DocumentText, @"(?i)<span[^>]*?class=(['""])song-title\s*?\1[^>]*?>\s*?<a[^>]*?>([^<>]*?)</a>\s*?(?:(?!</span>)[\s\S])*?</span>").Cast<Match>().Select(a => a.Groups[2].Value);
                    myHtml += string.Join("|", song_list);
                    foreach (HtmlElement item in doca.GetElementsByTagName("A"))//读取所有A
                    {
                        if (item.OuterText == "下一页>")//判断下一页
                        {
                            item.InvokeMember("click");
                            break;
                        }
                    }
                }
            }


顶 --------------------编程问答-------------------- webbrowser 貌似要回传 然后你才可以获取到上面的html --------------------编程问答-------------------- 为什么要用webbrowser 只是为了模拟点击? --------------------编程问答--------------------
引用 9 楼 xgt2010 的回复:
为什么要用webbrowser 只是为了模拟点击?


主要为了获取网页执行AJAX返回的数据,方便一点 --------------------编程问答-------------------- wb.ReadyState == WebBrowserReadyState.Complete --------------------编程问答--------------------
引用 11 楼 Jxb_Sir 的回复:
wb.ReadyState == WebBrowserReadyState.Complete


这个没用啊,模拟点击之后,webbrowser的状态一直是complete --------------------编程问答--------------------
引用 12 楼 yjztshl 的回复:
Quote: 引用 11 楼 Jxb_Sir 的回复:

wb.ReadyState == WebBrowserReadyState.Complete


这个没用啊,模拟点击之后,webbrowser的状态一直是complete


ajax没不需要wb啊,wb并没有方便点,反而处理麻烦,用http不是更好吗。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,