php中使用gd库实现下载网页中所有图片

来讲一下使用 PHP 中的 GD 库实现下载网页中所有图片的攻略。

一、环境准备

使用 GD 库下载网页中所有图片,需要确保服务器支持 GD 库。可以使用以下命令确认是否安装:

php -m | grep gd

如果未找到 gd 模块,请查看是否已正确安装 GD 库。

二、获取页面中的图片链接

下载网页中所有图片,需要首先获取网页中的所有图片链接,可以使用 PHP 的 file_get_contents 函数获取网页内容,使用正则表达式匹配图片链接。

以下是示例代码:

$url = 'https://example.com';
$content = file_get_contents($url);
preg_match_all('/<img.*?src="(.*?)"/i', $content, $matches);
$imageUrls = array_unique($matches[1]);

其中,使用正则表达式匹配出来的图片链接可能包含相对路径和绝对路径,需要转换为绝对路径才能正常下载。

三、下载图片

使用 GD 库下载图片,可以使用 GD 库的 imagecreatefromjpegimagecreatefrompngimagecreatefromgif 函数创建图片资源,然后使用 imagejpegimagepngimagegif 函数将图片写入文件。

示例代码如下:

foreach ($imageUrls as $imageUrl) {
    $absoluteUrl = get_absolute_url($url, $imageUrl); // 获取图片的绝对路径
    $imageContent = file_get_contents($absoluteUrl);
    if (!$imageContent) {
        continue;
    }
    $imageInfo = @getimagesizefromstring($imageContent); // 获取图片信息
    if (!$imageInfo) {
        continue;
    }
    $imageType = $imageInfo[2];
    switch ($imageType) {
        case IMAGETYPE_JPEG:
            $image = imagecreatefromjpeg($absoluteUrl);
            imagejpeg($image, 'images/' . basename($imageUrl));
            break;
        case IMAGETYPE_PNG:
            $image = imagecreatefrompng($absoluteUrl);
            imagepng($image, 'images/' . basename($imageUrl));
            break;
        case IMAGETYPE_GIF:
            $image = imagecreatefromgif($absoluteUrl);
            imagegif($image, 'images/' . basename($imageUrl));
            break;
        default:
            break;
    }
    imagedestroy($image);
}

其中,get_absolute_url 函数用于获取图片的绝对路径。

四、示例说明

以下是两个示例说明:

示例一

下载百度首页中所有图片。

示例代码:

$url = 'https://www.baidu.com';
$content = file_get_contents($url);
preg_match_all('/<img.*?src="(.*?)"/i', $content, $matches);
$imageUrls = array_unique($matches[1]);
foreach ($imageUrls as $imageUrl) {
    $absoluteUrl = get_absolute_url($url, $imageUrl);
    $imageContent = file_get_contents($absoluteUrl);
    if (!$imageContent) {
        continue;
    }
    $imageInfo = @getimagesizefromstring($imageContent);
    if (!$imageInfo) {
        continue;
    }
    $imageType = $imageInfo[2];
    switch ($imageType) {
        case IMAGETYPE_JPEG:
            $image = imagecreatefromjpeg($absoluteUrl);
            imagejpeg($image, 'images/' . basename($imageUrl));
            break;
        case IMAGETYPE_PNG:
            $image = imagecreatefrompng($absoluteUrl);
            imagepng($image, 'images/' . basename($imageUrl));
            break;
        case IMAGETYPE_GIF:
            $image = imagecreatefromgif($absoluteUrl);
            imagegif($image, 'images/' . basename($imageUrl));
            break;
        default:
            break;
    }
    imagedestroy($image);
}

示例二

下载LOFTER博客中所有图片。

示例代码:

$url = 'https://xxxxx.lofter.com/';
$content = file_get_contents($url);
preg_match_all('/<img.*?src="(.*?)"/i', $content, $matches);
$imageUrls = array_unique($matches[1]);
foreach ($imageUrls as $imageUrl) {
    $absoluteUrl = get_absolute_url($url, $imageUrl);
    $imageContent = file_get_contents($absoluteUrl);
    if (!$imageContent) {
        continue;
    }
    $imageInfo = @getimagesizefromstring($imageContent);
    if (!$imageInfo) {
        continue;
    }
    $imageType = $imageInfo[2];
    switch ($imageType) {
        case IMAGETYPE_JPEG:
            $image = imagecreatefromjpeg($absoluteUrl);
            imagejpeg($image, 'images/' . basename($imageUrl));
            break;
        case IMAGETYPE_PNG:
            $image = imagecreatefrompng($absoluteUrl);
            imagepng($image, 'images/' . basename($imageUrl));
            break;
        case IMAGETYPE_GIF:
            $image = imagecreatefromgif($absoluteUrl);
            imagegif($image, 'images/' . basename($imageUrl));
            break;
        default:
            break;
    }
    imagedestroy($image);
}

五、总结

使用 PHP 中的 GD 库实现下载网页中所有图片,需要以下步骤:获取页面中的图片链接,下载图片,同时需要处理相对路径和绝对路径的转换。注意,下载网页中所有图片可能会涉及到版权问题,请谨慎使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php中使用gd库实现下载网页中所有图片 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • PHP如何使用array_unshift()在数组开头插入元素

    使用 array_unshift() 函数可以在 PHP 数组的最前面插入一个或多个元素。下面是使用 array_unshift() 函数的完整攻略: 语法格式: array_unshift(array, value1, value2, …) 参数说明: array :必需,规定要插入数据的数组。 value1, value2, … :必需,规定要插…

    PHP 2023年5月26日
    00
  • php 如何获取文件的后缀名

    获取文件后缀名,可以通过PHP的字符串处理函数实现,通常可以分为两种方式获取。 方法一:使用pathinfo函数 pathinfo()函数可以返回文件路径的基本信息,即路径,文件名和扩展名等,通过该函数可以轻松获取文件的扩展名。示例代码如下: <?php $file_path = "/var/www/html/test.php"; …

    PHP 2023年5月26日
    00
  • php 代码优化之经典示例

    下面是我对于“PHP代码优化之经典示例”的完整攻略。 流程分析 要进行代码优化,首先需要分析代码的执行流程,找出程序的瓶颈所在,进而优化代码。 首先,运行一个程序,记录下程序的总耗时。例如: php $start = microtime(true); // 运行程序 $end = microtime(true); $cost_time = $end-$sta…

    PHP 2023年5月23日
    00
  • CVE-2020-15148漏洞分析

    下面是“CVE-2020-15148漏洞分析”的完整使用攻略,包括漏洞描述、漏洞分析、漏洞利用和两个示例说明。 漏洞描述 CVE-2020-15148是一个影响OpenSMTPD的远程代码执行漏洞。攻击者可以通过发送恶意的SMTP邮件来利用此漏洞,从而在目标系统上执行任意代码。 漏洞分析 OpenSMTPD是一个开源的服务器,用于发送和接收电子邮件。CVE-…

    PHP 2023年5月12日
    00
  • PHP查询附近的人及其距离的实现方法

    下面我们将详细介绍PHP查询附近的人及其距离的实现方法,步骤如下: 1. 获取用户位置信息 首先,我们需要获取用户的位置信息。可以通过HTML5 Geolocation API来获取用户的经纬度坐标。具体实现可以参考以下代码: if (navigator.geolocation) { navigator.geolocation.getCurrentPosit…

    PHP 2023年5月26日
    00
  • php输出金字塔的2种实现方法

    下面是“php输出金字塔的2种实现方法”的完整攻略。 1. 方法一:使用for循环实现 利用for循环打印出金字塔的步骤 定义一个变量 $n,代表金字塔的层数; 利用 for 循环使程序输出金字塔结构; for循环中需要再套一个循环,控制每一行中*号和空格的数量; 利用 echo 打印出金字塔的每一行; 完成循环后输出整个金字塔。 代码实现 以下是 PHP …

    PHP 2023年5月26日
    00
  • PHP laravel实现导出PDF功能

    以下是关于“PHP Laravel实现导出PDF功能”的完整使用攻略: 基础知识 在了解PHP Laravel实现导出PDF功能之前需要掌握一些基础知识,包括PDF的基本概念、LaravelPDF的应用等。以下是一些常见的基础知识: PDF的基本概念,包括PDF的定义、PDF的优点、PDF的应用等。 Laravel中PDF的应用,包括Laravel中PDF的…

    PHP 2023年5月12日
    00
  • 如何利用微信小程序查询地理经纬位置

    说明: 为了完成如何利用微信小程序查询地理经纬位置的攻略,我们需要使用微信小程序提供的API接口,主要包括wx.getLocation和wx.chooseLocation。 使用wx.getLocation获取当前地理位置。 wx.getLocation({ type: ‘wgs84’, // 默认为wgs84坐标,使用gcj02时会有偏差 success(…

    PHP 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部