【问题标题】:Indy - IdHttp how to handle page redirects?Indy - IdHttp 如何处理页面重定向?
【发布时间】:2010-12-28 21:52:24
【问题描述】:

使用:Delphi 2010,最新版 Indy

我正在尝试从 Google 的 Adsense 网页上抓取数据,以获取报告。然而到目前为止我一直没有成功。它在第一次请求后停止并且不再继续。

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

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

以下是我遵循的步骤:

  1. 在表单上放置一个 IdHTTP 和一个 IdSSLIOHandlerSocketOpenSSL1 组件。
  2. 将 IdHTTP 组件属性 AllowCookies 和 HandleRedirects 设置为 True,并将 IOHandler 属性设置为 IdSSLIOHandlerSocketOpenSSL1。
  3. 设置 IdSSLIOHandlerSocketOpenSSL1 组件属性 Method := '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;

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

这是 Fiddler 的标头输出:

HTTP/1.1 302 找到
位置:https://encrypted.google.com/
缓存控制:私有
内容类型:文本/html;字符集=UTF-8
设置 Cookie:PREF=ID=5166063f01b64b03:FF=0:TM=1293571783:LM=1293571783:S=a5OtsOqxu_GiV3d6;到期=格林威治标准时间 2012 年 12 月 27 日星期四 21:29:43;路径=/;域=.google.com
设置 Cookie:NID=42=XFUwZdkyF0TJKmoJjqoGgYNtGyOz-Irvz7ivao2z0--pCBKPpAvCGUeaa5GXLneP41wlpse-yU5UuC57pBfMkv434t7XB1H68ET0ZgVDNEPNmIVEQRVj7AA1Lnvv2Aez;过期=格林威治标准时间 2011 年 6 月 29 日星期三 21:29:43;路径=/;域=.google.com; HttpOnly
日期:格林威治标准时间 2010 年 12 月 28 日星期二 21:29:43
服务器:gws
内容长度:226
X-XSS-防护:1;模式=块

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

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

【问题讨论】:

  • 你为什么不用the API
  • 申请访问 Google Adsesnse API 要求您的网站每天获得 100,000 次或更多页面浏览量。这个网站不符合条件,所以我必须手动抓取页面。
  • 可能涉及到 Javascript(你可以在浏览器中禁用它来验证 - 如果登录仍然有效,这证明我错了)
  • @mjn:禁用 JavaScript,清除浏览器缓存并重新加载页面 - 登录页面加载正常。

标签: delphi indy web-scraping


【解决方案1】:

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

【讨论】:

  • 这属于原始问题(您可以随时编辑您的问题)。 TIdHTTP 是否处理任何重定向?这是您曾经看到的第一个重定向,还是仅仅是最后一个重定向?在 IdHTTP1Redirect 中设置一个刹车点,它会停止吗?
【解决方案2】:

进行重定向

TIdHTTP.HandleRedirects := True 所以它开始自动处理重定向。

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


或者,您可以从该处理程序分配 TIdHTTP.OnRedirect 并设置 Handled := True。这就是我在一个需要从维基媒体网站(我自己的网站)读取数据的项目中所做的事情。

关于 HTTP 响应

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

其他建议

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

【讨论】:

  • [(* 关于 HTTP 响应该响应没有问题,这是一个非常基本的重定向到 encrypted.google.com。TIdHTTP 应该转到给定的页面作为响应。它还设置了一些 cookie。*)]你能告诉我 IdHTTP 应该如何访问给定的页面吗?
  • TIdHttp 会自动处理 302 状态消息,如果你设置 HandleRedirects = True 会自动加载新页面。
  • 你上面说的我都做了。然而,依旧没有喜悦。它在重定向处停止并且不继续(从 Fiddler 中的请求标头中可以看到)。 -- 需要什么(代码或属性设置)才能使 IdHTTP 一直跟踪到最后一页? IE。我需要做什么才能让 IdHttp 像网络浏览器一样工作? (在我的情况下,我需要进入 Adsense 登录页面;如果已经登录到 Adsense,那么我需要下载 Adsense 主页)
  • 请显示 TIdHTTP 在停止重定向之前收到的最终 HTTP 回复。要么 Google 实际上停止发送重定向,要么正在发送 TIdHTTP 无法处理的回复。
  • @Remy:作为答案发布的代码和响应/请求标头。
【解决方案3】:

在我的情况下,我需要修复 dest,因为不知何故我有 ;在里面!

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2011-04-30
    • 2012-01-09
    • 2015-04-12
    相关资源
    最近更新 更多