这个函数直接获取网页源码,很好,可对大小不确定的网页就无能为力了,该怎么修改?谢了。(10分)

  • 主题发起人 主题发起人 foxgirl
  • 开始时间 开始时间
F

foxgirl

Unregistered / Unconfirmed
GUEST, unregistred user!
来自:小雨哥, 时间:2003-2-22 4:49:00, ID:1637595
获取网页源代码的最简单办法,就是利用 WinInet 单元中的函数:
uses WinInet;
function GetWebPage(const Url: string):string;
var
Session,
HttpFile:HINTERNET;
szSizeBuffer:Pointer;
dwLengthSizeBuffer:DWord;
dwReserved:DWord;
dwFileSize:DWord;
dwBytesRead:DWord;
Contents:PChar;
begin
Session:=InternetOpen('',0,niL,niL,0);
HttpFile:=InternetOpenUrl(Session,PChar(Url),niL,0,0,0);
dwLengthSizeBuffer:=1024;
HttpQueryInfo(HttpFile,5,szSizeBuffer,dwLengthSizeBuffer,dwReserved);
GetMem(Contents,dwFileSize);
InternetReadFile(HttpFile,Contents,dwFileSize,dwBytesRead);
InternetCloseHandle(HttpFile);
InternetCloseHandle(Session);
Result:=StrPas(Contents);
FreeMem(Contents);
end;
使用时,直接把收到的源代码显示出来:
Memo1.Text := GetWebPage('http://www.delphibbs.com/delphibbs/listq.asp');


对于大小不定的网页,就不能正常取出源文件了,该怎么改进?我只有这点分了。

 
请问:这个函数的速度怎样?
另外,何谓“大小不定”?
 
汗~~~~
上面写的这个函数思路没有错误,但函数本身有错误。
理论上通过 HttpQueryInfo( ) 可以接收到目标网页的实际大小,在这个代码里没有反映
出来。而 InternetReadFile( ) 有 2 种用法,一是直接一次性读网页,二是通过判断返
回值来确定有没有读完,没有读完,就再次进入 InternetReadFile( ) 读一次,直到读
完。另外讲速度应该比 COM 快吧。
 
iseek:
速度还可以,大小不定是指该文件的大小是已知或者或者的,用flashget断点继传时就知道,未知大小的不能断点续传。


flamingo:
那要怎么改,才能做到不管网页大小已知还是未知,都可以取得源文件?InternetReadFile的两种用法,可否举个例子讲解一下?谢谢。
 
关注,也想知道答案。
听课ing.
 
使用Http客户端控件也可以的,可以进行比较详细的控制
 
谢谢foxgirl
 
谢谢flamingo同志。
我在离线数据包中又找到了小雨哥及其他同志的方法,很快搞定了。
 
foxgirl
贴出来大家共享?
呵呵。
 
高手们写的函数:
function HttpRequestExecute(const URL, QureyData: string): string;
var
hSession, hConnect, hRequest: hInternet;
RequestMethod, TempStr, HostName, FileName: string;
BytesToRead : cardinal;
DataLength : integer;
AData : array[0..40960] of char;
InternetFlag : LongWord;
AcceptType : PAnsiChar;
Buf : array[0..1023] of char;
dwBufLen, dwIndex: LongWord;
procedure ParseURL(URL: string; var HostName, FileName: string);
var
i : Integer;
begin
if Pos('http://', URL) <> 0 then
System.Delete(URL, 1, 7);
i := Pos('/', URL);
HostName := Copy(URL, 1, i);
FileName := Copy(URL, i, Length(URL) - i + 1);
if (Length(HostName) > 0) and (HostName[Length(HostName)] = '/') then
SetLength(HostName, Length(HostName) - 1);
end;
procedure CloseHandles;
begin
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
end;
begin
result := '';
ParseURL(URL, HostName, FileName);
hSession := InternetOpen(PChar(''),
INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
hConnect := InternetConnect(hSession, PChar(HostName),
INTERNET_DEFAULT_HTTP_PORT, '', '', INTERNET_SERVICE_HTTP, 0, 0);
if QureyData = '' then RequestMethod := 'GET'
else RequestMethod := 'POST';
InternetFlag := 0;
AcceptType := PChar('Accept: */*');
hRequest := HttpOpenRequest(hConnect, PChar(RequestMethod), PChar(FileName), 'HTTP/1.0',
'', @AcceptType, InternetFlag, 0);
if QureyData = '' then
HttpSendRequest(hRequest, nil, 0, nil, 0)
else
HttpSendRequest(hRequest, 'Content-Type: application/x-www-form-urlencoded', 47,
PChar(QureyData), Length(QureyData));
BytesToRead := 0;
dwIndex := 0;
dwBufLen := sizeof(Buf);
HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH, @Buf, dwBufLen, dwIndex);
DataLength := StrToIntDef(Buf, 0);
while InternetReadFile(hRequest, @AData, SizeOf(AData), BytesToRead) do
begin
if BytesToRead = 0 then break;
SetString(TempStr, AData, BytesToRead);
Result := Result + TempStr;
end;
CloseHandles;
end;

使用时:
memo2.Lines.Text :=HttpRequestExecute(edit1.Text ,'') ;
 
后退
顶部