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不能写分页吗!真是多此一举! --------------------编程问答-------------------- --------------------编程问答-------------------- 在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;
}
}
}
}
顶 --------------------编程问答-------------------- webbrowser 貌似要回传 然后你才可以获取到上面的html --------------------编程问答-------------------- 为什么要用webbrowser 只是为了模拟点击? --------------------编程问答--------------------
主要为了获取网页执行AJAX返回的数据,方便一点 --------------------编程问答-------------------- wb.ReadyState == WebBrowserReadyState.Complete --------------------编程问答--------------------
这个没用啊,模拟点击之后,webbrowser的状态一直是complete --------------------编程问答--------------------
ajax没不需要wb啊,wb并没有方便点,反而处理麻烦,用http不是更好吗。
补充:.NET技术 , C#