Delphi IDHTTP用法详解

    一、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('</a>', 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; 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值