用delphi製作新聞採集程序(一)

今天,我們討論的是網站新聞採集程序的製作。所謂新聞採集程序,就是自動抓取網上信息,並保存到自己網站數據庫的一種程序。現在很多大型網站都有自己的新聞採集系統,其中許多采集系統價值不菲。通過這篇文章,我希望大家都能自己做一個採集程序,來維護自己的網站。

爲了便於理解,先闡述一下本文的新聞採集程序的一些基本信息。這裏的新聞系統,是用delphi實現,並將採集到的數據保存到本地access數據庫。所以,這將是一個基與桌面的採集程序,而不是類似動易採集的基於瀏覽器。個人認爲,基於桌面的採集系統,更容易實現強大的功能,有更高的穩定和安全性能。而經過擴展,大家完全可以把這個例子做成可以訪問遠程數據庫的大型採集系統。

在說如何製作採集程序之前,我們先來定義一個本地access數據庫,用來存取採集到的信息。這個數據庫只有一個表,表名”T_Article”,該表有ArticleIDClassIDTitleKeywordCopyFromContent六個字段,分別代表新聞的編號、類別編號、標題、關鍵字、出處、內容。

首先,所謂採集,第一步當然是要能抓取信息,並且是能按照用戶的要求,從網上抓取相關信息。這裏假設我們要抓取 http://dev.csdn.net/articlelist.aspx?c=2 的文章,加到自己網站的“delphi技術這麼一個欄目。首先要做的,是讀取 http://dev.csdn.net/articlelist.aspx?c=2 上的文章列表,然後通過列表索引,逐篇將文章正文內容讀到我們的網站數據庫。接下來將是關鍵,如何採集 http://dev.csdn.net/articlelist.aspx?c=2 上的文章列表。這裏分爲兩步,一、利用delphi網絡功能,讀取 http://dev.csdn.net/articlelist.aspx?c=2 HTML源文件。二、通過分析源文件,截取其中列表部分。第一步的實現,可以用delphiindy控件族的idHTTP控件,該控件在indy Clients面板,該控件的具體使用,將在後面講解,現在我們只要知道,給定一個URL地址,就能通過indy控件返回該URL的網頁源代碼。第二步的實現,則是簡單的字符串處理了。

我們先來討論第二步如何實現,打開http://dev.csdn.net/articlelist.aspx?c=2  可以看到左邊是“我的技術中心”“最新文檔列表”等東西,這些和我們沒有關係。右邊則是一篇篇文章的列表,這些就是我們要的。如何截取列表裏的內容呢?查看網頁的源代碼,CTRL+F查找“標題”,可以發現這樣一段代碼:
<!-- /
左側欄目 -->
<td width="5" valign="top"></td>
<td width="786" valign="top">
<table width="100%" height="57" border="0" align="center" cellpadding="3" cellspacing="0"
bordercolorlight="#000000" bordercolordark="#FFFFFF">
<tr bgcolor="#006699">
<TD height="19">
<b><font color="#ffffff">
標題</font></b>

對了,這就是列表的開始,那麼列表結束的位置,顯然是在這裏:

<td nowrap="nowrap">
2475 篇文章 1/71 </td><td nowrap="nowrap" align="Right"><a>第一頁</a>&nbsp;|
<a>
上一頁</a>&nbsp;|
<a href="javascript:__doPostBack('ArticleList1$ArticleList1$PageNav1','2')">
下一頁</a>&nbsp;|
<a href="javascript:__doPostBack('ArticleList1$ArticleList1$PageNav1','71')">
末頁</a>&nbsp;|
跳轉到<select name οnchange="javascript:__doPostBack('ArticleList1:ArticleList1:PageNav1',this.value)">
      <option selected="selected" value="1">1</option>

接下來,我們要做的只是利用字符串函數,截取這兩段代碼中間的部分——“文章列表。具體函數,也將在後面詳細講解。得到文章列表後,我們還要進一步處理,截取出每篇文章的url地址,因爲前邊已經講過,給定一個urlidHTTP控件能夠返回網頁代碼。當我們返回文章列表裏每篇文章的源代碼的時候,就等於說把文章內容採集回來了,只要進一步分析處理,就能保存進本地數據庫,從而完成採集工作。

那麼如何取得文章列表裏每篇文章的url呢?通過查看源文件,我們發現列表裏的每個超鏈接是這樣的格式:<a id="ArticleList1_ArticleList1_Repeater1__ctl33_HyperLink1" href="article/68/68316.shtm" target="_blank">Oracle中通過存儲過程中返回數據集及在Delphi中使用 </a>。顯然,我們只要截取出 “rticle/68/68316.shtm”,再加上http://dev.csdn.net/article/69/  就是“Oracle中通過存儲過程中返回數據集及在Delphi中使用這篇文章的URL了。
現在,假設我們已經取得了列表中每篇文章的URL,我們只循環讀取每篇文章的網頁代碼,再利用HTML裏的特徵字符,分離出文章的標題作者出處內容等信息,然後一一保存進本地數據庫。
    原理分析到此,下一篇將給出具體實現代碼。

 
發佈了27 篇原創文章 · 獲贊 7 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章