【发布时间】: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),您的回答帮助我找到了实施的方法。
我能够按照以下步骤成功测试:
- 通过 Wget 下载页面及其必要条件。
- 将
<base href="..." />添加到下载页面的标题中。 - 通过Wput将修改后的下载页面及其原始要求上传到临时服务器。
- 通过浏览器在临时服务器上测试上传页面
- 如果上传的页面显示不正确,可能仍然缺少一些必要条件(css、jss 等)。通过可让您查看标题响应的工具(例如 FF 的 Firebug 插件中的“网络”工具)查看缺少的内容。找到缺少的必要条件后,访问上传页面所基于的原始页面,记下缺少的适当必要位置,然后将下载的页面从步骤1修改为 适应新的适当位置并再次从第 3 步开始。否则,如果页面正确呈现,则成功!
注意:在修改下载的页面时,我手动编辑了代码,我相信您可以根据 cUrl 的请求使用 regEX 或解析库来自动化该过程。
【问题讨论】: