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.lsworks.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 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭