用PHP的Guzzle库编写的图片爬虫程序

使用 PHP 的 Guzzle 库编写一个图片爬虫程序是一个非常常见的任务,Guzzle 是一个流行的 HTTP 请求库,允许你轻松地发送请求和处理响应。

下面是一个使用 Guzzle 编写的图片爬虫程序示例。此程序将从指定的网页中提取图片链接并将图片下载到本地。

1、安装 Guzzle

首先,确保你已经安装了 Guzzle 库。你可以通过 Composer 安装 Guzzle:

bash 复制代码
composer require guzzlehttp/guzzle

2、创建图片爬虫程序

接下来,我们创建一个 PHP 文件 image_scraper.php,该文件会爬取指定网页中的图片链接,并将其下载到本地。

代码示例:

php 复制代码
<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Exception\GuzzleException;
use Symfony\Component\DomCrawler\Crawler;

// 创建 Guzzle 客户端
$client = new Client();

// 下载图片函数
function downloadImage($url, $savePath) {
    global $client;

    try {
        // 发送 GET 请求获取图片数据
        $response = $client->get($url, ['sink' => $savePath]);
        echo "下载完成: $savePath\n";
    } catch (RequestException $e) {
        echo "下载失败: {$e->getMessage()}\n";
    }
}

// 爬取网页中的图片链接
function scrapeImages($url, $saveDir) {
    global $client;

    try {
        // 发送 GET 请求获取网页内容
        $response = $client->get($url);
        $html = (string) $response->getBody();

        // 使用 DomCrawler 提取图片标签中的 src 属性
        $crawler = new Crawler($html);
        $images = $crawler->filter('img')->each(function (Crawler $node) {
            return $node->attr('src');
        });

        // 确保保存目录存在
        if (!is_dir($saveDir)) {
            mkdir($saveDir, 0777, true);
        }

        // 下载每一张图片
        foreach ($images as $index => $imageUrl) {
            $imageUrl = filter_var($imageUrl, FILTER_VALIDATE_URL) ? $imageUrl : $url . '/' . ltrim($imageUrl, '/');
            $imagePath = $saveDir . '/image_' . ($index + 1) . '.jpg';
            downloadImage($imageUrl, $imagePath);
        }
    } catch (GuzzleException $e) {
        echo "请求失败: {$e->getMessage()}\n";
    }
}

// 主程序
$url = 'https://example.com';  // 替换为要爬取的网页 URL
$saveDir = 'downloaded_images';  // 图片保存目录
scrapeImages($url, $saveDir);

代码说明:

  1. Guzzle 客户端

    • 使用 new Client() 创建一个 Guzzle HTTP 客户端实例,用于发送请求。
  2. downloadImage 函数

    • 这个函数接收图片的 URL 和保存路径,发送 GET 请求获取图片并将其保存到指定路径。
    • sink 选项告诉 Guzzle 直接将响应的内容保存到文件中。
  3. scrapeImages 函数

    • 发送 GET 请求获取网页 HTML 内容。
    • 使用 Symfony\Component\DomCrawler\Crawler 类解析网页并提取所有 <img> 标签的 src 属性值,获取图片的 URL。
    • filter('img') 用于选择网页中的所有图片标签。
    • each 方法用于遍历每个图片节点,提取其 src 属性并保存到数组中。
    • 为每个图片 URL 下载并保存图片,保存路径为 downloaded_images/image_1.jpg 等。
  4. 相对路径问题

    • 如果图片链接是相对路径,代码会自动将它转换为绝对路径。filter_var($imageUrl, FILTER_VALIDATE_URL) 判断 URL 是否为有效的绝对路径,如果不是,则拼接基 URL。
  5. 文件夹创建

    • mkdir($saveDir, 0777, true) 会创建保存图片的目录,如果目录不存在的话。
  6. 错误处理

    • 使用 try-catch 捕获请求失败或下载失败的错误,并打印错误消息。

3、运行程序

  1. 将上述代码保存为 image_scraper.php 文件。
  2. 运行 PHP 文件:
bash 复制代码
php image_scraper.php

程序会从指定的网页中提取图片 URL,并将其保存到本地目录 downloaded_images 中。

4、总结

此程序使用 Guzzle 和 Symfony 的 DomCrawler 来抓取网页中的图片并将其下载到本地。它能够处理网页中的图片 URL,并确保下载的文件保存到指定的目录中。

如果网页的图片链接是相对路径,程序会自动拼接成完整的 URL。你可以根据需要扩展此程序,例如支持下载其他类型的资源、处理不同类型的网页结构等。

相关推荐
我很好我还能学7 分钟前
【面试篇 9】c++生成可执行文件的四个步骤、悬挂指针、define和const区别、c++定义和声明、将引用作为返回值的好处、类的四个缺省函数
开发语言·c++
玩转4G物联网27 分钟前
零基础玩转物联网-串口转以太网模块如何快速实现与TCP服务器通信
服务器·网络·物联网·网络协议·tcp/ip·http·fs100p
蓝婷儿28 分钟前
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
开发语言·python·学习
孔令飞40 分钟前
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
ai·云原生·容器·golang·kubernetes
渣渣盟44 分钟前
基于Scala实现Flink的三种基本时间窗口操作
开发语言·flink·scala
糯米导航1 小时前
Java毕业设计:办公自动化系统的设计与实现
java·开发语言·课程设计
糯米导航1 小时前
Java毕业设计:WML信息查询与后端信息发布系统开发
java·开发语言·课程设计
hie988942 小时前
HTTP常见的请求方法、响应状态码、接口规范介绍
http
MessiGo2 小时前
Javascript 编程基础(5)面向对象 | 5.1、构造函数实例化对象
开发语言·javascript·原型模式
大霞上仙2 小时前
nonlocal 与global关键字
开发语言·python