C/S中得到網頁的原代碼

 這裏我介紹兩種方法來得到網頁原代碼.一種是WebBrowser方式,一種是XMLHTTP方式(好象美其名曰"AJAX")

 這兩個方式各有特點:第一種,一定要完全打開頁面才能觸發事件,根據網絡情況,可能需要時間比較長,但穩定,做錯誤處理比較易。第二種也可以用在網頁上,速度一般是第一種的十倍。但錯誤不易判斷和處理。下面是實例

 

一、WebBrowser方式,步聚如下:

    1、建立一個Winform工程,在form裏添加一個控件WebBrowser,改名爲WebB,另加一按鈕btnGet.

    2、在按鈕的單擊事件裏寫下以下代碼:

    Private Sub btnGet_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGet.Click
        Dim sSearchUrl As String = "www.***.com/"

         '關鍵一步,讓控件打開網頁。
        WebB.Navigate(sSearchUrl)
    End Sub

 

   3、利用WEBBrowser控件的DocumentCompleted事件。

    Private Sub WebB_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebB.DocumentCompleted
        '得到源代碼
                Dim Doc As New Object
        Doc = oWebB.Document
        Dim i As Object
        Dim s As String
        Dim ss As String

        '網站的代碼都在Doc裏面,彈出s,ss你就知道是怎麼回事了,然後你可以根據要求對s或ss進行分析,分離出來你要的信息。
        For Each i In Doc.all
            s = i.innertext
            ss = i.outerhtml

 

            MsgBox(s)
 

            MsgBox(ss)


         Next

    End Sub

 

 

 

二、XMLHTTP方式,步聚如下(默認引用就可以,不用單獨引用其它組件):

    1、建立一個Winform工程,在form裏添加一個控件按鈕btnGet.

    2、在按鈕的單擊事件裏寫下以下代碼:

    Private Sub btnGet_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGet.Click
        

        Dim sSearchUrl As String = "http://www.***.com/pages/iq.asp"
        Dim sSearchUrl2 As String = "?SearchText=" & aStr(nLocation)
        Try

           '關鍵一步,自定義函數GetPageSourceCode打開網頁,返回網頁代碼。
            Dim sCode As String = GetPageSourceCode(sSearchUrl, sSearchUrl2)

           '這是我的自定義函數,大家可以不用去管它,我只用它分離出來我需要的數據。  

            Me.GetPrice2(sCode, aStr(nLocation))
            
        Catch ex As Exception
            TGetPrice2.Enabled = False
            If MsgBox("出現一個未知錯誤,還要繼續進行嗎?", MsgBoxStyle.Question) = MsgBoxResult.Yes Then
                TGetPrice2.Enabled = True
            Else
                Exit Sub
            End If

        End Try
    End Sub

 

    3、下面這兩個自定義函數是問題的關鍵:

    ''' <summary>
    ''' 獲取網頁源碼函數
    ''' 注意:有可能網址不存在,函數返回爲空值,故需要對返回值進行判斷。
    ''' </summary>
    ''' <param name="urlStr">要獲取的網址</param>
    ''' <param name="sendStr">需要對該網址傳送的字符參數</param>
    ''' <param name="charsetStr">設定獲取的網頁編碼格式:如:utf-8 ; gb2312</param>
    ''' <returns>返回網頁源碼</returns>
    ''' <remarks></remarks>
    Public Function GetPageSourceCode(ByVal urlStr As String, Optional ByVal sendStr As String = "", Optional ByVal charsetStr As String = "gb2312") As String
        Try
            Dim xmlHttp
            xmlHttp = CreateObject("MSXML2.XMLHTTP")
            With xmlHttp
                .Open("GET", urlStr & sendStr, False)
                .Send()
                GetPageSourceCode = BytesToBstr(.ResponseBody, charsetStr)
            End With

            xmlHttp = Nothing
        Catch ex As Exception
            Throw (ex)
            'MsgBox(ex.Message)
        End Try
    End Function

    ''' <summary>
    ''' 數據流字節轉爲字符
    ''' </summary>
    ''' <param name="body">要轉換的數據字節</param>
    ''' <param name="CharSet">設定獲取的網頁編碼格式:如:utf-8 ; gb2312</param>
    ''' <returns>返回字符串</returns>
    ''' <remarks></remarks>
    Function BytesToBstr(ByVal body, ByVal CharSet)
        Dim objstream
        objstream = CreateObject("adodb.stream")
        objstream.Type = 1
        objstream.Mode = 3
        objstream.Open()
        objstream.Write(body)
        objstream.Position = 0
        objstream.Type = 2
        objstream.Charset = CharSet
        BytesToBstr = objstream.ReadText
        objstream.Close()
        objstream = Nothing
    End Function

 

 

總結一下:

以上是個人根據我的需求,通過網絡諮源整理的結果。不一定成熟和完美,但都親自用過。如果大家都什麼更好的解決方案。可以跟在後面,大家共享一下,以求共同進步。謝謝。

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