如何在使用cURL时显示图像?

时间:2010-11-28 03:09:17

标签: php image curl

抓页时,我希望文字中包含图片。

目前我只能抓文。例如,作为测试脚本,我抓取了Google的主页,它只显示了文字,没有图片(Google徽标)。

我还使用Redbox创建了另一个测试脚本,没有成功,结果相同。 这是我试图抓取Redbox的“查找电影”页面:

<?php

$url = 'http://www.redbox.com/Titles/AvailableTitles.aspx';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result= curl_exec ($ch);
curl_close ($ch);
echo $result;

?>

页面被破坏,缺少盒子艺术,缺少脚本等。

看看FF的Firebug扩展'Net'工具(允许我检查标题和文件路径),我发现Redbox的图像和css文件没有加载/丢失(404找不到)。我注意到了原因,这是因为我的浏览器在错误的地方寻找Redbox的图像和css文件。

显然,Redbox图片和css文件位于相对于域的位置,同样适用于Google的徽标。因此,如果我上面的脚本使用其域作为文件路径的基础,我该如何更改它?

我尝试使用下面的脚本更改主机和referer请求标头,我已经广泛搜索了,但没有运气。

我的修复尝试:

<?php

$url = 'http://www.redbox.com/Titles/AvailableTitles.aspx';
$referer = 'http://www.redbox.com/Titles/AvailableTitles.aspx';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Host: www.redbox.com") );
curl_setopt ($ch, CURLOPT_REFERER, $referer); 
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result= curl_exec ($ch);
curl_close ($ch);
echo $result;

?>

我希望我有道理,如果没有,请告诉我,我会尝试更好地解释它。 任何帮助都会很棒!感谢。

UPDATE

<小时/> 感谢大家(尤其是Marc和Wyatt),您的回答帮助我找到了实施的方法 我能够通过以下步骤成功进行测试:

  1. 通过Wget下载页面及其必备条件。
  2. <base href="..." />添加到已下载页面的标题中。
  3. 通过Wput将修订后的下载页面及其原始必备条件上传到临时服务器。
  4. 通过浏览器在临时服务器上测试上传页面
  5. 如果上传的页面显示不正确,可能仍会遗漏一些必要条件(css,jss,ect)。通过允许您查看标题响应的工具查看哪些内容(例如FF的Firebug Addon中的'net'工具)。找到缺少的必需品后,访问上传页面所基于的原始页面,记下缺少的必要位置,然后将下载的页面从步骤1修改为 容纳新的适当位置,并再次从步骤3开始。否则,如果页面呈现正确,那么成功!
  6. 注意:在修改下载页面时,我手动编辑了代码,我确信您可以根据cUrl的请求使用regEX或解析库来自动执行该过程。

3 个答案:

答案 0 :(得分:3)

当您刮取URL时,您正在检索单个文件,无论是html,image,css,javascript等...您在浏览器中看到的文档几乎总是MULTIPLE文件的结果:原始文件html,每个单独的图像,每个css文件,每个javascript文件。您只输入一个地址,但完全构建/显示该页面将需要许多HTTP请求。

当您通过curl抓取google主页并将该HTML输出给用户时,用户无法知道他们实际上正在查看Google源HTML - 看起来好像HTML来自您的服务器,和你的服务器。用户的浏览器很乐意吸收这个HTML,查找图像,并从您的服务器请求图像,而不是谷歌的。由于您没有托管任何Google图片,因此您的服务器会以正确的404“未找到”错误进行响应。

为了使页面正常工作,您有一些选择。最简单的方法是解析页面的HTML并在文档的标题块中插入<base href="..." />标记。这将告诉任何浏览浏览器应该从这个“基础”源(例如谷歌)获取文档中的“相对”链接。

更难的选择是解析文档并重写对外部文件(图像,css,js等)的任何引用并放入原始服务器的URL,以便用户的浏览器转到原始站点并且从那里取出。

最难的选择是基本上设置一个代理服务器,如果请求进入服务器上不存在的文件,尝试通过curl从Google获取相应的文件并将其输出给用户

答案 1 :(得分:1)

如果您加载的网站使用relative paths作为其资源网址(即/images/whatever.gif而不是http://www.site.com/images/whatever.gif),则您需要对这些网址进行一些重写在源代码中你回来了,因为cURL won't do that itself,虽然Wget(官方网站似乎已关闭)确实(甚至会为你下载和镜像资源),但不提供PHP绑定。

因此,您需要提出一种方法来搜索生成的源并将相对路径更改为绝对路径。天真的方式是这样的:

if (!preg_match('/src="https?:\/\/"/', $result))
    $result = preg_replace('/src="(.*)"/', "src=\"$MY_BASE_URL\\1\"", $result);

其中$MY_BASE_URL是您要重写的基本网址,即http://www.mydomain.com。这不适用于所有事情,但它应该让你开始。它是一件容易的事情,你可能最好只在后台生成一个wget命令并让它为你镜像或重写HTML。

答案 2 :(得分:0)

尝试通过将CURLOPT_BINARYTRANSFER选项设置为true来返回原始输出来获取图像,如下所示

curl_setopt($ch,CURLOPT_BINARYTRANSFER, true);

我已成功使用此功能从网页获取图像和音频。