C# 抓取Web網頁數據分析 2010-04-11 12:27:15| 分類: C#抓取網頁 | 標籤: |字型大小大中小 訂閱 .

 

通過程式自動的讀取其它網站網頁顯示的資訊,類似于爬蟲程式。比方說我們有一個系統,要提取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("出錯"); //HTTP://ike.126.com

 

}

 

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;

 

}
為了完成以上的需求,我們就需要類比瀏覽器流覽網頁,得到頁面的資料在進行分析,最後把分析的結構,即整理好的資料寫入資料庫。那麼我們的思路就是:
 
 
 
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("出錯"); //HTTP://ike.126.com

 

}

 

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;

 

}

 

程式運行結果介面圖:

 

0 && image.height>0){if(image.width>=700){this.width=700;this.height=image.height*700/image.width;}}"
 
 
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()