您的位置:首页 > 其它

如何抓取网页中的实时监测数据进行分析

2013-05-29 19:21 731 查看
使用wpf做了窗体,跟Silverlight开发环境一样,将前台设计与后台开发逻辑分离开来,抓取南京市九个PM 2.5监测站点的数据




前台代码:

<Grid>
        <Button Content="数据获取" Height="23" HorizontalAlignment="Left" Margin="487,23,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
        <DataGrid AutoGenerateColumns="False"  Height="338" HorizontalAlignment="Left" Margin="0,57,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="591" CanUserAddRows="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="名称" IsReadOnly="True"  Binding="{Binding Name,Mode=TwoWay}" Width="200"  /> 
                <DataGridTextColumn Header="PM2.5浓度" IsReadOnly="True"   Binding="{Binding Density,Mode=TwoWay}" Width="200"/>
            </DataGrid.Columns>
        </DataGrid>
        <Label Content="网址:" Height="28" HorizontalAlignment="Left" Margin="29,23,0,0" Name="label1" VerticalAlignment="Top" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="88,25,0,0" Name="textBox1" VerticalAlignment="Top" Width="362" />
    </Grid>
后台代码:

class MonitorInfo
            {
               public  string Name{get;set;}
               public  string Density{get;set;}
            };

             List<MonitorInfo>  myListString=new List<MonitorInfo>();

            private string GetWebContent(string Url)
            {
                string strResult = "";
                try
                {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
                    //声明一个HttpWebRequest请求 
                    request.Timeout = 30000;
                    //设置连接超时时间 
                    request.Headers.Set("Pragma", "no-cache");
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    Stream streamReceive = response.GetResponseStream();
                    Encoding encoding = Encoding.GetEncoding("GB2312");
                    StreamReader streamReader = new StreamReader(streamReceive, encoding);
                    strResult = streamReader.ReadToEnd();
                }
                catch
                {
                    System.Windows.Forms.MessageBox.Show("出错");
                }
                return strResult;
            } 

        private void button1_Click(object sender, RoutedEventArgs e)
        {
                textBox1.Text="http://www.pm2d5.com/city/nanjing.html";
                String Url = textBox1.Text;
                string strWebContent = GetWebContent(Url);
                int divIndex = strWebContent.IndexOf("weilai");
                int tableStartIndex = strWebContent.IndexOf("<table", divIndex);
                int tableEndIndex = strWebContent.IndexOf("</table>", tableStartIndex);
                string strWeb = strWebContent.Substring(tableStartIndex, tableEndIndex - tableStartIndex + 8);

                //生成HtmlDocument
                WebBrowser web = new WebBrowser();
                web.Navigate("about:blank");
                HtmlDocument htmldoc = web.Document.OpenNew(true);
                htmldoc.Write(strWeb);
                HtmlElementCollection htmlTR = htmldoc.GetElementsByTagName("tr");
                int i = 0;
                myListString.Clear();
                foreach (HtmlElement tr in htmlTR)
                {
                    if (i == 0)
                    {
                        i++;
                        continue;//跳过表头
                    }

                    MonitorInfo monitorInfo = new MonitorInfo();
                    monitorInfo.Name = tr.GetElementsByTagName("td")[0].InnerText.ToString();
                    monitorInfo.Density = tr.GetElementsByTagName("td")[3].InnerText.ToString();
                    myListString.Add(monitorInfo);
                }
                dataGrid1.ItemsSource = myListString;
            }
            
    }
在MonitorInfo这个类的设计中,注意使用get,set,否则将List数据绑定到DataGrid后会出现空白行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: