IDHTTP的基本用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
一、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, 17) <> 'http://' then
     begin
         if Copy(tmp, 11) = '.' then tmp := StringReplace(tmp, '.''', []);
       if Copy(tmp, 11) = '.' 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;
原文地址:https://www.cnblogs.com/westsoft/p/5906734.html