2019-06-22 Delphi IDHTTP用法详解

https://www.cnblogs.com/minideas/p/3799211.html


一、IDHTTP的基本用法 

IDHttp和WebBrowser一样,都可以实现抓取远端网页的功能,但是http方式更快、更节约资源,缺点是需要手动维护cook,连接等 

IDHttp的创建,需要引入IDHttp 

procedure InitHttp(); 

begin

    http := TIdHTTP.Create(nil); 

    http.ReadTimeout := 30000; 

    http.OnRedirect := OnRedirect; 

    http.Request.Accept := 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*'; 

    http.Request.AcceptLanguage := 'zh-cn'; 

    http.Request.ContentType := 'application/x-www-form-urlencoded'; 

    http.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)'; 

    http.ProxyParams.ProxyServer := '代理服务器地址'; 

    http.ProxyParams.ProxyPort := '代理服务器端口'; 

end; 

二、如何取得服务端返回的cookie信息,并添加到http的request对象中 

procedure Setcookie; 

var

   i: Integer; 

   tmp, cookie: String; 

begin

   cookie := ''; 

for i := 0 to http.Response.RawHeaders.Count - 1 do

begin

       tmp := http.Response.RawHeaders[i]; 

if pos('set-cookie: ', LowerCase(tmp)) = 0 then Continue; 

    tmp := Trim(Copy(tmp, Pos('Set-cookie: ', tmp) + Length('Set-cookie: '), Length(tmp))); 

    tmp := Trim(Copy(tmp, 0, Pos(';', tmp) - 1)); 

if cookie = '' then cookie := tmp else cookie := cookie + '; ' + tmp; 

end; 

if cookie <> '' then

begin

for i := 0 to http.Request.RawHeaders.Count - 1 do

begin

      tmp := http.Request.RawHeaders[i]; 

if Pos('cookie', LowerCase(tmp)) = 0 then Continue; 

      http.Request.RawHeaders.Delete(i); 

      Break; 

end; 

    http.Request.RawHeaders.Add('cookie: ' + cookie); 

end; 

end; 

三、如何取得网页中的所有连接,对代码做修改你也可以实现查找所有图片等等 

function GetURLList(Data: String): TStringList; 

var

i: Integer; 

List: TStringList; 

tmp: String; 

function Split(Data, Node: String): TStringList; 

var

    Count, i, j: Integer; 

function GetFieldCount(Data, Node: String): Integer; 

var

         i: Integer; 

begin

          Result := -1; 

          i := Pos(Node, Data); 

if i = 0 then Exit; 

             Result := 0; 

while i <> 0 do

begin

            Inc(Result); 

             Delete(Data, 1, i + Length(Node) - 1); 

            i := Pos(Node, Data); 

end; 

end; 

begin

      Result := TStringList.Create; 

Count := GetFieldCount(Data, Node); 

for i := 0 to Count - 1 do

begin

     j := Pos(Node, Data); 

     Result.Add(Copy(Data, 1, j - 1)); 

     Delete(Data, 1, j + Length(Node) - 1); 

end; 

Result.Add(Data); 

end; 

begin

Result := TStringList.Create; 

try

    List := split(Data, 'href='); 

for i := 1 to List.Count - 1 do

begin

      tmp := List[i]; 

       tmp := Copy(tmp, 0, Pos('', tmp) - 1); 

       tmp := Copy(tmp, 0, Pos('>', tmp) - 1); 

if Pos(' ', tmp) <> 0 then

          tmp := Copy(tmp, 0, Pos(' ', tmp) - 1); 

       tmp := Q_ReplaceStr(tmp, Char(34), ''); 

     tmp := Q_ReplaceStr(tmp, Char(39), ''); 

if not Compare(CI.Key, tmp) then Continue; 

if Copy(tmp, 1, 7) <> 'http://' then

begin

if Copy(tmp, 1, 1) = '.' then tmp := StringReplace(tmp, '.', '', []); 

if Copy(tmp, 1, 1) = '.' then tmp := StringReplace(tmp, '.', '', []); 

try

         tmp := 'http://' + http.URL.Host + ':' + http.URL.Port + http.URL.Path + tmp; 

except

end; 

end; 

if Result.IndexOf(tmp) <> -1 then Continue; 

          Result.Add(tmp); 

end; 

   FreeAndNil(List); 

except

end; 

end; 

四、如何模拟http的get方法打开一个网页 

function GetMethod(http: TIDhttp; URL: String; Max: Integer): String; 

var

RespData: TStringStream; 

begin

RespData := TStringStream.Create(''); 

try

try

      Http.Get(URL, RespData); 

      Http.Request.Referer := URL; 

      Result := RespData.DataString; 

except

      Dec(Max); 

if Max = 0 then

begin

        Result := ''; 

        Exit; 

end; 

      Result := GetMethod(http, URL, Max); 

end; 

finally

    FreeAndNil(RespData); 

end; 

end; 

五、如何模拟http的post方法提交一个网页 

function PostMethod(URL, Data: String; max: Integer): String; 

var

PostData, RespData: TStringStream; 

begin

RespData := TStringStream.Create(''); 

PostData := TStringStream.Create(Data); 

try

try

if http = nil then Exit; 

      Http.Post(URL, PostData, RespData); 

      Result := RespData.DataString; 

      http.Request.Referer := URL; 

except

      Dec(Max); 

if Max = 0 then

begin

        Result := ''; 

        Exit; 

end; 

      Result := PostMethod(URL, Data, Max); 

end; 

finally

    http.Disconnect; 

    FreeAndNil(RespData); 

    FreeAndNil(PostData); 

end; 

end; 

六、伪造session 

var

My_Cookie,tmpcookie:string; 

begin

aIdHttp.Get('http://www.huochepiao.net/'); 

tmpcookie:=aIdHttp.Request.CustomHeaders.Values['Set-Cookie']; 

if Pos(';',tmpcookie)>0 then

     My_Cookie:=LeftBStr(tmpcookie,Pos(';',tmpcookie)-1) 

else

     My_Cookie:= tmpcookie; 

//

aIdHTTP.Request.CustomHeaders.Clear; 

aIdHTTP.Request.CustomHeaders.Add('Cookie:'+My_COOKIE); 

end; 

你可能感兴趣的:(2019-06-22 Delphi IDHTTP用法详解)