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

embedded/2025/3/15 1:34:49/
http://www.w3.org/2000/svg" style="display: none;">

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

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

https://i-blog.csdnimg.cn/direct/c5683707eb7a46128dbc59d98af5d6cb.png#pic_center" alt="在这里插入图片描述" />

1、安装 Guzzle

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

composer require guzzlehttp/guzzle

2、创建图片爬虫程序

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

代码示例:

php"><?phprequire '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 文件:
php image_scraper.php

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

4、总结

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

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


http://www.ppmy.cn/embedded/172633.html

相关文章

无法解析插件 org.springframework.boot:spring-boot-maven-plugin:2.4.13报错异常

今天导入项目的时候&#xff0c;Maven突然加载异常爆红 重新配置了一下用户文件查看包里是否有我们需要的版本&#xff08;这个版本必须与父文件版本相同&#xff09;&#xff0c; 找到你自己的maven文件地址 路径&#xff1a;Maven\repository\org\springframework\boot\spri…

TCP网络协议

TCP粘包 1. TCP在接收数据时&#xff0c;多包数据粘在了一起 2. 原因&#xff1a; 1. TCP发送数据时&#xff0c;没有及时发走&#xff0c;会根据缓冲区数据的情况进行重新组包&#xff1b; 2. TCP接收方&#xff0c;没有及时读走缓冲区数据&#xff0c;导致缓冲区大量数…

TTP/HTTPS、TCP/IP 协议、RPC、Socket 通信机制

1. TTP/HTTPS TTP (HTTP) 和 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是基于 TCP/IP 协议的应用层协议&#xff0c;主要用于客户端和服务器之间的数据传输。 HTTP&#xff08;超文本传输协议&#xff09;&#xff1a;这是用于 web 页面和服务器之间…

Ultravox:融合whisper+llama实现audio2text交互

Ultravox是由Fixie AI开发的一种创新型多模态大语言模型,专为实时语音交互设计。与传统的语音交互系统不同,Ultravox无需单独的语音识别(ASR)阶段,可以直接理解文本和人类语音,实现更快速、更自然的交互体验。Ultravox v0.5在语音理解基准测试中超越了OpenAI的GPT-4o Realt…

vue3在ts中动态添加DOM(1、使用render函数,2、使用tsx)

1、使用render函数和h函数 h函数创建虚拟节点&#xff08;VNode&#xff09;&#xff0c;render函数实现虚拟节点生成真实DOM元素 实现添加一个el-button按钮 <script setup lang"ts"> import { ElButton } from "element-plus"; //需要在页面中引…

Appium高级操作--从源码角度解析--模拟复杂手势操作

书接上回&#xff0c;Android自动化--Appium基本操作-CSDN博客文章浏览阅读600次&#xff0c;点赞10次&#xff0c;收藏5次。书接上回&#xff0c;上一篇文章已经介绍了appium在Android端的元素定位方法和识别工具Inspector&#xff0c;本次要介绍使用如何利用Appium对找到的元…

多源 BFS_多源最短路(十八)542. 01 矩阵 中等 超级源点思想

542. 01 矩阵 给定一个由 0 和 1 组成的矩阵 mat &#xff0c;请输出一个大小相同的矩阵&#xff0c;其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 示例 1&#xff1a; 输入&#xff1a;mat [[0,0,0],[0,1,0],[0,0,0]] 输出&#xff…

Redis 单线程架构:化繁为简的性能哲学

在分布式系统普遍采用多线程/多进程架构的今天&#xff0c;Redis 却坚持使用单线程模型处理核心业务逻辑&#xff0c;这种看似"反常识"的设计决策背后&#xff0c;隐藏着精妙的设计哲学。本文将深入剖析 Redis 单线程架构的底层密码&#xff0c;揭示其高效运转的奥秘…