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;