線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4936
推到 Plurk!
推到 Facebook!

利用 ASP.NET 抓取網路新聞

 
azurecloud
中階會員


發表:52
回覆:108
積分:92
註冊:2003-09-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-02 15:26:06 IP:140.129.xxx.xxx 未訂閱
各位大大好:     寫這個程式的起因是知識管理課程的老師要求我做一個系統,能即時抓取網路新聞,最後的目標是要讓電腦挑出重要的推薦給使用者。    目前完成的部份是能於網頁初次載入時,即時抓取「中時電子報」的即時新聞的「總覽」頁面,做完 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-02 15:41:30 IP:140.129.xxx.xxx 未訂閱
以下程式碼是首頁載入時做的事情,我稍做說明,首先,物件及共用函數都存在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()    =========== 努力修行中... ===========
系統時間:2024-05-19 18:33:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!