使用 Goutte 进行 PHP 网页抓取的完整指南
我将一步一步地指导您完成从设置到从网站获取真实数据的所有工作。 Goutte.我还会分享一些需要注意的事项,因为抓取有时会很棘手。如果你已经准备好学习一些有用而有趣的知识,那就让我们一起开始刮痧吧!
什么是 Goutte?
Goutte 是一个小型 PHP 库,可帮助您从网站上抓取数据。它能轻松发送 HTTP 请求(如访问网页)并检查网站的 HTML 代码。然后,您就可以收集页面上的信息。Goutte 对于不使用 JavaScript 加载数据的静态页面效果很好。
Goutte 在后台使用其他 PHP 工具。它基于 Symfony 的 DomCrawler 和 浏览器套件.这些工具可帮助您浏览网页、点击链接和填写表格。
如何使用 Goutte 在 PHP 中抓取网络数据?
在使用 Goutte 之前,您需要准备一些工具:
- 已安装 PHP (7.1 或更新版本)。
- Composer (PHP 的依赖关系管理器)。
- 代码编辑器 例如 VS Code、Sublime Text 或 PHPStorm。
检查是否安装了 PHP:
php -v
如果 PHP 版本低于 7.1,请先更新。
步骤 1:创建新项目
打开终端或命令提示符。为项目创建一个新文件夹:
mkdir php-goutte-scraper
CD php-goutte-scraper 使用 Composer 初始化项目:composer init
您可以按回车键暂时接受默认值。然后,安装 Goutte:
composer require fabpot/goutte
此命令将 Goutte 添加到项目中。Composer 将下载所有需要的文件。
第 2 步:创建 PHP 文件
在文件夹中创建一个名为 index.php 的文件。在代码编辑器中打开该文件。首先添加以下代码
require_once 目录 . '/vendor/autoload.php'(供应商/autoload.php;
使用 GoutteClient;
$client = new Client();
// 您的刮擦代码将放在这里
现在你可以开始刮削了!
第 3 步:选择要抓取的网站
让我们选择一个允许刮擦的简单示例网站:
https://www.scrapethissite.com/pages/forms/
本页显示有关曲棍球队的数据。我们的目标是收集球队名称、胜场和其他统计数据。
步骤 4:用 Goutte 加载页面
将此添加到脚本中:
$url = 'https://www.scrapethissite.com/pages/forms/';
$crawler = $client->request(GET, $url);
这将加载页面,并通过 $crawler 对象访问其 HTML 内容。
步骤 5:查找所需数据
现在,让我们来查找保存数据的表格。您可以在浏览器中检查网站。右键单击一个团队,然后单击 "检查"。你会看到表格的每一行都有一个名为 team 的类。
要获取每一行,请使用以下代码:
$crawler->filter('tr.team'(团队)->each(function ($row) {
$teamName = 内饰($row->filter('.名称)->text());
$wins = 内饰($row->filter(.胜)->text());
$losses = 内饰($row->filter(.损失)->text());
echo "团队: $teamName赢了 $wins, Losses: $lossesn";
});
这将打印出每支曲棍球队的名称、胜负情况。
步骤 6:保存数据
与其打印数据,不如将其保存到数组中。然后,我们可以将其写入文件。
$teams = [];
$crawler->filter('tr.team'(团队)->each(function ($row) 使用 (&$团队) {
$团队[] = [
'团队' => 内饰($row->filter('.name')->text()),
'赢取' => 内饰($row->filter('.赢取')->text()),
'损失' => 内饰($row->filter('.损失')->text())
];
});
现在,$teams 数组中包含了所有搜索到的数据。
步骤 7:处理分页
该网站有多个页面。我们需要逐一查看才能获得所有数据。
首先,创建一个获取所有页面 URL 的函数:
function getAllPageUrls($client, $startUrl) {
$crawler = $client->request(GET, $startUrl);
$urls = [$startUrl];
$crawler->filter('.pagination li a')->each(function ($node) 使用 (&$urls) {
$href = $node->attr('href');
$url = 'https://www.scrapethissite.com' . $href;
if (!in_array($url, $urls)) {
$urls[] = $url;
}
});
return $urls;
}
然后调用函数:
$urls = getAllPageUrls($client, $url);
循环浏览所有页面:
$teams = [];
foreach ($urls as $pageUrl) {
echo "刮削: $pageUrln";
$crawler = $client->request(GET, $pageUrl);
$crawler->filter('tr.team'(团队)->each(function ($row) 使用 (&$团队) {
$团队[] = [
'团队' => 内饰($row->filter('.name')->text()),
'赢取' => 内饰($row->filter('.赢取')->text()),
'损失' => 内饰($row->filter('.损失')->text())
];
});
}
现在,您的 scraper 可以从所有页面收集数据。
第 8 步:导出为 CSV
获得数据后,可以将其导出到文件中。下面是如何将结果写入 teams.csv:
请提供需要翻译的英文内容。 = fopen(团队.csv, 'w');
// 写头文件
fputcsv(请提供需要翻译的英文内容。, [队名, 胜利, 损失]);
// 写入行
foreach ($teams as $team) {
fputcsv(请提供需要翻译的英文内容。, [$team[团队], $team[获胜], $team[损失]]);
}
fclose(请提供需要翻译的英文内容。);
echo "导出到 teams.csvn 的数据";
现在,您的数据已经保存,可以在 Excel 或任何电子表格软件中使用。
运行脚本
保存代码并返回终端。用以下命令运行脚本
PHP 索引。php
你应该能看到哪个页面正在被抓取的日志,最后会创建一个名为 teams.csv 的文件。
Goutte 的局限性
Goutte 易于使用,但也存在一些问题:
- 它已过时,不再更新。
- 它无法处理大量依赖 JavaScript 的网站。
- 它不能很好地与反僵尸保护系统配合使用。
- 它不支持高级代理。
- 它对静态网站很有效。
在满足基本需求方面,Goutte 仍然有效。但如果您需要更强的动力,请继续阅读。
2025 年更好的替代方案
这里有更好、更新的 PHP 网站搜索方法:
1.Symfony 组件
Goutte 使用 Symfony 工具。你可以直接使用它们:
作曲家 require symfony/browser-kit symfony/dom-crawler symfony/http-client 可以这样替代 Goutte:
使用 Symfony组件浏览器套件HttpBrowser;
使用 Symfony组件HttpClientHttpClient;
$client = new HttpBrowser(HttpClient::create());
这种方法更面向未来,控制能力更强。
2.在解析器中使用 Guzzle
Guzzle 是一个强大的 HTTP 客户端。将它与 symfony/dom-crawler 或 paquettg/php-html-parser 之类的解析器结合使用:
作曲家 require guzzlehttp/guzzle symfony/dom-crawler
你可以使用 Guzzle 提出请求,然后将 HTML 传递给 DomCrawler。这将为您带来更大的灵活性。对 Guzzle 和其他库感兴趣?请阅读我的文章,其中列出了 最佳 PHP 网络搜索库.
3.使用应用程序接口或网络解锁服务
如果网站受到保护,普通刮擦器会失效。有些网站使用 Cloudflare、验证码或其他僵尸拦截工具。在这种情况下,请尝试使用 Bright Data 或 Oxylabs 等 Web Unlocker API。这些服务可以绕过保护措施,返回干净的 HTML。
最终想法
如果你正在使用 PHP,那么使用 Goutte 进行网络搜索是一个不错的开始。它简单易用,非常适合小型项目或学习基础搜索知识。在本指南中,我向你展示了如何设置项目、抓取网站数据、处理多个页面并将所有内容保存到 CSV 文件。我还指出了一些更新的工具,你以后可能会想要探索一下。Goutte 可能已经过时,但它仍能很好地完成许多简单的任务。试一试,玩一玩,看看你能收集到哪些数据。

