fopen不为某些网址工作?

时间:2010-02-13 20:31:48

标签: php

我在阅读一些网址时遇到了问题。网址没有任何问题,因为我可以在我的浏览器中查看它们(下面给出了一个这样的URL的示例):

http://www.bloomberg.com/apps/news?pid=20601087&sid=a2BhXFMpbb5M

我在我的代码中使用fopen:

public static function grokPage($path)
{
    $data = '';
    $file = fopen($path, "r");

    if ($file)
    {
        while (!feof($file))
            $data .= fgets($file, 1024);
    }
    return $data;
}

我得到的错误是:

警告:fopen(http://www.bloomberg.com/apps/news?pid=20601087&sid=a2BhXFMpbb5M)[0function.fopen0]:无法打开流:达到重定向限制,在xxx_filename.php中止

从PHP fopen doc,似乎我正在使用该函数。有没有人理解递归警告以及如何解决它?

2 个答案:

答案 0 :(得分:2)

这意味着您的目标网页会将更多重定向返回到不同的地址(可能使用Location:标头),而不是max_redirects设置指定的地址。

这看起来像very good article关于如何使用fopen包装器获取网页。它包含有关如何更改max_redirects设置的示例。

但很可能彭博正在故意关闭你,因为它检测到自动数据抓取,这可能违反了他们的条款和条件。

答案 1 :(得分:2)

“已达到重定向限制”表示远程站点正在发送一个Location标头,该位置已被跟踪,然后重定向的位置再次给出了Location标头。此过程一直持续到达到预定义数量的重定向(位置标题)。

该网站可能是故意尝试将客户端重定向到其他地方,但是有一个导致循环的错误。

您应该考虑尝试其他方式来获取URL - 允许您指定用户代理字符串之类的URL。试试curl,这很丑,但效果很好。尝试伪装成IE6或Firefox而不是PHP或curl。

编辑:Pekka的评论包含一个链接,其中包含有关使用fopen包装器的信息,包括如何设置用户代理字符串。