M
meme258
Unregistered / Unconfirmed
GUEST, unregistred user!
delphi 编写一个采集网页的问题,
采集百度Index.baidu.com
在获取 index.baidu.com 的网页源代码的时候,遇到问题,找不到答案求教高手。
分别尝试了,用 indy 9, wininet,MSXML2 获得这个页面的代码,都遇到了问题,
代码 以及遇到的问题,下面详细描述,首先谢谢大家浏览这个帖子
1,wininet 获取 index.baidu.com 的源码 下面是代码,
一个 长循环中,比如要使用这个函数1000次获取1000个源码
http://index.baidu.com/main/word.php?word=delphi
执行2,3次以后每一次使用GetWebPage 获取都非常慢,需要很长时间1,2分钟这个函数才能执行完毕,返回值。
function GetWebPage(const url: string): string;
var
hInet: HINTERNET;
hFile: HINTERNET;
buffer: array[1..1024] of char;
bytesRead: DWORD;
begin
hInet := InternetOpen(PChar('Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.0)'),
INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
hFile := InternetOpenURL(hInet,PChar(url),nil,0,0,0);
if Assigned(hFile) then
begin
repeat
InternetReadFile(hFile,@buffer,SizeOf(buffer),bytesRead);
result := result + Copy(buffer,1,bytesRead);
until bytesRead = 0;
InternetCloseHandle(hFile);
end;
InternetCloseHandle(hInet);
end;
2,MSXML2, 用MSXML2.XMLHTTP获取的时候,速度倒是非常快,原因之一就是
第一次获取之后,以后每次获取不同的网址,得到的结果都是一样,
我考虑,是不是xmlHttp 创建以后 需要释放 vb里面的 set xmlhttp = nothing,
这里不知道该如何写,也不知道是不是这个原因。
function GetWebPage(const url: string): string;
var
xmlHttp:Olevariant;
responseText:Widestring;
a:Integer;
ay: array of byte;
begin
xmlHttp:=CreateOleObject('MSXML2.XMLHTTP');
xmlHttp.open('get',url,false);
xmlHttp.send;
ay := xmlHttp.responseBody;
//xmlHttp:='';
for a:=Low(ay) to High(ay) do //将字节转换成字符
Result:=Result+chr(ay[a]);
//ay:=nil;
end;
3,indy 9 在线程里面创建 使用idhttp,速度也非常快,但是过不了几次以后,就会出现 Connection Closed Gracefully 这个错误而获取不到源码了,搜索之后找到一个原因说 baidu 屏蔽了 userAgent indy 这个标志,于是加上下面的 UserAgent 还是出现同样的问题,最终还是没有解决。
function dThread.GetWebPage(const url: string): string;
begin
// idhp.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';
Result := idhp.Get(url);
end;
期待高人。。。。
采集百度Index.baidu.com
在获取 index.baidu.com 的网页源代码的时候,遇到问题,找不到答案求教高手。
分别尝试了,用 indy 9, wininet,MSXML2 获得这个页面的代码,都遇到了问题,
代码 以及遇到的问题,下面详细描述,首先谢谢大家浏览这个帖子
1,wininet 获取 index.baidu.com 的源码 下面是代码,
一个 长循环中,比如要使用这个函数1000次获取1000个源码
http://index.baidu.com/main/word.php?word=delphi
执行2,3次以后每一次使用GetWebPage 获取都非常慢,需要很长时间1,2分钟这个函数才能执行完毕,返回值。
function GetWebPage(const url: string): string;
var
hInet: HINTERNET;
hFile: HINTERNET;
buffer: array[1..1024] of char;
bytesRead: DWORD;
begin
hInet := InternetOpen(PChar('Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.0)'),
INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
hFile := InternetOpenURL(hInet,PChar(url),nil,0,0,0);
if Assigned(hFile) then
begin
repeat
InternetReadFile(hFile,@buffer,SizeOf(buffer),bytesRead);
result := result + Copy(buffer,1,bytesRead);
until bytesRead = 0;
InternetCloseHandle(hFile);
end;
InternetCloseHandle(hInet);
end;
2,MSXML2, 用MSXML2.XMLHTTP获取的时候,速度倒是非常快,原因之一就是
第一次获取之后,以后每次获取不同的网址,得到的结果都是一样,
我考虑,是不是xmlHttp 创建以后 需要释放 vb里面的 set xmlhttp = nothing,
这里不知道该如何写,也不知道是不是这个原因。
function GetWebPage(const url: string): string;
var
xmlHttp:Olevariant;
responseText:Widestring;
a:Integer;
ay: array of byte;
begin
xmlHttp:=CreateOleObject('MSXML2.XMLHTTP');
xmlHttp.open('get',url,false);
xmlHttp.send;
ay := xmlHttp.responseBody;
//xmlHttp:='';
for a:=Low(ay) to High(ay) do //将字节转换成字符
Result:=Result+chr(ay[a]);
//ay:=nil;
end;
3,indy 9 在线程里面创建 使用idhttp,速度也非常快,但是过不了几次以后,就会出现 Connection Closed Gracefully 这个错误而获取不到源码了,搜索之后找到一个原因说 baidu 屏蔽了 userAgent indy 这个标志,于是加上下面的 UserAgent 还是出现同样的问题,最终还是没有解决。
function dThread.GetWebPage(const url: string): string;
begin
// idhp.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';
Result := idhp.Get(url);
end;
期待高人。。。。