抓取Web網頁數據分析(轉)

      通過程序自動的讀取其它網站網頁顯示的信息,類似於爬蟲程序。比方說我們有一個系統,要提取BaiDu網站上歌曲搜索排名。分析系統在根據得到的數據進行數據分析。爲業務提供參考數據。
  爲了完成以上的需求,我們就需要模擬瀏覽器瀏覽網頁,得到頁面的數據在進行分析,最後把分析的結構,即整理好的數據寫入數據庫。那麼我們的思路就是:
  1、發送HttpRequest請求。
  2、接收HttpResponse返回的結果。得到特定頁面的html源文件。
  3、取出包含數據的那一部分源碼。
  4、根據html源碼生成HtmlDocument,循環取出數據。
  5、寫入數據庫。

程序如下:  

        //根據Url地址得到網頁的html源碼
        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
            {
                MessageBox.Show("出錯");
            }
            return strResult;
        }
爲了使用HttpWebRequest和HttpWebResponse,需填名字空間引用
  using System.Net;

以下是程序具體實現過程:
private void button1_Click(object sender, EventArgs e)
        {
            //要抓取的URL地址
            string Url = "http://list.mp3.baidu.com/topso/mp3topsong.html?id=1#top2";

            //得到指定Url的源碼
   string strWebContent = GetWebContent(Url);

            richTextBox1.Text = strWebContent;
   //取出和數據有關的那段源碼
            int iBodyStart = strWebContent.IndexOf("<body", 0);
            int iStart = strWebContent.IndexOf("歌曲TOP500", iBodyStart);
            int iTableStart = strWebContent.IndexOf("<table", iStart);
            int iTableEnd = strWebContent.IndexOf("</table>", iTableStart);
            string strWeb = strWebContent.Substring(iTableStart, iTableEnd - iTableStart + 8);

            //生成HtmlDocument
   WebBrowser webb = new WebBrowser();
            webb.Navigate("about:blank");
            HtmlDocument htmldoc = webb.Document.OpenNew(true);
            htmldoc.Write(strWeb);
            HtmlElementCollection htmlTR = htmldoc.GetElementsByTagName("TR");
            foreach (HtmlElement tr in htmlTR)
            {
                string strID = tr.GetElementsByTagName("TD")[0].InnerText;
                string strName = SplitName(tr.GetElementsByTagName("TD")[1].InnerText, "MusicName");
                string strSinger = SplitName(tr.GetElementsByTagName("TD")[1].InnerText, "Singer");
                strID = strID.Replace(".", "");
                //插入DataTable
                AddLine(strID, strName, strSinger,"0");

                string strID1 = tr.GetElementsByTagName("TD")[2].InnerText;
                string strName1 = SplitName(tr.GetElementsByTagName("TD")[3].InnerText, "MusicName");
                string strSinger1 = SplitName(tr.GetElementsByTagName("TD")[3].InnerText, "Singer");
                //插入DataTable
                strID1 = strID1.Replace(".", "");
                AddLine(strID1, strName1, strSinger1,"0");

                string strID2 = tr.GetElementsByTagName("TD")[4].InnerText;
                string strName2 = SplitName(tr.GetElementsByTagName("TD")[5].InnerText, "MusicName");
                string strSinger2 = SplitName(tr.GetElementsByTagName("TD")[5].InnerText, "Singer");
                //插入DataTable
                strID2 = strID2.Replace(".", "");
                AddLine(strID2, strName2, strSinger2,"0");

            }
            //插入數據庫
            InsertData(dt);
   
            dataGridView1.DataSource = dt.DefaultView;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章