【问题标题】:Using cURL to download a site's HTML source, but getting different file than intended使用 cURL 下载站点的 HTML 源,但获取的文件与预期不同
【发布时间】:2011-12-27 08:19:55
【问题描述】:

我正在尝试使用 cURL 和 PHP 下载here 的 HTML 源代码(在浏览器中显示)。但不是返回实际的源代码,而是返回 this(元刷新链接设置为 0)。

<html>
    <head><title>Object moved</title></head>
    <body>
        <h2>Object moved to <a href="https://login.live.com/login.srf?wa=wsignin1.0&amp;rpsnv=11&amp;checkda=1&amp;ct=1321044850&amp;rver=6.1.6195.0&amp;wp=MBI&amp;wreply=http:%2F%2Fwww.windowsphone.com%2Fen-US%2Fapps%2Fea39f002-ac30-e011-854c-00237de2db9e&amp;lc=1033&amp;id=268289">here</a>.
        </h2>
    </body>
</html>

我试图将引荐标头伪装成网站,但似乎我做错了。代码如下。有什么建议?谢谢

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://www.windowsphone.com/en-US/apps/ea39f002-ac30-e011-854c-00237de2db9e');
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.6 (KHTML, like Gecko) Chrome/16.0.897.0 Safari/535.6'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_AUTOREFERER, false);
curl_setopt($ch, CURLOPT_REFERER, "http://www.windowsphone.com/en-US/apps/ea39f002-ac30-e011-854c-00237de2db9e");

$html = curl_exec($ch);
curl_close($ch);

【问题讨论】:

标签: php curl http-referer spoofing


【解决方案1】:

添加 curl 选项以跟随重定向:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

如果是元刷新而不是 HTTP 移动标头,请参阅: PHP: Can CURL follow meta redirects

正如 flesk 所说,您可能还需要存储 cookie。

【讨论】:

  • 我正在将返回的 HTML 写入一个单独的文件(以便稍后读取)。当我将 FOLLOWLOCATION 设置为 true 时,文件变为空白。
  • 如果重定向只是在标头中,这可以正常工作。我刚刚使用您的代码对其进行了测试,页面返回 200 OK 并带有元刷新标记。查看我的编辑。
  • 好极了,我去看看。抱歉,我对所有这些 HTTP/spoofing/cURL 都不熟悉
【解决方案2】:
$ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, 'http://www.windowsphone.com/en-US/apps/ea39f002-ac30-e011-854c-00237de2db9e');
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.6 (KHTML, like Gecko) Chrome/16.0.897.0 Safari/535.6'); 
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_REFERER, "http://www.windowsphone.com");
$html = curl_exec($ch);
curl_close($ch);
echo $html;

【讨论】:

  • 这并不能解决问题。您需要将跟随位置选项设置为 true。
【解决方案3】:

问题不在于引荐来源网址,而在于您需要启用 cookie 才能使其正常工作。

试试这样的:

curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");

您必须查询该页面两次。首先允许重定向从 login.live.com 获取 cookie,然后使用 cookie 集再次查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2015-12-18
    • 1970-01-01
    • 2017-08-30
    • 2021-03-05
    • 1970-01-01
    相关资源
    最近更新 更多