文章精选推荐
1 JetBrains Ai assistant 编程工具让你的工作效率翻倍
2 Extra Icons:JetBrains IDE的图标增强神器
3 IDEA插件推荐-SequenceDiagram,主动生成时序图
4 BashSupport Pro 这个ides插件重要是用来干嘛的 ?
5 IDEA必装的插件:Spring Boot Helper的利用与功能特点
6 Ai assistant ,又是一个写代码神器
7 Cursor 设备ID修改器,你的Cursor又可以继续试用了
文章正文
在 webman 高性能 PHP 框架中,结合爬虫引擎插件(如 GuzzleHTTP 或 Symfony Panther)可以轻松实现数据爬取。以下是一个完整的示例,展示怎样利用 webman 和 GuzzleHTTP 插件来爬取网页数据。
1. 安装依赖
首先,确保你已经安装了 webman 框架和 GuzzleHTTP 插件。
- composer create-project workerman/webman
- cd webman
- composer require guzzlehttp/guzzle
复制代码 2. 创建爬虫服务
在 webman 中,可以创建一个服务类来处理爬虫逻辑。以下是一个简朴的爬虫服务示例:
- <?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
- 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
- use Webman\Route;
- Route::get('/crawl', [app\controller\SpiderController::class, 'crawl']);
复制代码 5. 运行并测试
启动 webman 服务:
访问以下 URL 测试爬虫功能:
- http://127.0.0.1:8787/crawl?url=https://example.com
复制代码 如果齐备正常,你会看到返回的 JSON 数据,包含从目的网页提取的标题。
6. 高级功能:动态渲染页面
如果需要爬取动态渲染的页面(如 JavaScript 生成的内容),可以利用 Symfony Panther 插件。以下是一个简朴的示例:
安装 Symfony Panther:
- composer require symfony/panther
复制代码 修改爬虫服务:
- <?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;
- }
- }
复制代码 在控制器中调用:
- 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)支持。
- 实现分布式爬虫架构。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |