和 Laravel, ,你可以通过三个步骤对网站进行抓取:安装一个包,例如 Symfony DomCrawler 经由 Composer, 创建订单 Artisan, ,然后选中这些元素 HTML 带选择器 CSS.
本网络爬虫指南将向您展示如何通过……来具体操作, PHP代码 即用型。.

使用 Laravel 进行刮擦的先决条件
Laravel 是一个 PHP 框架 专为现代Web应用而设计。其丰富的生态系统使其成为构建一个整洁且易于维护的网页抓取项目的理想基础。.
在开始之前,请确保环境设置正确:
- Composer, ,用于安装软件包的依赖项管理器。.
- 最新版本的 PHP 与你的 Laravel 版本兼容。.
- Laravel 通过以下方式安装
composer create-project laravel/laravel 我的爬虫.
在技能方面,掌握一些基础知识就足以入门:
- 了解……的基础知识 PHP 以及应用程序的结构 Laravel (控制器、路由、架构 MVC).
- 理解 HTML 和 CSS 选择器 以便精确定位页面中的元素。.
- 掌握使用方法 Composer 在命令行中向项目添加包。.
关于爬网本身,以下是 刮削工具 最有用的:
- Symfony DomCrawler + HttpClient :如今最常用的组合。它通过该方法下载一个页面并在HTML中进行导航
filter()从 DomCrawler. 要初始化客户端,你需要使用HttpClient::create()并选择所需选项。. - HTTP Client 的 Laravel : 基于 Guzzle, 它通过以下方式获取简单内容:
Http::get()并能很好地处理对一个 应用程序接口. - Puppeteer / Headless 铬 :一款无界面的浏览器,对于抓取那些通过JavaScript或通过 阿贾克斯. Puppeteer 作为一款 Node.js 工具,你可以通过以下方式进行调用: Laravel 通过该软件包 spatie/browsershot.
使用 Laravel 创建第一个 scraper 的教程
按照以下步骤创建一个 功能性爬虫 和 Laravel. 你将安装一个爬虫软件包,生成一条命令 Artisan, ,然后使用CSS选择器定位数据。.
步骤 1:安装和配置
创建一个新项目 Laravel 和 Composer, ,然后添加组件 Symfony 网页抓取所需的:
# 1) 创建一个新的 Laravel 项目 composer create-project laravel/laravel scraper-demo cd scraper-demo # 2) 添加爬虫组件 composer require symfony/browser-kit symfony/http-client symfony/dom-crawler symfony/css-selector
你会经常遇到 Goutte 在哪里 weidner/goutte 在以前的教程中。这些软件包已被官方弃用,并且 weidner/goutte 无法再安装在最新版本的 Laravel (第11条及以下)。.
他们的直接替补是 HttpBrowser 的 Symfony, ,而且代码几乎完全一样。.
步骤 2:创建“Artisan”订单
生成一个命令,其中包含你的爬虫逻辑,使用 php artisan :
php artisan make:command ScrapeData
文件在此处创建: app/Console/Commands/ScrapeData.php. 正是在这种 班级 你将编写HTTP请求并提取数据。该类 ScrapeData 扩展 命令, ,以及该方法 public function handle() 包含所有的爬取逻辑。.
第 3 步:编写刮板代码
在生成的命令中,你需要组合三个关键模块:
- A HTTP 请求 以获取该页面的HTML内容。.
- 的 CSS 选择器 已转至 DomCrawler 通过……筛选数据
filter(). - A 环 来浏览项目并显示结果。
以下是一个用于抓取的完整代码示例: 文章标题 来自一个博客:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Symfony\Component\BrowserKit\HttpBrowser;
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\DomCrawler\Crawler;
class ScrapeData extends Command
{
protected $signature = 'scrape:data';
protected $description = 'Scraper simple des titres d\'articles';
public function handle(): int
{
$url = 'https://example.com/blog'; // URL du blog à scraper
$this->info("Scraping: {$url}");
// 1) Requête HTTP pour récupérer le HTML
$browser = new HttpBrowser(HttpClient::create());
$crawler = $browser->request('GET', $url);
// 2) Utilisation de sélecteurs CSS avec DomCrawler
$nodes = $crawler->filter('h2 a');
// 3) Boucle sur les éléments et affichage
$nodes->each(function (Crawler $node, $i) {
$title = $node->text();
$link = $node->attr('href');
$this->line(($i+1) . ". " . $title . " - " . $link);
});
return self::SUCCESS;
}
}
给你 DomCrawler 负责完成所有HTML分析工作。该方法 filter('h2 a') 提取标题中的每个链接,然后 each() 在上面打个结以取出 文本 以及该属性 href. 然后在终端中运行该数据抓取工具,命令如下: php artisan scrape:data 你会看到标题一个接一个地显示出来。.
你也可以运行 php artisan serve 以便在部署前在本地测试你的应用程序。.
使用 Laravel 进行网络搜刮的最佳实践
要想用Laravel进行规范的网页抓取,掌握几个关键要点就能带来巨大改变。以下是应遵循的最佳实践,无论你管理的是 网络爬虫机器人 或一次性订单。.
1.管理任务和队列
数据抓取可能需要 每页几秒钟. 试想一下,如果不得不进行数据抓取 1000页 如果某个网站出现故障:你的应用程序将会被阻断,且在相当长的一段时间内无法使用。解决方法只需两个字: 工作 和 队尾 Laravel。.
- 一个 职位, ,这是一项你想在后台执行的任务。.
- A 机尾 (队列),这是用来存放这些任务的地方,以便逐一执行它们,同时不影响其他任务的运行。.
以下是将爬取逻辑封装到任务中的方法:
<?php // app/Jobs/ScrapePageJob.php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Symfony\Component\BrowserKit\HttpBrowser; use Symfony\Component\HttpClient\HttpClient; class ScrapePageJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected string $url; public function __construct(string $url) { $this->url = $url; } public function handle(): void { $client = new HttpBrowser(HttpClient::create()); $crawler = $client->request('GET', $this->url); // Exemple simple : extraire tous les <h1> $titles = $crawler->filter('h1')->each(function ($node) { return $node->text(); }); // 持久性/日志/事件... foreach ($titles as $title) { \Log::info("[Scraping] {$this->url} - H1: {$title}"); } } }
onQueue('scraping'); // 若需使用专用队列
}
return response()->json(['status' => '已在后台启动抓取']);
}
}
要触发该控制器,请在你的 routes/web.php 文件中声明一条路由,例如 Route::get('/scrape', [ScraperController::class, 'start']). 你还可以使用以下方式生成一个专用控制器: php artisan make:controller ScraperController.
Laravel 提供了多种用于管理该队列的机制。其中使用最广泛的两种是:
- 带数据库的文件 :任务以行形式存储在SQL表中,随后由一个工作进程依次执行。.
- 跟上 Redis : 任务会被放入内存中的一个超高速队列中,非常适合处理大量任务。.
2.使用 Laravel 任务调度程序实现自动化
Laravel 集成了 任务计划器 (调度器),它能让你无需费心即可实现爬虫任务的自动化。这样,你就可以设置命令在固定时间间隔内执行,例如 每小时.
以下是在 routes/console.php 中进行配置的方法:
hourly(); // 有用的示例: // Schedule::command('scrape:data')->everyFifteenMinutes(); // Schedule::command('scrape:data')->dailyAt('02:30')->timezone('Indian/Antananarivo');
3.绕过防窃听保护
许多网站都设置了防范爬虫的措施。为避免被封禁:
- 更改 User-Agent : 模拟真实的浏览器,而非HTTP客户端的默认标头。.
- 管理最后期限 : 插入停顿 (sleep, throttle),以免目标服务器超载。
- 使用代理 : 将请求分散到多个IP地址上。.
4. 遵守robots.txt文件及法律框架
绕过防护措施并不意味着可以为所欲为。数据抓取仍受监管,忽视这一点可能会让你付出高昂的代价。.
- 遵守 robots.txt 文件的规定 :它指明了网站允许或禁止爬虫抓取的页面。这是必须遵守的第一条礼仪规则。.
- 查看使用条款 :网站可以通过其《使用条款》禁止数据抓取。.
- 请注意《通用数据保护条例》(GDPR) : 如果你收集到一些 个人资料, ,你必须遵守欧盟关于个人数据收集和处理的法规。.
使用 Laravel 进行网络搜索的替代方法有哪些?
Laravel 在将爬虫功能集成到一个 PHP应用程序 现有的方案。但根据你的项目情况,其他方案有时可能更合适。以下是两种主要的替代方案,以及它们各自的优点和局限性。.
使用Python进行网页抓取
Python 是网络爬虫领域使用最广泛的编程语言。它依托于诸如 Scrapy 和 BeautifulSoup.
- 优点 :生态系统非常丰富,原生支持大规模爬取管理,拥有庞大的用户社区。.
- 缺点 :必须脱离 Laravel 生态系统。如果你的网站和 API 已经运行在 PHP.
具体来说,如果数据抓取是项目的核心,而不仅仅是应用程序的一个组成部分,那么你就应该选择Python。.
无代码工具
越来越多的工具可以用于数据抓取 无编码, ,有时在……的帮助下,’IA. 其中最著名的包括 亮数据, Octoparse 和 Apify.
- 优点 : 可视化配置,内置的JavaScript页面管理和阻塞处理,无需编写任何代码。.
- 缺点 :付费订阅,精细控制程度不如用Laravel自建的爬虫。.

常见问题
如何使用 Laravel 搜索受登录保护的网站?
原理很简单:你先模拟一次登录,然后利用该会话访问受保护的页面。具体来说,你需要:
- 模拟连接 通过一个POST请求,将电子邮件地址和密码提交至表单。.
- 保留Cookie 会话,以便后续请求保持已认证状态。.
随着 HttpBrowser 的 Symfony, ,你可以非常流畅地连续完成这两个步骤。它通过 HttpClient::create(), ,然后在每次请求之间自动管理Cookie:
use Symfony\Component\BrowserKit\HttpBrowser;
use Symfony\Component\HttpClient\HttpClient;
$browser = new HttpBrowser(HttpClient::create());
$crawler = $browser->request('GET', 'https://exemple.com/login');
$form = $crawler->selectButton('Se connecter')->form();
$browser->submit($form, [
'email' => 'ton@email.com',
'password' => 'ton_mot_de_passe',
]);
// Les cookies de session sont gardés automatiquement
$page = $browser->request('GET', 'https://exemple.com/compte');
echo $page->filter('h1')->text();
请注意 HttpBrowser 在两次请求之间会自动管理Cookie。因此,你无需手动存储任何内容。.
使用 Laravel 进行网页刮擦时,如何管理分页?
若要连续浏览多页,方法是找到带有 CSS 选择器, ,然后只要它存在就一直循环下去。逻辑如下:
- 抓取第一页 并提取有用的数据。.
- 检测«下一页»链接» 通过 CSS 选择器。.
- 完成 直到没有下一页为止。.
$url = 'https://exemple.com/blog?page=1';
while ($url) {
$crawler = $browser->request('GET', $url);
$crawler->filter('.article-title')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
// Récupère le lien "page suivante" s'il existe
$next = $crawler->filter('a.next');
$url = $next->count() ? $next->attr('href') : null;
}
只要选择开关一启动,该循环就会自动停止 a.next 不再返回任何结果。.
如何将抓取的数据导出(为CSV、Excel或JSON格式)?
获取数据后,你可以使用 Laravel 将其导出为多种格式:
fputcsv()用于生成一个文件 CSV 原生。.- 书店
Maatwebsite\Excel以生成一个文件 在 Excel. - 本地函数
json_encode()用于导出 JSON, ,如果你随后要通过API公开数据,这会很方便。.
如何处理刮擦过程中的错误和异常?
网站可能会返回错误、更改其HTML结构或中断连接。要构建一个健壮的爬虫,你需要预先考虑这些情况:
- 对每个请求进行封装 于
try/catch. - 检查HTTP状态码 (404、429、500…),并记录错误或延迟一段时间后重试。.
try {
$crawler = $browser->request('GET', $url);
$status = $browser->getResponse()->getStatusCode();
if ($status !== 200) {
\Log::warning("Réponse inattendue: $status sur $url");
}
} catch (\Exception $e) {
\Log::error('Scraping échoué: ' . $e->getMessage());
}
网络搜索是合法的还是非法的?
这 网络搜索的合法性 这取决于目标网站以及你对数据的使用方式。以下是需要牢记的三点:
- 数据库的特殊权利 的 欧盟指令96/9/EC 保护数据库中的内容。提取网站的大部分内容可能被禁止。.
- 使用条款 :在“瑞安航空诉PR Aviation案”(欧盟法院,2015年)的判决中,法院确认,当网站的数据库既不受著作权保护,也不受特殊权利保护时,该网站可在其《使用条款》中禁止数据抓取行为。.
- RGPD : 一旦你收集到 个人资料 (电子邮件、姓名、个人资料),你将受到欧盟法规的约束。务必保持高度谨慎。.
实际操作中,请始终遵循该文件 robots.txt, ,请限制查询频率,并避免在缺乏法律依据的情况下处理个人数据。你有疑问或遇到特殊情况吗?请在评论中说明。.





