利用 ASP.NET 抓取網路新聞 |
|
azurecloud
中階會員 發表:52 回覆:108 積分:92 註冊:2003-09-04 發送簡訊給我 |
各位大大好:
寫這個程式的起因是知識管理課程的老師要求我做一個系統,能即時抓取網路新聞,最後的目標是要讓電腦挑出重要的推薦給使用者。 目前完成的部份是能於網頁初次載入時,即時抓取「中時電子報」的即時新聞的「總覽」頁面,做完 Parse 後存入本機的 SQL Server。然後再秀出所有的新聞,還有一個頁面能搜尋新聞,並把關鍵字用紅色標記起來。
坦白說寫這個程式真是搞死我了,因為我是有需求才寫程式的人(也就是程式「低手」),之前是先用 Delphi 的 TWebBrowser 元件抓網頁,parse 完後存入資料庫,再用 ASP.NET 做前端來搜尋。這是受到站長抓取股市資料程式的啟發。http://delphi.ktop.com.tw/topic.php?TOPIC_ID=21505 【發表】從KIMO股市抓取上市上櫃公司的股票代號與名稱資料程式範例
後來覺得不對,ASP.NET 本身就是網路程式啊,應該有辦法,於是乎初學 ASP.NET 的我就開始了漫長的 尋找 & Coding & Debug 的路途。於是乎程式中充滿了測試碼及非結構化的 Copy & Paste 片段…請原諒我,我已盡量把程式碼改的簡潔,只是希望能讓我花過的時間,別人不用再苦苦的尋找。
程式是由 Visual.Net 2003 開發,含原始碼,需求要有 IIS 6.0 + SQL Server 2000 + .NET Framework,安裝的方法是把整個資料夾設定為虛擬目錄,並用 SQL QueryA nalyzer 執行資料夾中的「mk_NewsDB.sql」來產生資料庫。
程式的完成要感謝這幾篇文章
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=57091 【C#Net】【轉貼】從Internet上抓取指定URL的源碼的方案
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=57090 【C#Net】【轉貼】學習DotNet經典網站
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=51713【轉貼】.NET中各種資料庫連接大全
當然還有辛苦開站的天使及各位版主…
由其是第一篇,我抓取網頁的程式碼是硬生生的把它的 C# 全改成 VB.NET,而
中時電子報的 Parser 物件則是參考它的物件編排方式做出來的,這樣做的好處
是以後我能自行建造如 Kimo 新聞的 Parser 物件,Google 新聞的 Parser 物
件等等。而這個 Parser 最大的缺點是…只要人家一改版…就得重寫了…哈哈
在下一篇回應中,我會簡單介紹這個範例程式的一些重點,也希望各位先進能
紿我指導與意見。
程式的版權嚴格說只有 中時電子報的 Parser 物件算我的原創,但是沒有別人
的分享我也寫不出來,所以只有一個要求,請盡量用,但請把改良的部份也發表出來給大家,願 K.TOP 愈來愈好。 ===========
努力修行中...
===========
附加檔案:70184_GetNews.rar
|
azurecloud
中階會員 發表:52 回覆:108 積分:92 註冊:2003-09-04 發送簡訊給我 |
以下程式碼是首頁載入時做的事情,我稍做說明,首先,物件及共用函數都存在NewsFunctions.vb 中,所以直接 Dim 一個 gpc 為一個取得網頁內容的物件,然後設定其屬性,如網址、proxy 等,網址一定要設,如果別人改版時,網址也
是改這兒就可以了,其他的可不用設定,會有預設值。最後執行 物件名.GetSource() 方法後,用 **.text = 物件名.OutString 就可以取得該網址
的 HTML 碼了。
而 Parser 物件也是,呼叫它並傳入HTML碼後 - 物件名.getnews(HTML碼) 會傳
會「一筆」標題及其超連結,還有剩下的部份(resttext),所以用迴圈來做直到
resttext 沒東西為止。
'第一次 PageLoad 時才找新聞塞入資料庫
If Not IsPostBack Then
'取得要抓取的網頁內容,在此預設為中時電子報的「總覽」畫面,這裡麻煩的部份在於人家一改版這兒就掛了
Dim gpc As New getpagecode
'http://news.chinatimes.com/Chinatimes/rtnnews/rtnnews-index/0,3555,alllistExtend,00.html
gpc.Url = "http://news.chinatimes.com/Chinatimes/rtnnews/rtnnews-index/0,3555,alllistExtend,00.html"
gpc.ProxyState = 1 '使用代理伺服器,0為不使用,設置為1後下面的代理設置才起作用
gpc.ProxyAddress = "http://smartfilter.ndmc.edu.tw" '代理伺服器位址
gpc.ProxyPort = "3128" '代理伺服器的埠
'gpc.ProxyAccount="proxy"'代理伺服器帳號
'gpc.ProxyPassword="password"'代理伺服器密碼
'gpc.ProxyDomain="bqc"'代理伺服器域
'gpc.OutFilePath=filePath'設置輸出檔路徑的地方,如果不設置,則返回字串
gpc.GetSource() '處理
Dim tempErr As String = gpc.NoteMessage '如果出錯,這裏會提示
Dim tempCode As String = gpc.OutString '返回的字串
'TextBox1.Text = gpc.OutString '系統回應訊息
If tempErr = "" Then
Label1.Text = "使用 Proxy: " + gpc.ProxyAddress + ":" + gpc.ProxyPort
Else
Label1.Text = tempErr
End If '取得中時電子報總覽的 link 及 標題,注意如果剛抓的網頁不是中時電子報的「總覽」就沒輒了
Dim ccc As New getChinatimeRst
Dim newsdataset As New DataSet
newsdataset.Tables.Add("tnews")
newsdataset.Tables("TNews").Columns.Add("number")
newsdataset.Tables("TNews").Columns.Add("link")
newsdataset.Tables("TNews").Columns.Add("title")
ccc.getnews(gpc.OutString)
newsdataset = addrows(ccc.urlstr, ccc.title, newsdataset)
ShowArow(ccc.urlstr, ccc.title, "", Table1)
Do While ccc.resttext <> "stop" '當網頁還沒被分解完畢時
ccc.getnews(ccc.resttext)
'addrows 是公用 function 可將傳入的兩個定串加入指定的 Dataset 中
newsdataset = addrows(ccc.urlstr, ccc.title, newsdataset)
'Sub showarow 會組出一個可見的 Table,除錯用
ShowArow(ccc.urlstr, ccc.title, "", Table1)
Loop
'修正物件傳回後最後兩筆資料會相同,砍掉重覆的最後一筆
newsdataset.Tables("TNews").Rows.RemoveAt(newsdataset.Tables("TNews").Rows.Count - 1)
Table1.Rows.RemoveAt(Table1.Rows.Count - 1)
AddDataset2SQL(newsdataset, "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;password=;Initial Catalog=NewsDB;Data Source=127.0.0.1", Label2)
End If '以下為取出今日新聞並顯示畫面
Label1.Text = "您好!歡迎參觀今日新聞(新聞來源:中時電子報)"
Label2.Text = "現在時間:" + Date.Now
Dim strCn As String = "server=127.0.0.1;uid=sa;database=NewsDB;pwd=;"
Dim myConnection As SqlConnection = New SqlConnection(strCn)
myConnection.Open()
'建立DataAdapter物件,並且定義 commandText 內容
Dim strSQL As String = "select * from TNews order by number DESC"
Dim myCommand As SqlDataAdapter = New SqlDataAdapter(strSQL, myConnection)
Dim ds As DataSet = New DataSet
myCommand.Fill(ds, "News")
DataGrid1.DataSource = ds
DataGrid1.DataBind() ===========
努力修行中...
===========
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |