使用Delphi TidHttp进行爬网时检测客户端重定向

时间:2019-07-29 02:52:13

标签: php html delphi

我是Delphi开发人员,受命为面向公众的网站抓取<title>meta描述和关键字的抓取。

很好,直到遇到一个网站,该网站会自我重定向并且未使用HTTP 302/301进行重定向。

例如,如果我在网址中键入example.com,它将自动跳转到example-b.com-但在客户端-不会通过HTTP 301或302。

我的目标是获得example-b.com的标题,描述和关键字。

如果有帮助,我正在delphi中使用TidHttp。

修改
我尝试了此answer,但有人说只能在HTTP 301和302下使用。我已经处理了这些重定向。我试图弄清楚如何处理<meta> Referh标记或其他执行重定向的html命令。

编辑2
刚刚找到以下命令:

<meta http-equiv="refresh" content="5;url=http://thisinterestsme.com/detecting-ajax-requests-with-php/">
header( "refresh:5;url=http://thisinterestsme.com/php-forcing-https-over-http/" );
header('Location: http://thisinterestsme.com/php-forcing-https-over-http/');
window.location.href= 'http://thisinterestsme.com/php-forcing-https-over-http/';

让我知道是否错过了其他命令。

1 个答案:

答案 0 :(得分:3)

TIdHTTP 不会遵循meta refresh重定向,即使HandleRedirects设置为True。但是,如果<meta http-equiv=...的属性hoNoParseMetaHTTPEquiv中没有包含HTTPOptions,它会解析TIdHTTP。默认情况下不包括该选项。执行请求后,您可以通过IdHTTP.MetaHTTPEquiv访问解析后的值,这是IdHTTP.Response.MetaHTTPEquiv的简写。

由于Indy不处理它,因此您必须自己承担从值解析URL,执行重定向以及检测循环/无限重定向的所有负担。 Refresh标头也是如此,它不是official standards的一部分。

Location标头仅对HTTP状态代码201 Created202 Accepted3xx有效。仅当状态代码为3xx304 Not Modified除外)时,它才应该重定向,而Indy已经做到了,因此您无需以任何特殊方式进行处理。

最后,要支持JavaScript重定向,任务将变得更加复杂,TIdHTTP将无法破解。这似乎是headless browser的用例。