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

我试图从Google Adsense网页上抓取数据,以获取报告。但是到目前为止,我一直没有成功。它在第一个请求后停止,并且不会继续。

使用Fiddler调试对Google Adsense网站的访问量/请求,并使用网络浏览器加载Adsense页面,我可以看到(来自Web浏览器的)请求会生成许多重定向,直到页面加载完毕。

但是,我的Delphi应用程序在停止之前仅生成了几个请求。

这是我遵循的步骤:

  • 在表单上放置一个IdHTTP和IdSSLIOHandlerSocketOpenSSL1组件。
  • 将IdHTTP组件属性AllowCookies和HandleRedirects设置为True,并将IOHandler属性设置为IdSSLIOHandlerSocketOpenSSL1。
  • 设置IdSSLIOHandlerSocketOpenSSL1组件属性方法:='sslvSSLv23'

  • 终于我有了这段代码:
    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;
    

    但是,它没有按预期到达登录页面。我希望它的行为就像是一个Web浏览器,并继续进行重定向,直到找到最终页面为止。

    这是Fiddler header 的输出:



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

    为了使IdHTTP组件继续进行重定向直到最后一页,我还应该做些其他事情吗?

    最佳答案

    进行调用之前,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的(请求和响应头)输出:

    09-11 20:37