因工作需要,需要抓取.cgi網頁中的內容,不知如何抓取.忘那位大俠指點.謝謝!

解决方案 »

  1.   

    省事一点的做法,使用IdHttp控件;
    牛比一点的做法,使用WinInet API函数
      

  2.   

    和html一样。
    TIdHttp 看看 Indy 的例子
      

  3.   

    和静态网页抓取没什么区别。来段代码,这是我写的从网上搜索图片的小程序中的一段,使用wininet库:
    procedure THTTPGetThread.Execute;
    var
      hSession, hConnect, hRequest: hInternet;
      HostName, FileName: String;
      f: File;
      Buf: Pointer;
      dwBufLen, dwIndex: DWord;
      Data: Array[0..$400] of Char;
      TempStr: String;
      RequestMethod: PChar;
      InternetFlag: DWord;
      AcceptType: LPStr;  procedure ParseURL(URL: String; var HostName, FileName: String);    procedure ReplaceChar(c1, c2: Char; var St: String);
        var
          p: Integer;
        begin
          while True do
           begin
            p := Pos(c1, St);
            if p = 0 then Break
            else St[p] := c2;
           end;
        end;  var
        i: Integer;
      begin
        if Pos('http://', LowerCase(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
      try
        ParseURL(FTURL, HostName, FileName);    if Terminated then begin
          FTResult := False;
          Exit;
        end;    hSession := InternetOpen(PChar(FTAgent),INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);    hConnect := InternetConnect(hSession, PChar(HostName),
          INTERNET_DEFAULT_HTTP_PORT, PChar(FTUserName), PChar(FTPassword), INTERNET_SERVICE_HTTP, 0, 0);    if FTPostQuery = '' then RequestMethod := 'GET' else RequestMethod := 'POST';    if FTUseCache then InternetFlag := 0 else InternetFlag := INTERNET_FLAG_RELOAD;    AcceptType := PChar('Accept: ' + FTAcceptTypes);
        hRequest := HttpOpenRequest(hConnect, RequestMethod, PChar(FileName), 'HTTP/1.0',
                    PChar(FTReferer), @AcceptType, InternetFlag, 0);    if FTPostQuery = '' then
         HttpSendRequest(hRequest, nil, 0, nil, 0)
        else
         HttpSendRequest(hRequest, 'Content-Type: application/x-www-form-urlencoded', 47,
                         PChar(FTPostQuery), Length(FTPostQuery));    if Terminated then
         begin
          CloseHandles;
          FTResult := False;
          Exit;
         end;    dwIndex  := 0;
        dwBufLen := 1024;
        GetMem(Buf, dwBufLen);    FTResult := HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH,
                                  Buf, dwBufLen, dwIndex);    if Terminated then
         begin
          FreeMem(Buf);
          CloseHandles;     
          FTResult := False;
          Exit;
         end;    if FTResult or not FTBinaryData then
         begin
          if FTResult then FTFileSize := StrToInt(StrPas(Buf));      BytesReaded := 0;      if FTToFile then
           begin
            AssignFile(f, FTFileName);
            Rewrite(f, 1);
           end else FTStringResult := '';      while True do
           begin
            if Terminated then
             begin
              if FTToFile then CloseFile(f);
              FreeMem(Buf);
              CloseHandles;          FTResult := False;
              Exit;
             end;        if not InternetReadFile(hRequest, @Data, SizeOf(Data), BytesToRead) then Break
            else
             if BytesToRead = 0 then Break
             else
              begin
               if FTToFile then
                BlockWrite(f, Data, BytesToRead)
               else
                begin
                 TempStr := Data;
                 SetLength(TempStr, BytesToRead);
                 FTStringResult := FTStringResult + TempStr;
                end;           inc(BytesReaded, BytesToRead);          end;
           end;      if FTToFile then
            FTResult := FTFileSize = Integer(BytesReaded)
          else
           begin
            SetLength(FTStringResult, BytesReaded);
            FTResult := BytesReaded <> 0;
           end;      if FTToFile then CloseFile(f);
         end;    FreeMem(Buf);    CloseHandles;
        ImageExploreMainWnd.Memo1.Lines.Text:=FTStringResult;
        Terminate;
      except
      end;
    end;