[delphi]
view plain
copy
print
?
- 一、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,?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,?Pos('</a>',?tmp)?-?1);??
- ???????tmp?:=?Copy(tmp,?Pos('>',?tmp)?-?1);??
- ???????if?Pos('?',?tmp)?<>?0?then??
- ??
- ??????????tmp?:=?Copy(tmp,?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,?7)?<>?'http://'?then??
- ?????begin??
- ?????????if?Copy(tmp,?1)?=?'.'?then?tmp?:=?StringReplace(tmp,?'.',?'',?[]);??
- ???????if?Copy(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;?
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|