【问题标题】:PHP: why does this image fail to download?PHP:为什么这个图片下载失败?
【发布时间】:2012-06-16 23:33:17
【问题描述】:

我正在使用 PHP 下载/保存以下图片:

http://www.bobshop.nl/catalog/product_image.php?size=detail&id=42428

当您在浏览器中加载此图像时,您可以看到它,但是当我尝试使用几种不同的方法下载它时,我得到一个 1 KB 的文件,表明在服务器上找不到该产品。

我用file_put_contentscurl 的方式都试过了。 我什至使用了在 StackOverflow 上找到的函数 get_web_page 来捕捉可能的重定向。

您可以在浏览器中看到图像但无法下载它的其他原因可能是什么?

更新: 由于在尝试不同的答案时抛出了一个错误,我才发现了问题的真正原因。在抓取 html 的过程中,URL 得到了 & 而不是 & 。我现在替换了这些,其他所有方法现在也可以使用...谢谢大家!

【问题讨论】:

  • 可能有一些标头检查来验证请求者实际上是浏览器。为什么不尝试使用 Google Chrome 请求图像并打开检查器?转到网络选项卡。刷新页面。复制发送的标头并将其与 cURL 一起使用。
  • 我猜他们有防止下载的保护措施,可能是通过检查用户代理字符串
  • 你甚至可以更进一步,玩转标题,看看哪个组合会返回图像,哪个组合会返回错误消息。

标签: php curl download imagedownload


【解决方案1】:

我刚刚实现了一种简单的下载和存储方式,并且成功了:

<?php

$fileContent = implode("",file("http://www.bobshop.nl/catalog/product_image.php?size=detail&id=42428"));
$fp = fopen("/tmp/image","w+");

fwrite($fp, $fileContent);

fclose($fp);

?>

你在代理后面吗?这可能是问题所在(您配置了代理但没有配置 php);)

【讨论】:

  • 我接受这个作为答案,因为尝试您的代码将我引向真正的原因:&而不是 URL 中的 &!
【解决方案2】:

此 PHP 脚本可能正在执行某种标头检查,以确保浏览器正在请求图像,而不是有人试图抓取其内容。这可以用 cURL 伪造(尽管在做了这样的事情之后我觉得我需要洗个澡)。具体来说,curl_setopt()

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'User-agent: Some legitimate string'
));

要找出需要发送哪些标头,您需要进行一些试验。如果您有 Google Chrome,您可能已经使用过 Inspector(如果您没有 Firefox 也有类似的插件,那么您可以使用 Firebug 之类的插件)。如果您使用 Chrome 请求图像,则可以右键单击以检查它。转到网络选项卡。现在刷新页面。对product_image.php 的请求应该会出现。如果单击它并单击“标头”选项卡,您应该会看到已发送的标头列表。我的浏览器发送:User-AgentAcceptAccept-EncodingAccept-LanguageAccept-Charset

尝试将这些标头与有效值组合,以查看需要发送哪些标头才能返回图像。我敢打赌,这个网站可能只检查User-agent,所以从那个开始。


重要提示:您应该缓存此调用的结果,因为如果您的服务器快速连续多次请求图像(例如,如果您网站上的许多用户请求抓取此图像的脚本)。此外,作为额外的匿名层,您可能希望从一组有效的User-agent 中选择您的User-agent,因此 bobshop.nl 认为所有请求都来自大型网络(如大学校园)后面的用户。您可以在 UserAgentString.com 上找到有效的用户代理字符串。

【讨论】:

  • 非常感谢您的努力。问题一点也不复杂,请参阅更新。
猜你喜欢
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多