• delphi : 取得网页源码内容


    取得网页的源码内容的函数以及调用方法供大家参考:
    program geturl;
    uses
    wininet,
    windows;
    //取网页内容
    function StrPas(const Str: PChar): string;
    begin
    Result := Str;
    end;
    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;
    调用方法 GetWebPage(网页地址);
    Delphi取得网页源码内容的另一种办法
    unit Unit1;
    
    interface
    
    uses
       Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
       Dialogs, StdCtrls, Sockets;
    
    type
       TForm1 = class(TForm)
         Button1: TButton;
         TcpClient1: TTcpClient;
         Memo1: TMemo;
         Edit1: TEdit;
         procedure Button1Click(Sender: TObject);
       private
         { Private declarations }
       public
         { Public declarations }
       end;
    
    var
       Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
       Test: string;
       HttpLen: integer;
    begin
       TcpClient1.RemoteHost := 'www.163.cn';
       TcpClient1.RemotePort := '80';
       TcpClient1.Active := true;
       if TcpClient1.Connected then
       begin
         //发送HTTP1.1指令
         TcpClient1.Sendln('GET / HTTP/1.1');
         TcpClient1.Sendln('Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*');
         TcpClient1.Sendln('User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon)');
         TcpClient1.Sendln('Host: www.163.cn');
         TcpClient1.Sendln('Connection: Keep-Alive');
         TcpClient1.Sendln('');
       end;
       HttpLen := 0;
       //循环读取所有返回的数据头信息
       while true do
       begin
         Test := TcpClient1.Receiveln();
         Memo1.Lines.Add(Test);
         if Test = '' then Break;
         if Pos('Content-Length: ', Test) > 0 then
         begin
           Delete(Test, 1, 16);
           HttpLen := StrToInt(Test); //获取将要读取的数据长度
         end;
       end;
       LockWindowUpdate(Memo1.Handle);
       Memo1.Clear;
    //循环读取所有返回的数据直接数据接收完毕
       while (Length(Memo1.Text) < HttpLen - 2) or (TcpClient1.WaitForData(0) and (HttpLen = 0)) do
       begin
         Memo1.Lines.Add(TcpClient1.Receiveln(#$0D#$0A));
         Application.ProcessMessages;
         Edit1.Text := Format('总长度:%d   已下载:%d ', [HttpLen, Length(Memo1.Text)]);
       end;
    
       //有些网页返回的非ANSI字符串,则需要转码,否则中文全是乱码
       if Length(Memo1.Text) = HttpLen - 2 then Memo1.Text := Utf8ToAnsi(Memo1.Text);
    
       LockWindowUpdate(0);
       Memo1.Lines.SaveToFile('d:	est.txt');
       ShowMessage('完成数据下载');
    end;
    
    end.
    

      

  • 相关阅读:
    linux 总结一下git reset的各个选项吧
    深入C++的new
    Android中binderDied()以及"Unknown binder error code" 出现的原因说明
    C/C++语言void及void指针深层探索
    Android 不通过USB数据线调试的方法
    Android Browser Gallery3D无法两指手势缩放
    Android eMMC Booting
    android基础知识13:AndroidManifest.xml文件解析
    Package sunjava6jdk is not available Ubuntu 10.04 LTS 安装sunjava6jdk ,出现错误
    SQL Server 2008中Service Broker基础应用(上)
  • 原文地址:https://www.cnblogs.com/94YY/p/3481372.html
Copyright © 2020-2023  润新知