Indy - IdHttp如何处理页面重定向?

时间:2010-12-28 21:52:24

标签: delphi indy web-scraping

使用:Delphi 2010,最新版本的Indy

我正在尝试从Googles Adsense网页上删除数据,目的是获取报告。但到目前为止我还没有成功。它在第一次请求后停止,但不继续。

使用Fiddler调试到Adsense网站的流量/请求,以及用于加载Adsense页面的Web浏览器,我可以看到请求(来自webbrowser)生成了许多重定向,直到页面加载为止。

但是,我的Delphi应用程序只会在停止之前生成一些请求。

以下是我遵循的步骤:

  1. 在表单上删除IdHTTP和IdSSLIOHandlerSocketOpenSSL1组件。
  2. 将IdHTTP组件属性AllowCookies和HandleRedirects设置为True,将IOHandler属性设置为IdSSLIOHandlerSocketOpenSSL1。
  3. 设置IdSSLIOHandlerSocketOpenSSL1组件属性方法:='sslvSSLv23'
  4. 最后我有这段代码:

    procedure TfmMain.GetUrlToFile(AURL, AFile : String);
    var
     Output : TMemoryStream;
    begin
      Output := TMemoryStream.Create;
      try
        IdHTTP1.Get(FURL, Output);
        Output.SaveToFile(AFile);
      finally
        Output.Free;
      end;
    end;
    

    但是,它没有按预期进入登录页面。我希望它表现得像是一个webbrowser并继续进行重定向,直到找到最后一页。

    这是Fiddler标题的输出:

    HTTP/1.1 302 Found
    Location: https://encrypted.google.com/
    Cache-Control: private
    Content-Type: text/html; charset=UTF-8
    Set-Cookie: PREF=ID=5166063f01b64b03:FF=0:TM=1293571783:LM=1293571783:S=a5OtsOqxu_GiV3d6; expires=Thu, 27-Dec-2012 21:29:43 GMT; path=/; domain=.google.com
    Set-Cookie: NID=42=XFUwZdkyF0TJKmoJjqoGgYNtGyOz-Irvz7ivao2z0--pCBKPpAvCGUeaa5GXLneP41wlpse-yU5UuC57pBfMkv434t7XB1H68ET0ZgVDNEPNmIVEQRVj7AA1Lnvv2Aez; expires=Wed, 29-Jun-2011 21:29:43 GMT; path=/; domain=.google.com; HttpOnly
    Date: Tue, 28 Dec 2010 21:29:43 GMT
    Server: gws
    Content-Length: 226
    X-XSS-Protection: 1; mode=block
    

    首先,这个输出有什么问题吗?

    我还应该做些什么来让IdHTTP组件继续追踪重定向直到最后一页?

3 个答案:

答案 0 :(得分:7)

拨打电话前的IdHTTP组件属性值:

    Name := 'IdHTTP1';
    IOHandler := IdSSLIOHandlerSocketOpenSSL1;
    AllowCookies := True;
    HandleRedirects := True;
    RedirectMaximum := 35;
    Request.UserAgent := 
      'Mozilla/5.0 (Windows NT 5.1; rv:2.0b8) Gecko/20100101 Firefox/4.' +
      '0b8';
    HTTPOptions := [hoForceEncodeParams];
    OnRedirect := IdHTTP1Redirect;
    CookieManager := IdCookieManager1;

重定向事件处理程序:

procedure TfmMain.IdHTTP1Redirect(Sender: TObject; var dest: string; var
    NumRedirect: Integer; var Handled: Boolean; var VMethod: string);
begin
   Handled := True;
end;

拨打电话:

  FURL := 'https://www.google.com';

  GetUrlToFile( (FURL + '/adsense/'), 'a.html');




  procedure TfmMain.GetUrlToFile(AURL, AFile : String);
  var
   Output : TMemoryStream;
  begin
    Output := TMemoryStream.Create;
    try
      try
       IdHTTP1.Get(AURL, Output);
       IdHTTP1.Disconnect;
      except

      end;
      Output.SaveToFile(AFile);
    finally
      Output.Free;
    end;
  end;





这是Fiddler输出的(请求和响应头):

alt text

答案 1 :(得分:1)

重定向

TIdHTTP.HandleRedirects := True因此它会自动开始处理重定向。

TIdHTTP.RedirectMaximum用于设置应处理多少个连续重定向。


或者,您可以指定TIdHTTP.OnRedirect并从该处理程序设置Handled := True。这就是我在需要从WikiMedia网站(我自己的网站)读取数据的项目中所做的。

关于HTTP响应

该响应没有错,它是https://encrypted.google.com/的一个非常基本的重定向。 TIdHTTP应该转到给定页面作为响应。它还设置了一些cookie。

其他建议

不要忘记分配CookieManager,并确保对所有后续请求使用相同的CookieManager。如果你不这样做,你可能会一遍又一遍地重定向到登录页面。

答案 2 :(得分:0)

在我的情况下,我需要修复目标,因为不知怎的,我有;在它!

procedure Tfrm1.IdHTTP1Redirect(Sender: TObject; var dest: string;
  var NumRedirect: Integer; var Handled: Boolean; var VMethod: string);
var
  i: Integer;
begin

  i := Pos(';', dest);
  if i > 0 then
  begin
    dest := Copy(dest,1, i - 1);
  end;

  Handled := True;
end;