问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Delphi实现网页采集

发布网友 发布时间:2023-06-06 01:23

我来回答

1个回答

热心网友 时间:2024-12-02 03:20


说到网页采集,通常大家以为到网上偷数据,然后把到收集到的数据挂到自己网上去。其实也可以将采集到的数据做为公司的参考,或把收集的数据跟自己公司的业务做对比等。
目前网页采集多为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(‘
调用成功后,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(整型数据)结束的字符串。
有了以上函数,我们就可以通过设置各种标记,来截取想要的文章内容了。在程序中,比较麻烦的是我们需要设置许多标记,要定位某一项内容,必须设置它的开始和结束标志。比如要取得网页上的文章标题,必须事先查看网页代码,查看出文章标题前边和后边的一些特征代码,通过这些特征代码,来截取文章的标题。
下面我们来实际演示一下,假设要采集的文章地址为
代码为:
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"
trtd width="60%"作者/td
td width="40%"出处/td/tr
/table
pfont size="2"这里是文章内容正文。/font/p
a href='..new_pr.asp'上一页/a a href='new_ne.asp'下一页/a
/body
/html
第一步,我们用StrSource:= idHTTP1.Get(‘ ’);将网页代码保存在strsource变量中。
然后定义strTitle、strAuthor、strCopyFrom、strContent:
strTitle:= GetStr(StrSource,’ p align="center"b’,’ /b/p’):
strAuthor:= GetStr(StrSource,’ trtd width="60%"’,’ /td’):
strCopyFrom:= GetStr(StrSource,’ td width="40%"’,’ /td/tr’):
strContent:= GetStr(StrSource,’ pfont size="2",’ /font/p’):
这样,就能把文章的标题、副题、作者、出处、日期、内容和分页分别存储在以上变量中。
第二步,用循环的办法,打开下一页,并取得内容,加到strContent变量中。
StrSource:= idHTTP1.Get(‘new_ne.asp’);
strContent:= strContent +GetStr(StrSource,’ pfont size="2",’ /font/p’):
然后再判断有没有下一页,如果还有就接着取得下一页的内容。
这样就完成了一个简单的截取过程。从以上的程序代码可以看到,我们使用的截取办法都是找截取内容的头部和尾部的,如果遇到这个头部和尾部有多个怎么办?似乎没办法,只会找到第一个,所以在找之前应该验证一下是不是只有一处有这个截取的内容的前后部。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
梦见和同性发生关糸了 梦见和同性朋友发生亲密关系 学生党如何科学护肤? 学生党该怎么基础护肤? 有什么美容护肤的技巧适合学生党? 怎么@全部成员啊? 新洲摩尔城一楼小吃租金多少 武汉王家湾有哪些广场 你好 请问 晚上6点开始 学瑜伽 可以吗? 因为我想在下班时间去 锻炼锻 ... 电脑联网有哪些条件台式电脑无线上网需要具备哪些条件 涂鸦智能电采暖炉几个档 慢性贤病ckd4期危险吗 CKD4期是不是很严重了? 诊断结果是Ckd4期,肾性贫血,慢性肾功能不全,请问像这种情况可以治愈么... 《色戒》为什么要去刺杀易先生? 色戒结局易先生活了下来? 色戒的片段是真实的吗? 王佳芝为什么要跟易先生走? 色戒女主为什么背叛 王佳芝为什么放走了易先生? mⅰssⅰon是什么意思? 布道团什么意思 信用证上的条款,不知是什么意思? 梦见别人病倒的预兆 班组安全管理的四心是什么 ...雄养十四年)最近二只龟一直打架,互相撕咬,请问是怎么回事... 怎样防止草龟打架 我家的巴西龟怎么老是打架小乌龟前爪都破了能告诉我为什么吗? 两只乌龟在一个缸里为什么总打架 我的铜钱比一般大点,重点,戴了几年不亮,有点绿,是什么铜钱 PB问题~在线等 四川省成都市驿成区在河南泌阳县哪个方向呀? ...在四川省吗?以四川省龙泉驿为最著名吗?四川省有龙泉驿、白市驿... 成都西博园和驿都城哪个离市区近 白市驿地铁站会建在哪 成都市龙泉驿安驿院子在哪里 想知道: 成都市 龙泉驿区驿道大道 在哪 跪求!!!成都市区到重庆白市驿怎么走?(自驾) 蟑螂白天突然跑出来五六只预示着什么? 空调最小的是几匹的。 露似真珠月似弓里真珠是什么意思? 白居易《暮江吟》中的"真珠"是指什么 信用卡免息期是多久 信用卡免息还款一般有多久 信用卡有多少天免息期 求视频:天气温是0℃,明天预计气温会比今天冷两倍,请问明天气温是多少... ...男生是最近怎么总发亲亲的视频呢?是天气太冷了,想找男朋友了?是什么... [WebQuest在高职《环境工程学》课程教学中的应用] 环境工程原理第三版... 我的c盘总是自动出现一个叫imlog的文件夹,这个是干什么用的,哪位高手... 在日本买东西标チ0ト65000,是日元还是人民币