使用:Delphi 2010,最新版本的Indy
我正在尝试从Googles Adsense网页上删除数据,目的是获取报告。但到目前为止我还没有成功。它在第一次请求后停止,但不继续。
使用Fiddler调试到Adsense网站的流量/请求,以及用于加载Adsense页面的Web浏览器,我可以看到请求(来自webbrowser)生成了许多重定向,直到页面加载为止。
但是,我的Delphi应用程序只会在停止之前生成一些请求。
以下是我遵循的步骤:
最后我有这段代码:
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组件继续追踪重定向直到最后一页?
答案 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输出的(请求和响应头):
答案 1 :(得分:1)
TIdHTTP.HandleRedirects := True
因此它会自动开始处理重定向。
TIdHTTP.RedirectMaximum
用于设置应处理多少个连续重定向。
或者,您可以指定TIdHTTP.OnRedirect
并从该处理程序设置Handled := True
。这就是我在需要从WikiMedia网站(我自己的网站)读取数据的项目中所做的。
该响应没有错,它是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;