抓页时,我希望文字中包含图片。
目前我只能抓文。例如,作为测试脚本,我抓取了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
<base href="..." />
添加到已下载页面的标题中。 注意:在修改下载页面时,我手动编辑了代码,我确信您可以根据cUrl的请求使用regEX或解析库来自动执行该过程。
答案 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);
我已成功使用此功能从网页获取图像和音频。