IDHTTP

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;

  idhttp的get 和 post的使用

function Tform1.IdHttpInit;
begin
  idhtp1.AllowCookies:=True;
  idhtp1.HTTPOptions:=[hoForceEncodeParams];
  idhtp1.ProtocolVersion:=pv1_1;
  idhtp1.Request.ContentType:='Content-Type=application/x-www-form-urlencoded; charset=UTF-8';
  idhtp1.Request.CacheControl:='no-cache';   
  idhtp1.Request.UserAgent:='User-Agent=Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)';
  idhtp1.Request.Accept:='Accept=*/*';
  idhtp1.Request.AcceptEncoding:='Accept-Encoding=gzip,deflate';
  idhtp1.Request.AcceptCharSet:='Accept-Charset=gb2312,utf-8;q=0.7,*;q=0.7';
  idhtp1.Request.Connection:='Connection=keep-alive';
  idhtp1.Request.Host:='Host=kyfw.12306.cn';
  idhtp1.Request.Referer:='https://kyfw.12306.cn/otn/login/init';
  idhtp1.Request.AcceptLanguage:='Accept-Language=zh-cn';
  Result:='';
end;

function Tform1.GetCodeImg;
var url:string;
response:TMemoryStream;
jpg:TJPEGImage;
begin
  response:=TMemoryStream.Create;
   url:='https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand&0.3110086616057921';
   idhtp1.Get(url,response);
   jpg:=TJPEGImage.Create;
   jpg.LoadFromStream(response);
   Result:='';
end;

function Tform1.Login;
var
  url : string;
  Params:TStrings;
begin
  Params:=TStringList.Create;
  Params.Add('loginUserDTO.user_name=xxxxxx@qq.com');//用户名
  Params.Add('userDTO.password=xxxxxxx');//密码
  Params.Add('randCode=ku6a');//验证码
  Params.Add('randCode_validate=');
  Params.Add('OTcyNTU4=ZjIzYzc3MWJmMDk4OTk5YQ==');
  Params.Add('myversion=undefined');
end;
View Code

 

转载于:https://www.cnblogs.com/blogpro/p/11453322.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值