2011年2月26日 星期六

[VB.NET]擷取網頁資料

[VB.NET]擷取網頁資料




緣由
大學生都很忙,對於學校的公告常常可能等到別人告訴你才知道,才知道最新的訊息是什麼,假如每次都要上去看的話顯得沒有效率,


所以,設計一個程式擷取網頁資料,要看的時候只要開啟程式,就可以瀏覽標題了,可節省一些不必要的時間。

程式功能
讀取公告標題
點選標題就可以連到網頁
教學
開啟Firefox,我們需要使用FireBug,安裝後重開Firefox,請點此連結開啟

接著到這個網址http://hotnews.chu.edu.tw/web/newslist.asp

開啟FireBug,它再視窗的右下角



打開以後會發現有以下畫面



接著就照下畫面點選



以下是網頁片段程式碼

本校關懷災區不落人後,將繼續招...


2009/8/20
由於是ASP網頁,每一個”日期”和”標題”都是用類似的格式呈現的

其中a 和span是網頁的TagName

TagName指的是A、Script、Span,也就是網頁的元素

Attribute像是Title、Href等,一個TagName可能有一到多個Attribute

不過有些Attribute可擷取有些不能擷取,需要在偵錯的時候試試看

重點來了,如何能抓出裡面的資料

'擷取Web網頁內的Html項目
For Each [HtmlElement] As HtmlElement In WebBrowserRead.Document.All
'擷取日期
If [HtmlElement].TagName = "SPAN" And IsDate([HtmlElement].OuterText) Then
DataDate = CDate([HtmlElement].OuterText)
End If
'擷取標題和連結
If [HtmlElement].TagName = "A" And Not [HtmlElement].GetAttribute("Href") = Nothing Then
DataTitle = [HtmlElement].GetAttribute("Title")
DataLink = New System.Uri([HtmlElement].GetAttribute("Href"))
End If
'如果成功蒐集到一筆記錄
If Not DataDate = Nothing AndAlso Not DataTitle = Nothing AndAlso Not DataLink = Nothing Then
ListBoxTitle.Items.Add(DataDate.ToString("yyyy-MM-dd") & "│" & DataTitle)
ListBoxLinkStore.Items.Add(DataLink)
'初始化
DataDate = Nothing
DataTitle = Nothing
DataLink = Nothing
End If
Next
用IF … THEN 尋找

一個TagName會包含一些Attribute

用GetAttribute方法就可以抓出值

如果是像這樣的,例如

2009/8/20
就用OuterText屬性就可以抓出值了

然後,抓到的值我們可以利用ListBox存起來

不一定每次都從[工具箱]拉出來使用

ListBox是一個Class,所以宣告一下就可以使用

Private ListBoxLinkStore As New ListBox
所以只要會登入網站,且會抓網頁資料,應該就可以做機器人留言之類的東西,為了預防機器人留言,所以現在都要打驗證碼

經驗
能夠準確的抓下網頁資料,必須先看此網頁的程式碼,才有辦法寫程式分析出你要的資料
TagName是網頁必有的元素,網頁程式碼也是由TagName構成,所以從TagName找會比較快
字串的格式化toString()可以打"yyyy-MM-dd",作為格式化輸出
元件不一定從[工具箱]拉出來,其實寫Private ListBoxLinkStore As New ListBox就可以使用
ListBox
ListBoxTitle.SelectedIndex=>取得或設定使用者選擇的項目在第幾項
ListBoxLinkStore.Items.Item(int)=>取得該項內容,傳入參數為index
Form
Form1_Shown事件是視窗第一次出現時所引發的事件
程式碼
Public Class Form1
'變數
Protected Friend WebBrowserRead As New WebBrowser
Private ListBoxLinkStore As New ListBox
Private DataDate As Date = Nothing, DataTitle As String = Nothing, DataLink As System.Uri = Nothing
'等待網頁讀取完成
Sub Loading(ByRef [web] As WebBrowser)
Do Until WebBrowserRead.ReadyState = WebBrowserReadyState.Complete
Application.DoEvents()
Loop
End Sub
'瀏覽網頁
Private Sub ButtonNevigate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonNevigate.Click
WebBrowserUser.Navigate(TextBoxUrl.Text)
End Sub
'取得資料
Private Sub GetData()
ListBoxTitle.Items.Clear()
ListBoxLinkStore.Items.Clear()
'擷取Web網頁內的Html項目
For Each [HtmlElement] As HtmlElement In WebBrowserRead.Document.All
'擷取日期
If [HtmlElement].TagName = "SPAN" And IsDate([HtmlElement].OuterText) Then
DataDate = CDate([HtmlElement].OuterText)
End If
'擷取標題和連結
If [HtmlElement].TagName = "A" And Not [HtmlElement].GetAttribute("Href") = Nothing Then
DataTitle = [HtmlElement].GetAttribute("Title")
DataLink = New System.Uri([HtmlElement].GetAttribute("Href"))
End If
'如果成功蒐集到一筆記錄
If Not DataDate = Nothing AndAlso Not DataTitle = Nothing AndAlso Not DataLink = Nothing Then
ListBoxTitle.Items.Add(DataDate.ToString("yyyy-MM-dd") & "│" & DataTitle)
ListBoxLinkStore.Items.Add(DataLink)
'初始化
DataDate = Nothing
DataTitle = Nothing
DataLink = Nothing
End If
Next
End Sub

Private Sub LoadData()
'載入網頁
WebBrowserRead.Navigate(TextBoxUrl.Text)
'等待網頁載入完成
Loading(WebBrowserRead)
'抓資料
GetData()
End Sub
'讀取網頁內容
Private Sub ButtonReadAnnouncement_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonReadAnnouncement.Click
LoadData()
End Sub

Private Sub ListBoxTitle_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBoxTitle.SelectedIndexChanged
'叫出網頁
WebBrowserUser.Navigate(ListBoxLinkStore.Items.Item(ListBoxTitle.SelectedIndex))
'等待網頁載入完成
Loading(WebBrowserUser)
End Sub

Private Sub Form1_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
LoadData()
End Sub
End Class
下載(原始碼+執行檔)
請按此連結

vb.net, 經驗分享 vb.net, VB2008, VB9.0, 網頁

沒有留言:

張貼留言