【问题标题】:How to display images when using cURL?使用 cURL 时如何显示图像?
【发布时间】:2010-11-28 03:09:17
【问题描述】:

在抓取页面时,我想要文本中包含的图像。

目前我只能抓取文本。例如,作为一个测试脚本,我抓取了谷歌的主页,它只显示文本,没有图像(谷歌标志)。

我还使用 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 的扩展“网络”工具(允许我检查标题和文件路径),我发现 Redbox 的图像和 css 文件未加载/丢失(未找到 404)。我注意到了原因,这是因为我的浏览器在错误的位置查找 Redbox 的图像和 css 文件。

显然 Redbox 图像和 css 文件是相对于域定位的,对于 Google 的徽标也是如此。因此,如果我上面的脚本使用其域作为文件路径的基础,我该如何更改呢?

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

我的修复尝试:

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

?>

我希望我说得通,如果没有,请告诉我,我会尽力解释得更好。 任何帮助都会很棒!谢谢。

更新


感谢大家(尤其是 Marc 和 Wyatt),您的回答帮助我找到了实施的方法。
我能够按照以下步骤成功测试:
  1. 通过 Wget 下载页面及其必要条件。
  2. &lt;base href="..." /&gt; 添加到下载页面的标题中。
  3. 通过Wput将修改后的下载页面及其原始要求上传到临时服务器。
  4. 通过浏览器在临时服务器上测试上传页面
  5. 如果上传的页面显示不正确,可能仍然缺少一些必要条件(css、jss 等)。通过可让您查看标题响应的工具(例如 FF 的 Firebug 插件中的“网络”工具)查看缺少的内容。找到缺少的必要条件后,访问上传页面所基于的原始页面,记下缺少的适当必要位置,然后将下载的页面从步骤1修改为 适应新的适当位置并再次从第 3 步开始。否则,如果页面正确呈现,则成功!

注意:在修改下载的页面时,我手动编辑了代码,我相信您可以根据 cUrl 的请求使用 regEX 或解析库来自动化该过程。

【问题讨论】:

    标签: php image curl


    【解决方案1】:

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

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

    要使页面正常工作,您有几个选择。最简单的方法是解析页面的 HTML 并将 &lt;base href="..." /&gt; 标签插入到文档的标题块中。这将告诉任何查看浏览器文档中的“相对”链接应该从这个“基本”源(例如谷歌)获取。

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

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

    【讨论】:

      【解决方案2】:

      如果您正在加载的站点使用 relative paths 作为其资源 URL(即 /images/whatever.gif 而不是 http://www.site.com/images/whatever.gif),您将需要在返回的源代码中重写这些 URL ,因为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 是您要重写的基本 URL,即http://www.mydomain.com。这并不适用于所有事情,但它应该让你开始。这是一件容易的事,你最好在后台生成一个wget 命令并让它为你镜像或重写HTML。

      【讨论】:

        【解决方案3】:

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

        curl_setopt($ch,CURLOPT_BINARYTRANSFER, true);

        我已经成功地使用它从网页中获取图像和音频。

        【讨论】:

        • 你能举个例子吗?
        猜你喜欢
        • 2022-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        • 2019-12-04
        • 2020-06-18
        • 2011-07-24
        • 2015-03-24
        相关资源
        最近更新 更多