Php 如何仅从DOM中刮取最大的图像?
我用它来刮页面(在我的服务器以外的服务器上) 基本实现是Php 如何仅从DOM中刮取最大的图像?,php,parsing,screen-scraping,simple-html-dom,getimagesize,Php,Parsing,Screen Scraping,Simple Html Dom,Getimagesize,我用它来刮页面(在我的服务器以外的服务器上) 基本实现是 try { $html = file_get_html(urldecode(trim($url))); } catch (Exception $e) { echo $url; } foreach ($html->find('img') as $element) { $src = ""; $src = $element->src; if (preg_match("/\.(?:jpe?g|png)
try {
$html = file_get_html(urldecode(trim($url)));
} catch (Exception $e) {
echo $url;
}
foreach ($html->find('img') as $element) {
$src = "";
$src = $element->src;
if (preg_match("/\.(?:jpe?g|png)$/i", $src)) {
$images[] = $src;
}
}
这可以正常工作,但它会返回页面中的所有图像,包括小化身、图标和按钮图像。当然我想避免这些
然后我尝试在循环中插入,如下所示
...
if (preg_match("/\.(?:jpe?g|png)$/i", $src)) {
$size = getimagesize($src);
if ($size[0] > 200) {
$images[] = $src;
}
}
...
在http://cnn.com
。
但在其他情况下,它会返回许多错误。
比如说
给出了一系列错误,如
<p>Severity: Warning</p>
<p>Message: getimagesize(/images/snn-logo-comments.png): failed to open stream: No such file or directory
<p>Severity: Warning</p>
<p>Message: getimagesize(/images/close-gray.png): failed to open stream: No such file or directory
严重性:警告
消息:getimagesize(/images/snn logo comments.png):无法打开流:没有这样的文件或目录
严重性:警告
消息:getimagesize(/images/close gray.png):无法打开流:没有这样的文件或目录
这似乎是因为某些图像中的相对URL而发生的。这里的问题是,这会使脚本崩溃,然后不会加载图像,而我的Ajax框将永远加载
您知道如何解决此问题吗?问题在于图像URL与站点根目录相关,因此服务器无法理解这些URL以获取它们并确定其大小。您可以参考了解如何从相对URL获取绝对URL。您尝试的图像大小检查方法是正确的 但是,为了让它在所有站点上都能工作,您需要添加某种相对URL解析 我不知道是否有这样的库,但这里有一个关于如何做的快速概述:
- 查找要抓取的URL的域部分
- 假设任何以/开头的URL都是绝对URL。您可以通过连接域和路径来获取这些数据
- 假设任何不以/开头的URL都是相对的。您可能需要解析任何。。URL中用于定位预期路径的标记
- 检查文档中的
标记:如果文档有
标记,它会将所有相对路径锚定到标记中定义的路径中
您可以找到一个库来将相对路径和绝对路径转换为您可以使用的内容,但在大多数情况下,它们不会解释上一点中提到的
标记。尝试类似的方法,假设url为
这将帮助一些人,但它不会是傻瓜式的-我想不出有多少域使用.././等图像的相对路径,但我相信有人是-当然,你可以在图像的src属性中测试除域之外的任何匹配项,并尝试将域扔到那里,但也没有保证每次都能起作用。我想有更好的办法。。。可能有一个默认方法,并加载一个配置,其中包含预定义的域“修复程序”,用于解决麻烦的域 不管谁投了反对票,请说明理由。刮擦会在这里引起很多警铃。这有助于了解你这样做的正当理由,让人们知道他们不是在协助和教唆内容盗窃。你得到了网站所有者的许可吗?你是认真的吗?你听说过Pinterest或Facebook吗?听说过版权吗?
$domain = explode('/', $url);
$domain = $domain[2];
// ... snip ...
if (preg_match("/\.(?:jpe?g|png)$/i", $src)) {
$size = getimagesize($src);
if ($size[0] > 200) {
if(strpos($src, '/', 0) === 0)
$src = $domain . $src;
$images[] = $src;
}
}