none
求C#获取多个网页的内容(网页为ajax异步加载数据)

    问题

  • 单网页的方法

    private void Form1_Load(object sender, EventArgs e)
            {
                string URL = "网址";//网址
                webBrowser1.Navigate(URL);
            }
            private void timer1_Tick(object sender, EventArgs e)
            {
                HtmlElement elem = webBrowser1.Document.GetElementById("pageForm");//加载完成后才有的标签
                if (elem != null)
                {
                    textBox2.Text = webBrowser1.Document.Body.OuterHtml;
                    timer1.Enabled = false;
                }
            }

    问题来了,假如URL是多个网址,应该怎么实现?

    单个URL执行过程是打开webBrowser1加载URL,然后利用Timer来判断网页是否加载完成,完成则终止Timer

    多个URL,循环加载执行过程是打开webBrowser1加载URL,我需要的是Timer结束后继续执行循环,但实际过程是循环一股脑跑完了,然后执行Timer,并没有得到所有我想要的网页内容

    2016年10月27日 1:10

答案

  • DocumentCompleted事件

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        //Check if page is fully loaded or not
        if (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete)
            return;
        else
            //Action to be taken on page loading completion
    }
    2016年10月27日 3:18

全部回复

  • 获取多个网页的内容,推荐用Html Agility Pack
    http://htmlagilitypack.codeplex.com/

    下载源代码,查看其中的测试方法即可知道用法,参考以下几句

    var document = new HtmlDocument(); document.Load(@"C:\Documents and Settings\Kenny\My Documents\project\document.html"); var table = document.GetElementbyId("table5"); var tableRows = table.ChildNodes .Where(cn => cn.NodeType == HtmlNodeType.Element) .Skip(2);

    这个组件侧重点在网页内容的分析,如果只是获取网页内容,还有更简单的方法:

    WebClient client = new WebClient();
    string downloadString = client.DownloadString("http://www.gooogle.com");

    WebRequest request = WebRequest.Create("http://www.google.com");
    WebResponse response = request.GetResponse();
    Stream data = response.GetResponseStream();
    string html = String.Empty;
    using (StreamReader sr = new StreamReader(data))
    {
        html = sr.ReadToEnd();
    }

    string ReadTextFromUrl(string url) {
        // WebClient is still convenient
        // Assume UTF8, but detect BOM - could also honor response charset I suppose
        using (var client = new WebClient())
        using (var stream = client.OpenRead(url))
        using (var textReader = new StreamReader(stream, Encoding.UTF8, true)) {
            return textReader.ReadToEnd();
        }
    }




    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年10月27日 1:58
  • 获取多个网页的内容,推荐用Html Agility Pack
    http://htmlagilitypack.codeplex.com/

    下载源代码,查看其中的测试方法即可知道用法,参考以下几句

    var document = new HtmlDocument(); document.Load(@"C:\Documents and Settings\Kenny\My Documents\project\document.html"); var table = document.GetElementbyId("table5"); var tableRows = table.ChildNodes .Where(cn => cn.NodeType == HtmlNodeType.Element) .Skip(2);

    这个组件侧重点在网页内容的分析,如果只是获取网页内容,还有更简单的方法:

    WebClient client = new WebClient();
    string downloadString = client.DownloadString("http://www.gooogle.com");

    WebRequest request = WebRequest.Create("http://www.google.com");
    WebResponse response = request.GetResponse();
    Stream data = response.GetResponseStream();
    string html = String.Empty;
    using (StreamReader sr = new StreamReader(data))
    {
        html = sr.ReadToEnd();
    }

    string ReadTextFromUrl(string url) {
        // WebClient is still convenient
        // Assume UTF8, but detect BOM - could also honor response charset I suppose
        using (var client = new WebClient())
        using (var stream = client.OpenRead(url))
        using (var textReader = new StreamReader(stream, Encoding.UTF8, true)) {
            return textReader.ReadToEnd();
        }
    }




    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    问题不是在于,我打开网页后怎么获取网页中的标签内容,而是我打开网页后是一个js代码,需要等待js代码运行完成后(即加载完整的数据后)再获取代码。整个过程是: 循环{打开URL——等待加载——timer检查加载进度——加载完成,则获取网页内容,否则继续等待加载},执行第一次循环时,在timer检查这里并没有执行{timer检查加载进度——加载完成,则获取网页内容,否则继续等待加载}这部分代码,而是先跑完循环,然后执行{timer检查加载进度——加载完成,则获取网页内容,否则继续等待加载}这部分,得不到我想要的内容
    2016年10月27日 2:13
  • DocumentCompleted事件

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        //Check if page is fully loaded or not
        if (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete)
            return;
        else
            //Action to be taken on page loading completion
    }
    2016年10月27日 3:18
  • DocumentCompleted事件

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        //Check if page is fully loaded or not
        if (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete)
            return;
        else
            //Action to be taken on page loading completion
    }

    我觉得就加载完成检验方法上说用Timer检查特殊标签比较好,网页加载完成会触发几个DocumentCompleted事件

    贴个网址测试下http://app2.sfda.gov.cn/datasearchp/gzcxSearch.do?page=3&searchcx=&optionType=V1&paramter0=null&paramter1=null&paramter2=null&formRender=cx

    2016年10月27日 5:00
  • 几天了没有人回复了,答案就你吧
    2016年10月31日 9:02