在前一篇文章里,我们讨论了新闻采集程序的原理。今天要来具体实现了。
首先,程序将用到idHTTP控件(在indy Clients面板)。关于该控件的详细文档,E文好的朋友可以登陆这里查看:http://www.rfc-editor.org/rfc/rfc2616.txt 本程序用到的GET方法在第53页。网上关于indy的帮助文档也整理了不少,可是我一直没找到中文的。在本程序中,我们只使用idHTTP控件的一个方法,就是idHTTP1.GET 方法。该方法是这样声明的:
function Get(AURL: string): string; overload;
AURL参数,是string类型,指定一个URL地址字符串。函数返回也是string类型,返回网页的HTML源文件。比如我们可以这样调用:
tmpStr:= idHTTP1.Get(‘http://www.163.com’);
调用成功后,tmpstr变量里存储的就是网易主页的代码了。
接下来,讲一下数据的截取,这里,我定义了这么一个函数:
function TForm1.GetStr(StrSource,StrBegin,StrEnd:string):string;
var
in_star,in_end:integer;
begin
in_star:=AnsiPos(strbegin,strsource)+length(strbegin);
in_end:=AnsiPos(strend,strsource);
result:=copy(strsource,in_sta,in_end-in_star);
end;
解释一下该函数的三个参数:
StrSource:string类型,表示HTML源文件。
StrBegin:string类型,表示截取开始的标记。
StrEnd:string,表示截取结束的标记。
函数返回字符串StrSource中从StrSource到StrBegin之间的一段文本。
比如:
strtmp:=TForm1.GetStr(‘123456789’,‘12’,‘78’);
运行后,strtmp的值为:’3456’。
关于函数里用到的AnsiPos和copy,都是系统定义的,可以从delphi的帮助文件里找到相关说明,我在这里也简单罗嗦一下:
function AnsiPos(const Substr, S: string): Integer
返回Substr在S中第一次出现的位置。
function copy(strsource,in_sta,in_end-in_star): string;
返回字符串strsource中,从in_sta(整型数据)开始到in_end-in_star(整型数据)结束的字符串。
有了以上函数,我们就可以通过设置各种标记,来截取想要的文章内容了。在程序中,比较麻烦的是我们需要设置许多标记,要定位某一项内容,必须设置它的开始和结束标志。比如要取得网页上的文章标题,必须事先查看网页代码,查看出文章标题前边和后边的一些特征代码,通过这些特征代码,来截取文章的标题。
下面我们来实际演示一下,假设要采集的文章地址为http://www.xxx.com/test.htm
代码为:
文章标题
作者 | 出处 |
这里是文章内容正文。
’,’ ,’
然后定义strTitle、strAuthor、strCopyFrom、strContent:
strTitle:= GetStr(StrSource,’
strAuthor:= GetStr(StrSource,’ ’):’,’ ’):
strCopyFrom:= GetStr(StrSource,’ ’,’
strContent:= GetStr(StrSource,’
这样,就能把文章的标题、作者、出处和内容分别存储在以上变量中。
这样就完成了一个简单的截取过程。
最后,是将变量的值存储到本地数据库,这一步不讲了,相信大家都会。
以上的例子,非常简单,如果真正做一个采集程序,还有许多实际因素要考虑进去。比如:错误处理、多线程采集、远程入库、文章内广告内容的过滤、自动分类等等。
小小天堂 2005/05/22