H
hlhhh
Unregistered / Unconfirmed
GUEST, unregistred user!
我要做的是 一个只搜索网址的(网络蜘蛛)爬爬虫类工具。给你一个主页,按我们给出条件的搜索出它目录下的所有网页,然后存在数据库里。。
举个例子输入www.163.com 然后条件是music。那么搜索出来的网址必须是163.com目录下的,而且这些网址里必须包含有music字符。。一个网址 有很多层,所以需要进行循环搜索。我出的问题是在这循环上。。
我现在是把 所有记录都存在 一个字符串数组变量(urlstring)里的,记录少的话,还是可行的。。但是超过1万条以上,就差不多需要3个小时以上。最重要的问题是 内存飙升。。。如果记录达到10万以上或是更多会占满内存的,那样应该是死机了。大家替我想想办法,解决这占超大内存的问题。
我如今的程序是这样子的。
procedure TfrmGetInform.Button1Click(Sender: TObject);
var
i:Integer;
begin
if ADOConnection1.Connected then
ADOConnection1.Close;
ADOConnection1.Connected:= true;
Memo1.Lines.Clear;
Memo1.Lines.Add('开始时间'+DateTimeToStr(Now));
GetStrCondition;
CheckURLInform;
GetUrlType;
urlstring[0]:= RootUrl;
for i:=0 to length(urlstring)-1 do //
begin
if not searchFlag then break;
if urlstring = '' then break;
GetAllUrl(urlstring);
end;
//存为数据库中去
for i:=0 to length(urlstring)-1 do
begin
if urlstring = '' then break;
SavesToDataBase(urlstring);
end;
Memo1.Lines.Add('结束时间'+DateTimeToStr(Now));
Memo1.Lines.Add('总共条数'+InttoStr(i));
Button1.Enabled:= false;
Button2.Enabled:= true;
// Button2.Click;
end;
//执行获取下层连接
procedure TfrmGetInform.GetAllUrl(surl:string);
var
str,sStr:string;
i:Integer;
pstr:string;
furl:string;
sonarr:array of string;
begin
sStr:='';
pstr:= '';
furl:='';
setlength(sonarr,100000);
if strCondition = '' then exit;
sStr:= GetWebPage(surl);
str:= IncludeStr(sStr);
sonarr[0]:= surl;
while str <>'' do
begin
if pos('"',str)>0 then
str:= copystr(str,'"',-1);
furl:= UrlConfig(surl,str);
if furl <> '' then
begin
for i:=0 to length(sonarr)-1 do
begin
if furl = sonarr then break;
if sonarr='' then
begin
sonarr:= furl;
break;
end;
end;
end;
str:= IncludeStr(allStr);
end;
for i:= 1 to length(sonarr)-1 do
begin
if sonarr='' then exit;
CheckUrlIsExist(sonarr);
if not searchFlag then exit;
end;
end;
//比较是否有重复
procedure TfrmGetInform.CheckUrlIsExist(fstr:string);
var
i:Integer;
m,n:string;
begin
m:='';
n:='';
for i:=0 to length(urlstring)-1 do
begin
if (fstr = urlstring) then exit;
m:= urlstring+'/';
if (fstr= m)then exit;
n:= fstr + '/';
if (n = urlstring) then exit;
if urlstring ='' then
begin
urlstring:= fstr;
//SavesToDataBase(fstr);
Memo1.Lines.Add(InttoStr(i)+'.'+urlstring);
if urlstring[length(urlstring)-1] <> '' then
searchFlag:= false;
//停止搜索
exit;
end;
end;
end;
能具体请教的,希望留下QQ或者MSN,或是加我。可以吗?? QQ157647204---MSN:mzh198420@hotmail.com
谢谢 祝大家七夕快乐。
举个例子输入www.163.com 然后条件是music。那么搜索出来的网址必须是163.com目录下的,而且这些网址里必须包含有music字符。。一个网址 有很多层,所以需要进行循环搜索。我出的问题是在这循环上。。
我现在是把 所有记录都存在 一个字符串数组变量(urlstring)里的,记录少的话,还是可行的。。但是超过1万条以上,就差不多需要3个小时以上。最重要的问题是 内存飙升。。。如果记录达到10万以上或是更多会占满内存的,那样应该是死机了。大家替我想想办法,解决这占超大内存的问题。
我如今的程序是这样子的。
procedure TfrmGetInform.Button1Click(Sender: TObject);
var
i:Integer;
begin
if ADOConnection1.Connected then
ADOConnection1.Close;
ADOConnection1.Connected:= true;
Memo1.Lines.Clear;
Memo1.Lines.Add('开始时间'+DateTimeToStr(Now));
GetStrCondition;
CheckURLInform;
GetUrlType;
urlstring[0]:= RootUrl;
for i:=0 to length(urlstring)-1 do //
begin
if not searchFlag then break;
if urlstring = '' then break;
GetAllUrl(urlstring);
end;
//存为数据库中去
for i:=0 to length(urlstring)-1 do
begin
if urlstring = '' then break;
SavesToDataBase(urlstring);
end;
Memo1.Lines.Add('结束时间'+DateTimeToStr(Now));
Memo1.Lines.Add('总共条数'+InttoStr(i));
Button1.Enabled:= false;
Button2.Enabled:= true;
// Button2.Click;
end;
//执行获取下层连接
procedure TfrmGetInform.GetAllUrl(surl:string);
var
str,sStr:string;
i:Integer;
pstr:string;
furl:string;
sonarr:array of string;
begin
sStr:='';
pstr:= '';
furl:='';
setlength(sonarr,100000);
if strCondition = '' then exit;
sStr:= GetWebPage(surl);
str:= IncludeStr(sStr);
sonarr[0]:= surl;
while str <>'' do
begin
if pos('"',str)>0 then
str:= copystr(str,'"',-1);
furl:= UrlConfig(surl,str);
if furl <> '' then
begin
for i:=0 to length(sonarr)-1 do
begin
if furl = sonarr then break;
if sonarr='' then
begin
sonarr:= furl;
break;
end;
end;
end;
str:= IncludeStr(allStr);
end;
for i:= 1 to length(sonarr)-1 do
begin
if sonarr='' then exit;
CheckUrlIsExist(sonarr);
if not searchFlag then exit;
end;
end;
//比较是否有重复
procedure TfrmGetInform.CheckUrlIsExist(fstr:string);
var
i:Integer;
m,n:string;
begin
m:='';
n:='';
for i:=0 to length(urlstring)-1 do
begin
if (fstr = urlstring) then exit;
m:= urlstring+'/';
if (fstr= m)then exit;
n:= fstr + '/';
if (n = urlstring) then exit;
if urlstring ='' then
begin
urlstring:= fstr;
//SavesToDataBase(fstr);
Memo1.Lines.Add(InttoStr(i)+'.'+urlstring);
if urlstring[length(urlstring)-1] <> '' then
searchFlag:= false;
//停止搜索
exit;
end;
end;
end;
能具体请教的,希望留下QQ或者MSN,或是加我。可以吗?? QQ157647204---MSN:mzh198420@hotmail.com
谢谢 祝大家七夕快乐。