高效使用 Guzzle:POST 请求与请求体参数的最佳实践

news/2024/10/6 13:54:26/

亿牛云代理.png

介绍

在现代爬虫技术中,高效发送 HTTP 请求并处理响应数据是关键步骤之一。Guzzle 是一个强大的 PHP HTTP 客户端,广泛应用于发送同步和异步请求。本文将介绍如何使用 Guzzle 发送 POST 请求,特别是如何传递请求体参数,并结合代理 IP 技术实现高效的数据抓取。同时,我们将分析 Guzzle 对同步和异步请求的不同处理方式。

技术分析

1. Guzzle 基础知识
Guzzle 提供了一个简单的接口来发送 HTTP 请求,并支持多种选项,如 JSON 数据传递、错误处理、并发请求等。首先,我们需要确保 Guzzle 已正确安装:

composer require guzzlehttp/guzzle

2. 发送 POST 请求
使用 Guzzle 发送 POST 请求时,可以通过 json 选项来传递请求体参数。下面的示例展示了如何使用 Guzzle 发送一个包含 JSON 数据的 POST 请求:

php">use GuzzleHttp\Client;$client = new Client();
$url = 'https://example.com/api/endpoint';$data = ['payItemId' => 'S-112-948-MTNMOMO-20052-200040001-1','amount' => 1000,
];$response = $client->post($url, ['json' => $data,
]);$body = $response->getBody()->getContents();
$result = json_decode($body, true);

3. 使用代理 IP
为了避免被封禁,爬虫程序常使用代理 IP 技术。以下代码展示了如何使用亿牛云爬虫代理来发送请求:

php">use GuzzleHttp\Client;$client = new Client();
$url = 'https://example.com/api/endpoint';
// 使用亿牛云爬虫代理 www.16yun.cn
$proxy = 'http://username:password@$proxy.16yun.cn:12345'; $data = ['payItemId' => 'S-112-948-MTNMOMO-20052-200040001-1','amount' => 1000,
];$response = $client->post($url, ['json' => $data,'proxy' => $proxy, // 设置代理 IP
]);$body = $response->getBody()->getContents();
$result = json_decode($body, true);

4. Guzzle 的同步和异步处理
Guzzle 提供了对同步和异步请求的支持,这使得它在处理大量请求时非常灵活。

  • 同步请求:同步请求是指程序在发送请求时会等待响应返回后再继续执行。它适用于需要逐步处理每个请求结果的场景。
php">use GuzzleHttp\Client;$client = new Client();
$url = 'https://example.com/api/endpoint';$response = $client->get($url);
$body = $response->getBody()->getContents();
echo $body;
  • 异步请求异步请求允许程序在发送请求后立即继续执行,不必等待响应返回。它适用于需要同时发送大量请求的场景。
php">use GuzzleHttp\Client;
use GuzzleHttp\Promise\PromiseInterface;$client = new Client();
$url = 'https://example.com/api/endpoint';$promise = $client->getAsync($url);
$promise->then(function (ResponseInterface $response) {echo $response->getBody()->getContents();},function (RequestException $e) {echo $e->getMessage();}
);$promise->wait(); // 等待所有异步请求完成

5. 实战示例:采集新闻网站数据
以下示例展示了如何使用 Guzzle 和亿牛云爬虫代理来采集多个新闻网站的数据:

php">use GuzzleHttp\Client;
use GuzzleHttp\Pool;
use GuzzleHttp\Psr7\Request;$client = new Client();
// 使用亿牛云爬虫代理 www.16yun.cn
$proxy = 'http://username:password@$proxy.16yun.net:12345';$urls = ['https://news.ycombinator.com/','https://www.bbc.com/news','https://www.cnn.com/',
];$requests = function ($urls) {foreach ($urls as $url) {yield new Request('GET', $url);}
};$pool = new Pool($client, $requests($urls), ['concurrency' => 5,'options' => ['proxy' => $proxy, // 设置代理 IP],'fulfilled' => function ($response, $index) {// 请求成功时的处理逻辑$body = $response->getBody()->getContents();echo "Response from index {$index}: " . substr($body, 0, 100) . "\n";},'rejected' => function ($reason, $index) {// 请求失败时的处理逻辑echo "Request {$index} failed: {$reason}\n";},
]);$promise = $pool->promise();
$promise->wait();
结论

本文介绍了如何使用 Guzzle 发送 POST 请求并传递请求体参数,以及如何结合代理 IP 技术实现高效的爬虫数据抓取。通过实际代码示例,我们展示了如何采集多个新闻网站的数据。同时,我们分析了 Guzzle 对同步和异步请求的不同处理方式。Guzzle 的灵活性和强大的功能使其成为 PHP 开发中不可或缺的工具。希望本文能为您在实际项目中使用 Guzzle 提供参考和帮助。


http://www.ppmy.cn/news/1473958.html

相关文章

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十二)-管道、环境变量、常用命令

大致介绍了一下管道、环境变量、一些常用的基本命令,可以当作学习笔记收藏学习一下!!! 文章目录 前言 一、管道 二、环境变量 1.概念 2.查看 3.修改 4.常用环境变量 三、系统状况 总结 前言 大致介绍了一下管道、环境变量、一些常…

Spring Boot中的领域驱动设计

Spring Boot中的领域驱动设计 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!领域驱动设计(Domain-Driven Design,简称DDD)是…

自定义编写 MySQL 语句 SELECT * 及返回对象用 MySQL 表映射类接收值为空的定位及处理

在实际的开发过程中,维护老代码并增加新功能是常见的任务。这篇文章将探讨在维护过程中遇到的一个问题:在对应的表中添加新字段后,表映射实体类中新增的字段因命名不符合驼峰命名规则,导致查询结果值为空的问题。 一、问题背景 …

每天一个数据分析题(四百零五)- 因子分析

因子分析是一种经典的统计分析方法,关于因子分析下列说法错误的是( )。 A. 因子分析是一种数据简化的技术 B. 最大似然法是因子载荷矩阵的估计方法之一 C. 因子旋转时采用最大方差旋转是一种正交旋转 D. 因子分析的假设中没有规定特殊因子…

计算机视觉是什么,涉及的关键技术和应用领域

计算机视觉是一门技术,它是人工智能(AI)的一个重要分支,它使计算机能够从图像或视频中识别、处理和理解视觉信息。它的研究和应用涉及多个领域,包括工业自动化、安全监控、医疗诊断、交通管理等。计算机视觉的应用非常…

electron教程(一)创建项目

一、方式① 根据官网描述将electron/electron-quick-start项目克隆下来并启动 electron/electron-quick-start地址: GitHub - electron/electron-quick-start: Clone to try a simple Electron app git clone https://github.com/electron/electron-quick-start…

开源协作wiki和文档软件Docmost

什么是 Docmost ? Docmost 是一款开源协作 wiki 和文档软件。它是 Confluence 和 Notion 等软件的开源替代品。使用 Docmost 可以无缝创建、协作和共享知识。非常适合管理您的 wiki、知识库、文档等。目前 Docmost 处于测试阶段。 软件的主要特点 安装 在群晖上以 …

BUG TypeError: GPT2Model.forward() got an unexpected keyword argument ‘past’

TypeError: GPT2Model.forward() got an unexpected keyword argument past’ 环境 transformers 4.38.1详情 这是由于新版的transformers 对GPT2Model.forward() 参数进行了改变导致的错误。具体是past名称改为了 past_key_values 。 解决方法 找到错误语…