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使用header方式实现文件下载功能

    当用户需要下载服务器上存储的文件时,可以使用 PHP 的 header() 函数实现文件下载功能。以下是实现文件下载的完整攻略: 步骤一:创建下载链接 在 HTML 页面中创建一个下载链接,该链接指向一个 PHP 下载文件的脚本,如下所示: <a href="download.php?filename=example.docx"&g…

    PHP 2023年5月23日
    00
  • PHP笛卡尔积实现算法示例

    PHP笛卡尔积是一种非常常见的算法,它常被用来解决组合的问题。本文将为您提供是实现笛卡尔积算法的完整攻略和示例说明。 1. 什么是笛卡尔积? 笛卡尔积是集合论中的一种运算方式,其目的是将多个集合中的元素进行组合,生成一个新的集合。 例如,如果有两个集合 A={a,b} 和 B={0,1},那么它们的笛卡尔积为: {(a,0), (a,1), (b,0), (…

    PHP 2023年5月27日
    00
  • javascript仿php的print_r函数输出json数据

    下面是详细讲解“JavaScript仿PHP的print_r函数输出JSON数据”的完整攻略: 1. 了解print_r函数 先了解一下print_r函数,它是PHP中一种用于打印一些数据类型的函数,主要用于调试程序,可以输出关于变量的易于理解的信息,包括变量类型和值等。 例如: $array = array(‘name’=>’Tom’, ‘age’=…

    PHP 2023年5月26日
    00
  • PHP7引入的”??”和”?:”的区别讲解

    当PHP7引入的”??”和”?:”这两个操作符都用于在特定情况下进行短路求值,以简化代码并提高性能。 ??操作符 “??”操作符表示当左边的操作数为空或未定义时,使用右侧的默认值。例如,以下代码片段展示了如何使用”?”?”操作符: $username = $_GET[‘username’] ?? ‘Anonymous’; echo $username; 在上…

    PHP 2023年5月26日
    00
  • PHP快速推送微信模板消息

    接下来我将为您详细讲解“PHP快速推送微信模板消息”的完整攻略。 概述 在进行快速推送微信模板消息之前,我们需要先了解微信公众号开发的基本流程。公众号开发主要分为三个步骤,分别是注册公众号、接入微信服务器和消息与事件处理。在这三个步骤中,我们需要获取access_token并创建模板消息。而PHP作为一门强大的后端语言,在这个过程中可以大大方便我们的操作。下…

    PHP 2023年5月27日
    00
  • PHP获取当前时间的5种实现方式

    以下是“PHP获取当前时间的5种实现方式”的完整攻略。 1. 使用date()函数获取当前时间 date()函数是PHP中用于获取日期和时间的函数,可以用来获取当前时间。函数的基本语法如下: date(format,timestamp) 其中,format是必须的参数,表示日期的输出格式;timestamp参数是可选的,表示要格式化的时间戳。如果不带time…

    PHP 2023年5月26日
    00
  • php实现的数字验证码及数字运算验证码

    首先,我们需要了解什么是验证码。验证码是用于防止机器人恶意攻击的有效工具。其中数字验证码是一种常用的验证码形式,它通过产生随机数字,要求用户输入正确的数字,验证用户身份。 接下来我们将讲解如何用PHP实现数字验证码及数字运算验证码的完整攻略。 数字验证码 数字验证码可以用随机数的方式生成,具体步骤如下: 1. 生成随机数 使用 PHP 的 rand(min,…

    PHP 2023年5月26日
    00
  • php计算当前程序执行时间示例

    PHP计算当前程序执行时间攻略 在PHP中,我们可以通过获取当前时间戳来计算程序的执行时间,计算的方法主要是获取程序执行前的时间戳和执行结束后的时间戳之差。我们可以使用PHP的microtime()函数来获取毫秒级别的时间戳,进而计算程序的执行时间。 示例1:简单的计算当前程序执行时间 首先,我们需要在程序的开始和结束处分别获取时间戳,并计算出程序执行的时间…

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