-1

使用 PHP 我正在尝试下载/保存以下图像:

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

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

我用 thefile_put_contents和 the curlway 都试过了。我什至使用了get_web_page在 StackOverflow 上找到的函数来捕捉可能的重定向。

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

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

4

2 回答 2

0

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

<?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);)

于 2012-06-16T23:45:44.947 回答
0

此 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从一系列有效请求中选择您的请求,因此 bobshop.nl 认为所有请求都来自大型网络(如大学校园)后面的用户。您可以在UserAgentString.com上找到有效的用户代理字符串。

于 2012-06-16T23:47:39.267 回答