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
;
http://www.cnblogs.com/94YY/p/3481358.html