PHP多线程批量采集下载美女图片的实现代码(续)

下面是讲解“PHP多线程批量采集下载美女图片的实现代码(续)”攻略的完整步骤:

一、前置准备
首先我们需要安装扩展,安装php-amqp扩展,这个扩展是使用RabbitMQ必备的,安装方式在官方仓库和pecl都有,我一般使用pecl安装,使用命令“sudo pecl install amqp”,然后在php.ini中添加引入即可。

二、创建消息队列
通过RabbitMQ的管理后台(默认在http://localhost:15672,此处需要安装RabbitMQ Server),创建队列,输入队列名称(如此处使用的女神图片存储队列名称为“girl_images”),然后点击添加队列即可。

三、编写采集代码
在采集代码中,首先我们需要使用curl获取目标网站的html代码内容,然后再通过正则表达式来提取其中的图片链接,之后再将这些图片链接发送到消息队列中保存。

下面是示例代码:

<?php
// 采集网站首页的美女图片链接并存入队列
require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

// 创建rabbitmq连接
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

// 指定队列名称
$queue_name = 'girl_images';

// 声明队列(如果不存在才创建)
$channel->queue_declare($queue_name, false, true, false, false);

// 获取网址
$index_url='http://www.mzitu.com';

// 获取html代码
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $index_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($ch);

// 正则表达式提取图片链接
preg_match_all('/<a href="http:\/\/www.mzitu.com\/\d+" target="_blank"><img src="(.*?)"/is', $html, $matches);

// 获取图片链接前缀(一般都会有)
$prefix = 'http:';

// 遍历所有匹配到的图片链接,发送到队列中存储
foreach ($matches[1] as $url) {
    $url = $prefix . $url;
    $msg = new AMQPMessage($url);
    $channel->basic_publish($msg, '', $queue_name);
}

// 关闭rabbitmq连接
$channel->close();
$connection->close();

四、编写下载代码
接着是下载代码部分,从消息队列中获取图片链接,然后通过curl下载图片并保存到指定目录中,需要注意的是需要先获取图片的大小,设定好进度条之后再开始下载。

下面是示例代码:

<?php
// 从队列中获取美女图片链接并下载保存
require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;

// 创建rabbitmq连接
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

// 指定队列名称
$queue_name = 'girl_images';

// 声明队列(如果不存在才创建)
$channel->queue_declare($queue_name, false, true, false, false);

// 设定美女图片的存储目录
$images_dir = __DIR__ . '/images/';
if (!is_dir($images_dir)) {
    mkdir($images_dir);
}

// 设定进度条相关的参数
$total = $channel->queue_declare($queue_name, true)[1];
$progress = new \ProgressBar\Manager(0, $total);

// 消费队列中的数据
$i = 0;
while ($i < $total) {
    $i++;
    // 从消息队列中获取美女图片链接
    $msg = $channel->basic_get($queue_name);
    if ($msg) {
        $url = $msg->body;

        // 获取图片的大小
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        $result = curl_exec($ch);
        $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $header = substr($result, 0, $header_size);
        $body = substr($result, $header_size);

        // 通过正则表达式获取图片大小
        preg_match('/Content-Length:\s([\d]+)/is', $header, $matches);
        $size = isset($matches[1]) ? $matches[1] : 0;

        // 检查图片是否已存在
        $image_name = basename($url);
        $image_file = $images_dir . $image_name;
        if (file_exists($image_file)) {
            echo $image_name . ' already exists' . PHP_EOL;
            $channel->basic_ack($msg->delivery_info['delivery_tag']);
            continue;
        }

        // 启动下载进度条
        $progress->update($i);

        // 下载图片并保存到指定目录
        $fp=fopen($image_file,'wb');
        fwrite($fp,$body);
        fclose($fp);

        // 等待一段时间再确认消息已经被消费
        sleep(1);

        // 发送确认消息,标记消息已被消费
        $channel->basic_ack($msg->delivery_info['delivery_tag']);
    }
}

// 关闭rabbitmq连接
$channel->close();
$connection->close();

总结:
以上就是实现批量下载美女图片的完整攻略。为了爬虫的健壮性,建议大家在爬虫程序中添加异常处理机制。此外,对于其他元素的抓取和分析也可以采用类似的方法,通过队列和多线程的方式让程序更灵活、高效、稳定地工作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP多线程批量采集下载美女图片的实现代码(续) - Python技术站

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

相关文章

  • php开发分页实现代码第3/3页

    首先我们来解析一下“php开发分页实现代码第3/3页”这个题目。 题目中提到了分页实现,因此我们应该可以知道这是一个分页的教程。而“php开发”也可以显示出这个教程的适用对象是使用PHP语言进行开发的人群。最后,“第3/3页”则可以暗示该教程是一个多页的文章。 基于以上推测,我们可以将教程的目录设计成以下形式: 第一页:介绍分页的实现原理及准备工作,包括数据…

    PHP 2023年5月23日
    00
  • PHP常见过waf webshell以及最简单的检测方法

    下面给您讲解一下关于“PHP常见过waf webshell以及最简单的检测方法”的攻略。 1. PHP常见过waf的webshell WAF(Web Application Firewall)是Web应用程序防火墙的缩写,主要用于防范针对Web应用程序的攻击。在Web安全中,webshell可以用于执行特定的操作,如搭建网站后门、窃取网站敏感信息、传播恶意代…

    PHP 2023年5月26日
    00
  • PHP 程序授权验证开发思路

    这里详细讲解一下 “PHP 程序授权验证开发思路” 的完整攻略。 简述 开发程序授权验证功能,是为了维护软件的版权,防止用户未授权或盗版使用软件。针对PHP程序,可以通过一些技术手段来实现授权验证功能。 实现思路 实现PHP程序授权验证的主要思路是通过如下步骤: 生成授权文件:该文件中包含了授权信息,比如授权码、授权时间、授权期限等信息。 安装授权文件:将授…

    PHP 2023年5月23日
    00
  • PHP写的求多项式导数的函数代码

    如果需要编写一个 PHP 函数,用于计算多项式函数的导数,可以按照以下步骤操作: 定义函数名和参数 在开始编写函数代码之前,需要定义函数的名称和参数。在这个例子中,我们可以使用 $a 和 $b 两个参数,其中 $a 是一个整数数组,存储了多项式的系数,$b 是一个整数,表示需要进行多少阶导数计算。因此,函数的定义可以如下: function derivati…

    PHP 2023年5月27日
    00
  • 使命召唤12CPU到100解决办法

    以下是针对“使命召唤12CPU到100解决办法”的完整攻略: 问题描述 在玩使命召唤12时,有时候会发现游戏在运行时会导致CPU占用率飙升到100%,这会导致游戏运行缓慢,影响游戏体验。下面将提供几种解决办法。 解决办法 1. 关闭无关程序 在打开游戏之前,关闭所有不必要的后台程序,例如音乐播放器、浏览器等等,这些程序会占用一定的CPU资源,导致游戏运行卡顿…

    PHP 2023年5月27日
    00
  • Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解

    Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解 一、前置条件 在进行下文所描述的操作之前,请审核你的环境是否拥有以下条件: Windows平台 PHP环境 IE浏览器 IECapt工具 二、安装IECapt工具 IECapt是一个在Windows平台上使用IE内核进行网页截屏的命令行工具。安装过程如下: 下载IECapt工具:ht…

    PHP 2023年5月26日
    00
  • php 删除一维数组中某一个值元素的操作方法

    要删除一个一维数组中的某一元素,可采取以下步骤: 使用内置函数 unset() 删除对应下标的元素。 若需保持下标连续,可使用内置函数 array_values() 重新索引数组。 下面分别对这两个步骤做详细讲解,并提供两条示例作为参考: 1. 使用unset()删除元素 unset() 函数可用于删除PHP中的变量。即使它是数组中的元素,该函数也可以使用。…

    PHP 2023年5月26日
    00
  • php反射类ReflectionClass用法分析

    PHP反射类ReflectionClass用法分析 PHP反射类(ReflectionClass)是PHP内置的一个强大的反射工具,它允许我们在运行时(动态)获取类的元数据信息,包括类的方法、属性、常量等等,同时它还提供了一些强大的功能,如动态方法调用、属性赋值等等。本文将详细分析PHP反射类的用法,并给出两个示例说明其使用方法。 获取类的元数据信息 我们可…

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