用delphi制作新闻采集程序(一)

来源:互联网 发布:java手册chm 编辑:程序博客网 时间:2024/05/30 23:36

今天,我们讨论的是网站新闻采集程序的制作。所谓新闻采集程序,就是自动抓取网上信息,并保存到自己网站数据库的一种程序。现在很多大型网站都有自己的新闻采集系统,其中许多采集系统价值不菲。通过这篇文章,我希望大家都能自己做一个采集程序,来维护自己的网站。

为了便于理解,先阐述一下本文的新闻采集程序的一些基本信息。这里的新闻系统,是用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 onchange="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里的特征字符,分离出文章的标题作者出处内容等信息,然后一一保存进本地数据库。
    原理分析到此,下一篇将给出具体实现代码。

 
原创粉丝点击