【问题标题】:PHP Curl: bring HTML with redirectPHP Curl:带来带有重定向的 HTML
【发布时间】:2015-10-29 18:13:05
【问题描述】:

我正在用 PHP 编写一个爬虫,它读取 HTML 并将其存储在一个变量中。如果站点没有重定向,则该代码效果很好。例如,如果我抓取 Google,我有以下内容:

CURL 结果

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.com.br/?gfe_rd=cr&amp;ei=A14yVviJCuyp8wfmyIfIBg">here
</A>.
</BODY></HTML>

PHP 方法

private function parseHTML($url){
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array('X-Apple-Tz: 0', 'X-Apple-Store-Front: 143444,12'));
    ob_start();
    curl_exec($curl); 
    curl_close($curl);
    $html = ob_get_contents();
    ob_end_clean();
    return $html;
}

如何重定向到目标页面,抓取 HTML 并返回代码?

【问题讨论】:

  • 当您获得 302 页面内容时。 HTTP 状态标头是否也设置为 302?

标签: php html curl


【解决方案1】:

如果服务器会重定向您的呼叫,设置 CURLOPT_FOLLOWLOCATION 选项可以解决问题,可能与 CURLOPT_MAXREDIRS 选项一起限制重定向次数。见php的curl_setopt方法

curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_MAXREDIRS, 5);

但是考虑到在提供的示例中,服务器不会重定向您(您的 curl 的请求)而是为您(用户)提供一些信息,恐怕您的应用程序必须阅读和消化内容并进行适当的重定向相应地。

【讨论】:

  • 当 302 发生时,没有什么可以说没有与该内容一起发送的 302 标头,以便 OP 可以使用您正确建议的 curl 选项。他们需要查看响应标头,看看他们是否真的得到了 302。Web 服务器提供自定义错误内容以及发送适当的响应标头是很常见的。您尤其会在 404 响应中看到这一点。
  • 你是对的@MikeBrant,感谢您的意见。在这种情况下,我们还可以利用 CURLOPT_POSTREDIR 选项来识别它是否是 302
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
相关资源
最近更新 更多