zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    no space left on device
    功能测试用例
    数据库命令
    移动APP测试用例设计实践经验(转载)
    15个常用sql命令
    将Windows文件夹挂载到Linux上
    英语学习方法
    三种特质 做领导
    扬州之行 第一天
    list、dict、str虽然是Iterable,却不是Iterator
  • 原文地址:https://www.cnblogs.com/westsoft/p/5906734.html
Copyright © 2011-2022 走看看