已知一个网址,如何获得该网址对应的html源代码,以字符串的形式?在delphi中如何实现?今天不解决,没饭吃了

解决方案 »

  1.   

    使用Indy的TIdHTTP组件。
    st: TStringStream;
    st := TStringStream.Creat('');
    IdHTTP1.Get('网址',st);
    ShowMessage(st.DataString);
    st.Free;
      

  2.   

    谢谢楼上的,
    for i:=14 to 20 do
      begin
        str_url0 := 'http://searchjob.chinahr.com/BrowseOneJobInfo.aspx?jid=222002008805230002';
        str_url := str_url0+IntToStr(i)+'&createdate=2006-01-12';
        //Memo1.Text := str_url;
        st := TStringStream.Create('');
        IdHTTP1.Get(str_url,st);
        str_content := st.DataString;
        //Memo1.Text := str_content;
        st.Free;
        with ADOQuery1 do
        begin
          Close;
          sql.Clear;
          SQL.Add('insert into temp(webinfo,url,content) values(:prm_webinfo,:prm_url,:prm_content)');
          Parameters.ParamByName('prm_webinfo').Value := str_webinfo;
          Parameters.ParamByName('prm_url').Value := str_url;
          Parameters.ParamByName('prm_content').Value := str_content;
          Prepared;
          ExecSQL;
          //st.Free;
        end;
        //ShowMessage(str_url0);
      end;
    我在这段代码中,得到的某些链接不存在的,所以会报错,也得不到str_content := st.DataString;如何避免这个问题呢?
    上面代码效率过低,如何解决这个问题?多线程如何实现?
    初次接触,高手指教!
      

  3.   

    如果链接不存在而报错只能用Try来避免。
    效率低这有可能是网速慢或服务器反应慢,这很难解决的。
    最好打开IdHTTP1.HandleRedirects := True;
    和设定ReadTimeOut属性。
      

  4.   

    多线程只要把IdHTTP在线程里面实现就可以了,线程完成后把所获得的数据(DataString)传出来让主线程执行数据库操作,只要你写过多线程那就不难写。
      

  5.   

    to liyinwei(月夜彩虹) :
       谢谢您的耐心解答,在多线程方面,还没接触过。我主要想提高性能。
      

  6.   

    unit unt_GetHTML;interfaceuses
      IdHTTP, IdTCPConnection, IdTCPClient, Classes, Dialogs, Graphics, Controls,
      SysUtils, Windows, Messages, Variants, StdCtrls;type
      PStr = ^String;
      PBnl = ^Boolean;  THTMLThread = class(TThread)  private
        FsHTMLCode: PStr;
        FiState: PBnl;
        FURL: String;  protected
        procedure Execute; override;  public
        constructor Create(AURL: String; var AHTMLCode: String; var AState: Boolean);  end;  THTML = class(THTMLThread);implementation{ TCommandThread }constructor THTMLThread.Create(AURL: String; var AHTMLCode: String;
                var AState: Boolean);
    begin
      FURL := AURL;
      FsHTMLCode := @AHTMLCode;
      FiState := @AState;
      FreeOnTerminate := True;
      inherited Create(False);
    end;procedure THTMLThread.Execute;
    var
    //  sValue: String;
      sStream: TStringStream;
      IdHTTP: TIdHTTP;
    begin
      sStream := TStringStream.Create('');
      ReturnValue := 10000;
      IdHTTP := TIdHTTP.Create(nil);
      IdHTTP.HandleRedirects := True;
      IdHTTP.ReadTimeout := 15000;
      try
        IdHTTP.Get(FURL,sStream);
        FsHTMLCode^ := sStream.DataString;
        FiState^ := True;
      except
        FiState^ := False;
      end;
      IdHTTP.Free;
      sStream.Free;
      inherited;
    end;end.
      

  7.   

    上面的就是线程的代码,就看楼主怎么用了。
    以下是主线程调用的部分
    //AURL:地址
    //FsBody: 用于接收返回的HTML字符串
    //FbGetHttpState:标记是否成功
    //GetHTMLCode:自定义的过程,线程接收后会执行,在哪里可以加入处理数据库的代码
    begin
      try
        FbGetHttpState := False; 
        sHTML := THTML.Create(AURL,FsBody,FbGetHttpState);  
        sHTML.OnTerminate := GetHTMLCode;
      except
        WriteLog('[CreateThread]异常[' + AURL + ']',1);
        try
          GetCorpInformation;
        except
        end;  
      end;
    end;
      

  8.   

    WriteLog('[CreateThread]异常[' + AURL + ']',1);
        try
          GetCorpInformation;
        except
        end;  
    以上这部分可以不要
      

  9.   

    看看我的模块,嘻嘻,一般情况没有问题~:)
    http://community.csdn.net/Expert/topic/4533/4533716.xml?temp=.4751551
      

  10.   


    来自:小雨哥, 时间: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');