文章精选推荐
1 JetBrains Ai assistant 编程工具让你的工作效率翻倍
2 Extra Icons:JetBrains IDE的图标增强神器
3 IDEA插件推荐-SequenceDiagram,自动生成时序图
4 BashSupport Pro 这个ides插件主要是用来干嘛的 ?
5 IDEA必装的插件:Spring Boot Helper的使用与功能特点
7 Cursor 设备ID修改器,你的Cursor又可以继续试用了
文章正文
在 webman
高性能 PHP 框架中,结合爬虫引擎插件(如 GuzzleHTTP
或 Symfony Panther
)可以轻松实现数据爬取。以下是一个完整的示例,展示如何使用 webman
和 GuzzleHTTP
插件来爬取网页数据。
1. 安装依赖
首先,确保你已经安装了 webman
框架和 GuzzleHTTP
插件。
bash
composer create-project workerman/webman
cd webman
composer require guzzlehttp/guzzle
2. 创建爬虫服务
在 webman
中,可以创建一个服务类来处理爬虫逻辑。以下是一个简单的爬虫服务示例:
php
<?php
namespace app\service;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
class SpiderService
{
protected $client;
public function __construct()
{
// 初始化 GuzzleHTTP 客户端
$this->client = new Client([
'timeout' => 10, // 设置超时时间
]);
}
/**
* 爬取网页内容
*
* @param string $url 目标网址
* @return string 返回网页内容
* @throws GuzzleException
*/
public function crawl(string $url): string
{
$response = $this->client->request('GET', $url);
return $response->getBody()->getContents();
}
/**
* 解析 HTML 数据
*
* @param string $html 网页内容
* @return array 返回解析后的数据
*/
public function parseHtml(string $html): array
{
$dom = new \DOMDocument();
@$dom->loadHTML($html); // 忽略 HTML 错误
$xpath = new \DOMXPath($dom);
// 示例:提取所有标题
$titles = [];
$nodes = $xpath->query('//h1'); // 查找所有 <h1> 标签
foreach ($nodes as $node) {
$titles[] = $node->nodeValue;
}
return $titles;
}
}
3. 创建控制器
在 webman
中,控制器用于处理 HTTP 请求。以下是一个简单的控制器示例,用于调用爬虫服务并返回结果:
php
<?php
namespace app\controller;
use app\service\SpiderService;
use support\Request;
class SpiderController
{
public function crawl(Request $request)
{
$url = $request->get('url', 'https://example.com'); // 获取 URL 参数
$spider = new SpiderService();
try {
// 爬取网页内容
$html = $spider->crawl($url);
// 解析 HTML 数据
$data = $spider->parseHtml($html);
// 返回 JSON 响应
return json([
'code' => 0,
'msg' => 'success',
'data' => $data,
]);
} catch (\Exception $e) {
return json([
'code' => 500,
'msg' => $e->getMessage(),
]);
}
}
}
4. 配置路由
在 webman
中,路由用于将请求映射到控制器。打开 config/route.php
文件,添加以下路由:
php
<?php
use Webman\Route;
Route::get('/crawl', [app\controller\SpiderController::class, 'crawl']);
5. 运行并测试
启动 webman
服务:
bash
php start.php start
访问以下 URL 测试爬虫功能:
http://127.0.0.1:8787/crawl?url=https://example.com
如果一切正常,你会看到返回的 JSON 数据,包含从目标网页提取的标题。
6. 高级功能:动态渲染页面
如果需要爬取动态渲染的页面(如 JavaScript 生成的内容),可以使用 Symfony Panther
插件。以下是一个简单的示例:
安装 Symfony Panther
:
bash
composer require symfony/panther
修改爬虫服务:
php
<?php
namespace app\service;
use Symfony\Component\Panther\PantherTestCase;
class SpiderService
{
public function crawlDynamic(string $url): array
{
$client = PantherTestCase::createPantherClient();
$crawler = $client->request('GET', $url);
// 等待页面加载完成
$client->waitFor('.dynamic-content'); // 等待某个动态内容加载
// 提取数据
$titles = $crawler->filter('h1')->each(function ($node) {
return $node->text();
});
return $titles;
}
}
在控制器中调用:
php
public function crawlDynamic(Request $request)
{
$url = $request->get('url', 'https://example.com');
$spider = new SpiderService();
try {
$data = $spider->crawlDynamic($url);
return json([
'code' => 0,
'msg' => 'success',
'data' => $data,
]);
} catch (\Exception $e) {
return json([
'code' => 500,
'msg' => $e->getMessage(),
]);
}
}
7. 总结
通过 webman
和 GuzzleHTTP
或 Symfony Panther
,你可以轻松实现高性能的爬虫功能:
- 使用
GuzzleHTTP
爬取静态页面。 - 使用
Symfony Panther
爬取动态渲染的页面。 - 结合
webman
的路由和控制器,快速构建爬虫 API。
根据实际需求,可以进一步优化爬虫的性能和功能,例如:
- 使用队列异步处理爬取任务。
- 添加代理和用户代理(User-Agent)支持。
- 实现分布式爬虫架构。