Delphi实现网页采集


  说到网页采集,通常大家 认为到网上偷数据, 而后把到收集到的数据挂到自己网上去 。其实也 可以将采集到的数据做为公司的参考,或把收集的数据跟自己公司的业务做对照等 。

当前网页采集多为3P代码为多(3P即ASP、PHP 、JSP) 。用得最有代表的就动易科技公司BBS中新闻采集系统,和网上流传的新浪新闻采集系统等都是用ASP程序来 使用,但速度从 实际上来说不是很好 。假如尝试用其它软件的多线程采集是否更快?答案是 确定的 。用DELPHI、VC、VB、JB都 可以,PB 仿佛 比较不好做 。以下用DELPHI来解释采集网页数据 。

   方便的新闻采集

新闻采集是最 方便的, 惟独 鉴别 题目、副题、作者、出处、日期、新闻主体、分页就 可以了 。在采集之前 确定要 获得网页的内容,所以在DELPHI里加入idHTTP控件(在indy Clients面板), 而后用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(‘A123BCD’,‘A’,‘BC’);

运行后,strtmp的值为:’123’ 。

对于函数里用到的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

代码为:

<html>

<head>

<meta http-equiv="Content-Language" content="zh-cn">

<meta name="GENERATOR" content="Microsoft FrontPage 5.0">

<meta name="ProgId" content="FrontPage.Editor.Document">

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>新建网页 1</title>

</head>

<body>

<p align="center"><b>文章 题目</b></p>

<table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber1">

<tr><td width="60%">作者</td>

<td width="40%">出处</td></tr>

</table>

<p><font size="2">这里是文章内容 诠释 。</font></p>

<a href='..new_pr.asp'>上一页</a> <a href='new_ne.asp'>下一页</a>

</body>

</html>

第一步,我们用StrSource:= idHTTP1.Get(‘http://www.xxx.com/test.htm ’);将网页代码 保留在strsource变量中 。

而后定义strTitle、strAuthor、strCopyFrom、strContent:

strTitle:= GetStr(StrSource,’ <p align="center"><b>’,’ </b></p>’):

strAuthor:= GetStr(StrSource,’ <tr><td width="60%">’,’ </td>’):

strCopyFrom:= GetStr(StrSource,’ <td width="40%">’,’ </td></tr>’):

strContent:= GetStr(StrSource,’ <p><font size="2">,’ </font></p>’):

这样,就能把文章的 题目、副题、作者、出处、日期、内容和分页分别存储在以上变量中 。

第二步,用循环的 步骤, 打开下一页,并 获得内容,加到strContent变量中 。

StrSource:= idHTTP1.Get(‘new_ne.asp’);

strContent:= strContent +GetStr(StrSource,’ <p><font size="2">,’ </font></p>’):

而后再推断有没有下一页,假如还有就接着 获得下一页的内容 。

这样就 实现了一个 方便的截取过程 。从以上的程序代码 可以看到,我们 使用的截取 步骤都是找截取内容的头部和尾部的,假如遇到这个头部和尾部有多个怎么办? 仿佛没 步骤,只会找到第一个,所以在找之前应该验证一下是否惟独一处有这个截取的内容的前后部 。