C# webbrowser抓取网页的时候如何阻止刷新对话框弹出呢

NSWDBWAN 2013-07-27 03:00:09
在使用C# Webbrowser抓取网页的时候程序跑着跑着就弹出刷新对话框,必须点击重试,然后代码不会继续往下走了。
求高手指点。
我的webbrowser是扩展的,而且也用过禁止弹出对话框的代码,仍然是没用的。

public void getContent()
{
int begin = 0;
int end = 0;
string pagesSum = "";
string currentPage = "";
string content = "";
int currEnd = 0;
string province = "";
(webBrowser1. ActiveXInstance as SHDocVw.WebBrowser).NavigateComplete2 += new SHDocVw.DWebBrowserEvents2_NavigateComplete2EventHandler(wb_NavigateComplete2);
webBrowser1.Navigate("http:****#");
webBrowser1.ScriptErrorsSuppressed = false;
loading = true;
while (loading)
{
Application.DoEvents();
}
for (int i = 0; i < webBrowser1.Document.All.Count; i++)
{
if (webBrowser1.Document.All[i].TagName == "A" && webBrowser1.Document.All[i].GetAttribute("href").ToString().Trim() == "http://**")
{
province = webBrowser1.Document.All[i].InnerText;
webBrowser1.Document.All[i].InvokeMember("click");//引发”CLICK”事件
int k = 1;
while (true)
{
loading = true;
while (loading)
{
Application.DoEvents();
}
content = webBrowser1.Document.Body.InnerHtml.ToString();
if (content.Contains("下一页"))
{
begin = content.IndexOf("条,共") + 3;
end = content.IndexOf("页,当前");
pagesSum = content.Substring(begin, end - begin);
currentPage = content.Substring(end + 5, 6);
currEnd = currentPage.LastIndexOf("页");
currentPage = currentPage.Substring(0, currEnd);
this.richTextBox1.Text = content;
content=content.Replace("'","''");
try
{
string sql = "insert into t_agent(province,html) values('" + province + "','" + content + "')";
SQLTrans.DoTran(sql);
}
catch(Exception e)
{
throw e;
}
for (int j = 0; j < webBrowser1.Document.All.Count; j++)
{
if (webBrowser1.Document.All[j].TagName == "A" && webBrowser1.Document.All[j].InnerText.Trim() == "下一页")
{
//webBrowser1.Document.All[j].InvokeMember("click");//引发”CLICK”事件
webBrowser1.Navigate("javascript:turnpage('" + k + "');");
k++;
break;
}
}

}
else
{
webBrowser1.Refresh();
}

if (pagesSum.Equals(currentPage))
break;
}
}

}
}
void wb_NavigateComplete2(object pDisp, ref object URL)
{
mshtml.IHTMLDocument2 doc = (webBrowser1.ActiveXInstance as SHDocVw.WebBrowser).Document as mshtml.IHTMLDocument2;
doc.parentWindow.execScript("window.alert=null", "javascript");
doc.parentWindow.execScript("window.confirm=null", "javascript");
doc.parentWindow.execScript("window.open=null", "javascript");
doc.parentWindow.execScript("window.showModalDialog=null", "javascript");
doc.parentWindow.execScript("window.close=null", "javascript");

doc.parentWindow.execScript("function alert(str){return ''}", "javascript");
if (webBrowser1.ReadyState == WebBrowserReadyState.Complete && webBrowser1.Url.ToString() != LastUrl)//判断加载完毕
{
loading = false;
}
}
...全文
264 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
NSWDBWAN 2013-08-06
  • 打赏
  • 举报
回复
引用 5 楼 findcaiyzh 的回复:
你的代码很奇怪? 为什么不使用WebBrowser.DocumentCompleted Event? http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.documentcompleted(v=vs.100).aspx
谢谢宝_爸,我使用的是WebBrowser.DocumentCompleted事件,我看过您给我的第一个提示我的浏览器控件也确实是扩展的,也使用了CreateSink方法。 我总结了一下问题,我在用webbrowser下载网页的时候,会出现网页没加载完的情况,网页在一定时间内没加载完会显示null但是整个网页不会再加载了,需要刷新,一刷新就蹦出那个框框,重试还是取消。如果用Refresh方法就会蹦出框框,如果用navigate的话只会重现上次没加载完整的情况。

 [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
    public partial class Form8 : Form
    {
        bool loading = true;
        public Form8()
        {
            InitializeComponent();
            webBrowser1.NavigateError += new
                WebBrowserNavigateErrorEventHandler(wb_NavigateError);
            webBrowser1.BeforeNewWindow += new EventHandler<WebBrowserExtendedNavigatingEventArgs>(ieBrowser_BeforeNewWindow);
        }
        private void wb_NavigateError(
            object sender, WebBrowserNavigateErrorEventArgs e)
        {
            // Display an error message to the user.
            MessageBox.Show("Cannot navigate to " + e.Url);
        }
        void ieBrowser_BeforeNewWindow(object sender, WebBrowserExtendedNavigatingEventArgs e)
        {
            e.Cancel = true;
            ((ExtendedWebBrowser)sender).Navigate(e.Url);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            getContent();
        }

        public void getContent()
        {
          
            webBrowser1.Navigate("***");
            webBrowser1.ScriptErrorsSuppressed = true;
            loading = true;
            while (loading)
            {
                Application.DoEvents();
            }
            for (int i = 0; i < webBrowser1.Document.All.Count; i++)
            {
                if (webBrowser1.Document.All[i].TagName == "A" && webBrowser1.Document.All[i].GetAttribute("href").ToString().Trim() == "***")
                {
                    province = webBrowser1.Document.All[i].InnerText;
                    webBrowser1.Document.All[i].InvokeMember("click");//引发”CLICK”事件

                    while (true)
                    {
                        loading = true;
                        while (loading)
                        {
                            Application.DoEvents();
                        }
                        try
                        {
                            content = webBrowser1.Document.Body.InnerHtml.ToString();
                            if (content.Contains("下一页"))
                            {
               
                                if (int.Parse(pagesSum.Trim()) <= int.Parse(currentPage.Trim()))
                                    break;
                                page = int.Parse(currentPage.Trim()) + 1;
                                webBrowser1.Navigate("javascript:turnpage('" + page + "')");
                            }
                            else
                            {
                               // webBrowser1.Navigate("javascript:turnpage('" + page + "')");
                                webBrowser1.Document.ExecCommand("Refresh", false, null);
                            }
                        }
                        catch (Exception e)
                        {
                            throw e;
                        }

                    }
                }

            }
        }


        private void extendedWebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)//判断加载完毕
            {
                loading = false;
            }
        }
    }
宝_爸 2013-08-05
  • 打赏
  • 举报
回复
你的代码很奇怪? 为什么不使用WebBrowser.DocumentCompleted Event? http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.documentcompleted(v=vs.100).aspx
NSWDBWAN 2013-08-04
  • 打赏
  • 举报
回复
引用 3 楼 findcaiyzh 的回复:
看看这这个讨论有没有帮助: http://social.msdn.microsoft.com/Forums/windows/en-US/b8ccfb4a-18ea-4095-90ca-54839d404867/webbrowser-control-refresh-and-webforms 或者不调用 webBrowser1.Refresh(); 而是再调用一次 webBrowser1.Navigate(...);
宝_爸确实是Refresh的问题,我把Refresh换成了Navigate可是问题就变成它只会刷新成上一次它没刷出来的状态。我把我的code整理了一下,大概就是这样,每次执行完else之后再执行while(loading)后是不会跳出来的,我的程序就这样断了,能不能指点一下呢?

while (true)
                    {
                        loading = true;
                        while (loading)
                        {
                            Application.DoEvents();
                        }
                        try
                        {
                            content = webBrowser1.Document.Body.InnerHtml.ToString();
                            this.richTextBox1.Text = content;
                            if (content.Contains("下一页"))
                            {
							   if (int.Parse(pagesSum.Trim()) <= int.Parse(currentPage.Trim()))
                                    break;
                                page = int.Parse(currentPage.Trim()) + 1;
                                webBrowser1.Navigate("javascript:turnpage('" + page + "')");
                            }
                            else
                            {
                                webBrowser1.Navigate("javascript:turnpage('" + page + "')");
                            }
						}
						catch(Exception ex)
						{
							throw ex;
						}
					}
宝_爸 2013-07-31
  • 打赏
  • 举报
回复
看看这这个讨论有没有帮助: http://social.msdn.microsoft.com/Forums/windows/en-US/b8ccfb4a-18ea-4095-90ca-54839d404867/webbrowser-control-refresh-and-webforms 或者不调用 webBrowser1.Refresh(); 而是再调用一次 webBrowser1.Navigate(...);
NSWDBWAN 2013-07-30
  • 打赏
  • 举报
回复
请问tangyanzhi1111 ,我看了一下MSDN上关于IDocuHostUIhandler的资料,还是不是很会用,能否给一些更加详细的资料呢?谢谢
江湖评谈 2013-07-27
  • 打赏
  • 举报
回复
很简单,用webbrowser内置的接口IDocuHostUIhandler,屏蔽这个对话框不就行了,

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧