【发布时间】:2010-12-28 21:52:24
【问题描述】:
使用:Delphi 2010,最新版 Indy
我正在尝试从 Google 的 Adsense 网页上抓取数据,以获取报告。然而到目前为止我一直没有成功。它在第一次请求后停止并且不再继续。
使用 Fiddler 调试 Google Adsense 网站的流量/请求,并使用网络浏览器加载 Adsense 页面,我可以看到请求(来自网络浏览器)会生成许多重定向,直到页面加载完毕。
但是,我的 Delphi 应用程序在停止之前只生成了几个请求。
以下是我遵循的步骤:
- 在表单上放置一个 IdHTTP 和一个 IdSSLIOHandlerSocketOpenSSL1 组件。
- 将 IdHTTP 组件属性 AllowCookies 和 HandleRedirects 设置为 True,并将 IOHandler 属性设置为 IdSSLIOHandlerSocketOpenSSL1。
- 设置 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