下述为新闻采集程序,在理解了新闻采集程序的基础之上就可以做出网络爬虫程序了.
今天,我们讨论的是网站新闻采集程序的制作。所谓新闻采集程序,就是自动抓取网上信息,并保存到自己网站数据库的一种程序。现在很多大型网站都有自己的新闻采集系统,其中许多采集系统价值不菲。通过这篇文章,我希望大家都能自己做一个采集程序,来维护自己的网站。
为了便于理解,先阐述一下本文的新闻采集程序的一些基本信息。这里的新闻系统,是用delphi实现,并将采集到的数据保存到本地access数据库。所以,这将是一个基与桌面的采集程序,而不是类似“动易采集”的基于浏览器。个人认为,基于桌面的采集系统,更容易实现强大的功能,有更高的稳定和安全性能。而经过扩展,大家完全可以把这个例子做成可以访问远程数据库的大型采集系统。
在说如何制作采集程序之前,我们先来定义一个本地access数据库,用来存取采集到的信息。这个数据库只有一个表,表名”T_Article”,该表有ArticleID、ClassID、Title、Keyword、CopyFrom、Content六个字段,分别代表新闻的编号、类别编号、标题、关键字、出处、内容。
首先,所谓采集,第一步当然是要能抓取信息,并且是能按照用户的要求,从网上抓取相关信息。这里假设我们要抓取 dev.csdn/article/69/69929.shtm 的文章,加到自己网站的“delphi技术”这么一个栏目。首先要做的,是读取 dev.csdn/article/69/69929.shtm 上的文章列表,然后通过列表索引,逐篇将文章正文内容读到我们的网站数据库。接下来将是关键,如何采集 dev.csdn/article/69/69929.shtm 上的文章列表。这里分为两步,一、利用delphi网络功能,读取69929.shtm的HTML源文件。二、通过分析69929.shtm的源文件,截取其中列表部分。第一步的实现,可以用delphi的indy控件族的idHTTP控件,该控件在indy Clients面板,该控件的具体使用,将在后面讲解,现在我们只要知道,给定一个URL地址,就能通过indy控件返回该URL的网页源代码。第二步的实现,则是简单的字符串处理了。
我们先来讨论第二步如何实现,打开dev.csdn/article/69/69929.shtm ,可以看到左边是“我的技术中心”“最新文档列表”等东西,这些和我们没有关系。右边则是一篇篇文章的列表,这些就是我们要的。如何截取列表里的内容呢?查看网页的源代码,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> |
<a>上一页</a> |
<a href="javascript:__doPostBack('ArticleList1$ArticleList1$PageNav1','2')">下一页</a> |
<a href="javascript:__doPostBack('ArticleList1$ArticleList1$PageNav1','71')">末页</a> |
跳转到<select name onchange="javascript:__doPostBack('ArticleList1:ArticleList1:PageNav1',this.value)">
<option selected="selected" value="1">1</option>
接下来,我们要做的只是利用字符串函数,截取这两段代码中间的部分——“文章列表”。具体函数,也将在后面详细讲解。得到文章列表后,我们还要进一步处理,截取出每篇文章的url地址,因为前边已经讲过,给定一个url,idHTTP控件能够返回网页代码。当我们返回文章列表里每篇文章的源代码的时候,就等于说把文章内容采集回来了,只要进一步分析处理,就能保存进本地数据库,从而完成采集工作。
那么如何取得文章列表里每篇文章的url呢?通过查看69929.shtm的源文件,我们发现列表里的每个超链接是这样的格式:<a id="ArticleList1_ArticleList1_Repeater1__ctl33_HyperLink1" href="article/68/68316.shtm" t
arget="_blank">Oracle中通过存储过程中返回数据集及在Delphi中使用 </a>。显然,我们只要截取出 “rticle/68/68316.shtm”,再加上dev.csdn/article/69就是“Oracle中通过存储过程中返回数据集及在Delphi中使用”这篇文章的URL了。
现在,假设我们已经取得了列表中每篇文章的URL,我们只循环读取每篇文章的网页代码,再利用HTML里的特征字符,分离出文章的“标题”、“作者”、“出处”、“内容”等信息,然后一一保存进本地数据库。
具体实现
首先,程序将用到idHTTP控件(在indy Clients面板)。关于该控件的详细文档,E文好的朋友可以登陆这里查看:/ 本程序用到的GET方法在第53页。网上关于indy的帮助文档也整理了不少,可是我一直没到中文的。在本程序中,我们只使用idHTTP控件的一个方法,就是idHTTP1.GET 方法。该方法是这样声明的:
function Get(AURL: string): string; overload;
AURL参数,是string类型,指定一个URL地址字符串。函数返回也是string类型,返回网页
的HTML源文件。比如我们可以这样调用:
tmpStr:= idHTTP1.Get(‘www.163’);
调用成功后,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(整型数据)结束的字符串。
有了以上函数,我们就可以通过设置各种标记,来截取想要的文章内容了。在程序中,比较麻烦的是我们需要设置许多标记,要定位某一项内容,必须设置它的开始和结束标志。比如要取得网页上的文章标题,必须事先查看网页代码,查看出文章标题前边和后边的一些特征代码,通过这些特征代码,来截取文章的标题。
下面我们来实际演示一下,假设要采集的文章地址为/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" bordercolor="#111111" width="100%" id="AutoNumber1">
<tr><td width="60%">作者</td>
<td width="40%">出处</td></tr>
简单网页制作源代码</table>
<p><font size="2">这里是文章内容正文。</font></p>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论