使用guzzlehttp异步多进程实现爬虫业务

Python和PHP核心技术共享平台

背景

小哥近来在通过动态代理池爬取一些公司需要的大文件pdf规格书的处理。遇到的难点,如何保证服务器CPU、连接数等正常情况下,多进程、异步快速处理这些业务并且保证准确。下面小哥就给看官唠嗑一下,我使用guzzlehttps如何处理的这一业务需求的。

梳理逻辑

  • 多进程处理

    保证并发处理,提高处理效率

  • 异步处理

    有些数据可能响应很快,有些很慢,不能因为一个进程阻塞其它业务正常执行影响爬取效率。

详细代码

php 复制代码
 /**
     * 使用guzzleHttp多进程异步远程下载文件
     * @param array $urlMap 多个远程爬取链接
     * @param string $localPath 本地保存路径
     */
    public function downloadByGuzzlePoolAsync(array $urlMap,$localPath)
{
        //代理
        $proxy = 'http://http-dynamic-S04.xzzdaili.com:10030';
        $proxyUser = '1169461750313049664';
        $proxyPassword = 'lG9sMtTp';
        $proxyAuth = base64_encode($proxyUser . ":" . $proxyPassword);
​
        $header = [
            'User-Agent'    => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
            'Referer'       => 'https://exmaple.com',
            'Proxy-Authorization'  => "Basic " . $proxyAuth,
            'Content-Type'  => 'application/pdf',
            'content-encoding' => 'gzip, deflate, br, zstd',
            'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        ];
​
        $client = new Client();
​
        $requests = function ($urlMap) use ($client,$localPath,$proxy,$header) {
            foreach ($urlMap as $url){
                yield $client->getAsync($url,[
                    'headers'   => $header,
                    'proxy'     => $proxy,
                    'verify' => false,
                    'stream' => true,
                    'sink' => $localPath
                ])->then(function($resp) {
                    echo "远程规格书获取成功,resp=" . jsonD($resp->getBody()) . PHP_EOL;
                },function($reason){
                    echo '远程规格书获取失败 :'.$reason. PHP_EOL;
                });
            }
        };
​
        $pool = new \GuzzleHttp\Pool($client, $requests($urlMap), [
            'concurrency' => 5,//进程数
            'options' => [
                'timeout' => 10, // 设置超时s
            ],
            'fulfilled' => function (Response $response, $index) use($localPath){
                //TODO 处理接口成功结果逻辑
​
                // 创建请求
                $zacStream = fopen($localPath, 'wb');
                //流速写入文件:
                while (!$response->getBody()->eof()) {
                    fwrite($zacStream, $response->getBody()->read(1024 * 1024)); // 读取1MB的数据
                }
                fclose($zacStream);
                echo 'GuzzleHttp进程池响应成功,index=' . $index . ' response=' . $response->getReasonPhrase() . PHP_EOL;
​
            },
            'rejected' => function (RequestException $reason, $index) {
                //TODO 处理接口失败结果逻辑
​
                echo 'index=' . $index . ' ,error=' .$reason->getMessage() . PHP_EOL;
            },
        ]);
​
        $promise = $pool->promise();
​
        // 捕获请求异常
        $promise->then(
            function () {
                echo "所有请求都已成功完成" .PHP_EOL;
            },
            function (RequestException $e) {
                echo "发生了异常: " . $e->getMessage() . PHP_EOL;
            }
        );
​
        // 等待所有请求完成
        $promise->wait();
​
//        // 访问每个请求的响应
//        foreach ($pool->getRequests() as $request) {
//            echo $request->getUri() . "\n";
//        }
​
    }
}

**以上是小哥本人文章的全部内容,**希望总结会帮助到各位看官。最后,小哥温馨提示:每天阅读3分钟,天天学习一点点,天天进步一点点。

相关推荐
微小冷6 分钟前
pyqt+matplotlib多进程图像刷新
pyqt·matplotlib·进程通信·多进程·queue·process
绘梨衣5473 小时前
异步任务队列-学习2
爬虫·python·学习·任务队列
Python大数据分析@4 小时前
推荐一个好用的爬虫CLI工具
爬虫·网络爬虫
傻啦嘿哟5 小时前
某宝商品爬虫:破解反爬的终极方案(含IP代理池+User-Agent轮换)
爬虫·网络协议·tcp/ip
MartinYeung55 小时前
[论文学习]小型代码语言模型中的潜伏代理行为研究
学习·语言模型·php
P1Browser6 小时前
指纹浏览器安全吗?从浏览器环境隔离、数据存储到安全风险解析
网络·tcp/ip·安全·网络安全·github·php
棉晗榜7 小时前
C# HttpClient配置具有tls指纹发起跟浏览器一样的请求解决反爬虫防护
开发语言·爬虫·c#
CZIDC7 小时前
华为服务器TS200-2280 V2 iBMC导入SSL证书后问题案例分析
服务器·https·ssl
数据知道8 小时前
PHP 代码审计实战——ThinkPHP、Laravel 历史漏洞模式深度剖析
android·网络·web安全·网络安全·php·laravel
、如果8 小时前
推文评论数据怎么拿?X(Twitter)评论分析 Skill 的工程拆解与实测
爬虫·ai编程·twitter