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('</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;?