作者wellwind (..)
看板C_Sharp
标题Re: [问题] webbrowser 存取多个网址
时间Tue Sep 28 14:27:46 2010
WebBrowser控制项在执行Navigate()後会丢出一个Thread
避免你网页还在读取的时候因为还没跑到程式结尾所以看起来整个当掉
而DocumentComplete事件会在在整个WebBrowser读取网页到结束前会触发好几次
对网页内容进行操作的话webBrowser1.ReadyState必须是Interactive或Complete
以一般读取网页的状况看的话
Interactive :
已经看得到网页画面也可以对画面进行操作,但是可能有些图片还没读取完等等
Complete :
网页画面已经完全读取完毕,包含所有的图片等都读取完成
所以至少要在Ineractive之後才可以对网页进行操作
要Lading比较久的话ReadyState会出现Loading,一样会触发DocumentComplete事件
这时候处理资讯就可能会漏掉了
所以可以加上webBrowser1.ReadyState == WebBrowserReadyState.Complete
在整个网页读取完成後再进行你要的动作
依照你的要求的话 有两个方法可以做
1. 写在DocumentComplete事件中
private int urlIndex = 0;
private void webBrowser1_DocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser browser = (WebBrowser)sender;
if (browser.ReadyState == WebBrowserReadyState.Complete)
{
// Do something....
// 如果还有下一个url,就浏览
if (urlIndex > urlList.Count)
{
browser.Navigate(urlList[urlIndex]);
++urlIndex;
}
}
}
2. 不使用DocumentComplete事件,在WebBrowser进行浏览後等待浏览完毕後做要做的动作
foreach (string url in urls)
{
webBrowser1.Navigate(url);
// 等待网页读取完成,
// Application.DoEvents()可以让程式看起来不像当掉
while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
Application.DoEvents();
// Do something...
}
※ 引述《marcoyan (毎日とてもねたい)》之铭言:
: ※ 引述《marcoyan (毎日とてもねたい)》之铭言:
: : 各位先进好,小弟刚接触c#遇到了一些问题想请教各位
: : 假设我有一个arrayList为myArray (里面都是存url)
: : 假设myArray里的url是
: : http://www.yahoo.com.tw
: : http://www.google.com
: : for(i=0;i<myArray.Count;i++)
: : {
: : string[] test = (string[])myArray[i];
: : string url = test[0].Trim();
: : webbrowser1.Navigate(url);
: : }
: : 这样它跑完yahoo的页面不会接着跑google的..
: : 请问我该怎麽做它才会读完yahoo後接着读google的页面?..
: : >"<
: 我大概说明一下我想做的事
: 我要读取多个页面然後将这些页面里面的资讯塞到db里
: 然後因为会操作到这些页面(例如修改一些资料然後submit)所以这边选择
: 用了webbrowser而不是webclient
: 我的流程大概是这样(但我不知道是否正确)
: form_load之後连上一个网页,然後抓取这个页面里的某些连结(有标准用正规取得)
: 然後塞到arrayList里
: 接着执行一只副程式
: 用
: for(i=0;i<myArray.Count;i++)
: {
: 取得url
: string url = myArray[i]...
: webbrowser1.Navigate(url);
: }
: 然後另外在页面完成事件做我要做的事
: void webBrowser1_DocumentCompleted(object sender,
: WebBrowserDocumentCompletedEventArgs e)
: {
: 这边做抓取网页资料,然後写入DB
: 接着修改表单资料然後送出submit
: }
: 但我发现这样很会漏掉,例如我可能有10个url,但是它前2-3个都没处理
: 然後後面的会处理 = =.... why...
: documentcomplete不就是读取完时处理吗...
: 还是我的做法有误之类的,我有试着在documentCompeted里放eventDo但也是一样
: 因为我观念上是觉得,每个动作跑完才会继续下一个
: 但c#它似乎不是这样.. (我本来是写php的,没有winform,所以可能认知有问题)
: 跪求先进指教.........鞭用力点迷关系...Orz
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.119.40.19
1F:推 marcoyan:感谢wellwind的指点..马上试试看!tks 10/11 12:19