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

yizhihongxing

下面是讲解“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日

相关文章

  • 微信小程序实现搜索指定景点周边美食、酒店

    接下来我将详细讲解“微信小程序实现搜索指定景点周边美食、酒店”的完整攻略,包括数据获取、搜索及展示等步骤。 数据获取 要实现搜索指定景点周边美食、酒店的功能,必须先获取景点的位置坐标及其周边的美食和酒店数据。这可以通过高德地图API来获取。 首先需要在高德地图开放平台上申请一个开发者账号,并创建一个小程序应用。 在小程序代码中引入 wx.request() …

    PHP 2023年5月30日
    00
  • PHP编程中字符串处理的5个技巧小结

    PHP编程中字符串处理的5个技巧小结 技巧一:拼接字符串 在PHP中,最基本的字符串处理操作莫过于拼接字符串了。我们可以使用”.”来拼接两个字符串,示例代码如下: $str1 = ‘Hello’; $str2 = ‘World’; echo $str1 . ‘ ‘ . $str2; // 输出:Hello World 技巧二:字符串截取 要截取PHP字符串的…

    PHP 2023年5月26日
    00
  • PHP读取文件内容的五种方式

    当我们在编写 PHP 代码时,有时需要读取文件的内容。以下是 5 种 PHP 读取文件内容的方式: 1. file_get_contents()函数 file_get_contents() 函数用于将整个文件读取到一个字符串中。 $file_content = file_get_contents(‘file.txt’); echo $file_content…

    PHP 2023年5月26日
    00
  • php提取数字拼接数组的具体操作

    PHP提取数字拼接数组是一种常见的操作,一般用于对一串字符串中的数字进行提取、处理和存储。以下是在PHP中提取数字拼接数组的具体操作攻略。 步骤一:匹配数字 要提取一串字符串中的数字,需要使用正则表达式来匹配数字。在PHP中,可以使用 preg_match_all 函数来实现。它的语法如下: preg_match_all($pattern, $string,…

    PHP 2023年5月26日
    00
  • PHP观察者模式原理与简单实现方法示例

    下面就详细讲解一下“PHP观察者模式原理与简单实现方法示例”的完整攻略。 什么是观察者模式? 观察者模式是一种软件设计模式,通过定义一种一对多的依赖关系,以便于多个对象同时处理某一个任务。在该模式中,一个被观察的主题(即可观察者)维护一组观察者集合,它们依赖于该主题。当主题状态发生改变时,它会自动通知观察者们,使得它们能够自动更新自己的状态。 观察者模式的实…

    PHP 2023年5月27日
    00
  • PHP的RSA加密解密方法以及开发接口使用

    PHP的RSA加密解密方法以及开发接口使用攻略 什么是RSA加密? RSA加密是指使用一种非对称密钥加密算法,实现数据加密的过程。该算法是由 Ron Rivest、Adi Shamir 和 Leonard Adleman 在1977年提出的,被广泛应用于各种网络通信安全的协议和系统中。它使用一个公钥和一个私钥,公钥用于加密数据,私钥用于解密数据。RSA加密算…

    PHP 2023年5月26日
    00
  • PHP similar_text 字符串的相似性比较函数

    PHP 中提供了类似于使用 edit-distance 算法来比较两个字符串相似性的函数——similar_text。下面是详细的攻略: 1. 函数概述 similar_text(string $string1, string $string2, float &$percent) : int 该函数用来比较两个字符串的相似度,并返回相同字符数量。$p…

    PHP 2023年5月26日
    00
  • 解决php接收shell返回的结果中文乱码问题

    当我们通过PHP的shell_exec或exec函数执行系统命令时,有可能会遇到返回结果中出现乱码的情况,这是因为系统命令返回的结果可能包含了中文字符,但是代码运行的环境不一定支持中文字符编码导致的。下面是解决PHP接收shell返回的结果中文乱码问题的完整攻略: 设置环境变量 首先我们可以设置环境变量来指定命令行的字符集编码,比如我们执行如下命令: put…

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