С Laravel, ты можешь выполнить скрапинг веб-сайта за три шага: установить пакет, например Symfony DomCrawler через Composer, создать заказ Artisan, а затем выделить элементы HTML с переключателями CSS.
В этом руководстве по веб-парсингу рассказывается, как это сделать на практике, с помощью код PHP готовый к использованию.

Необходимые условия для скрапбукинга с помощью Laravel
Laravel это PHP-фреймворк разработан для современных веб-приложений. Благодаря своей обширной экосистеме он служит идеальной основой для организации аккуратного и простого в обслуживании проекта по скрапингу.
Прежде чем приступить к работе, убедись, что у тебя созданы подходящие условия:
- 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()и хорошо обрабатывает вызовы к API. - Puppeteer / Headless Chrome : браузер без интерфейса, незаменимый для сбора данных со страниц, которые загружают свой контент в формате JavaScript или через «Аякс».
Руководство по созданию вашего первого скребка с помощью Laravel
Выполните следующие шаги, чтобы создать рабочий скребок с Laravel. Ты установишь пакет для сбора данных, сгенерируешь команду Artisan, а затем выделить нужные данные с помощью CSS-селекторов.
Шаг 1: Установка и настройка
Создать новый проект Laravel с Composer, а затем добавляет Goutte, практическая реализация для скрапинга:
# 1) Создайте новый проект Laravel
compose create-project laravel/laravel scraper-demo
cd scraper-demo
# 2) Добавьте Goutte (интеграция с Laravel)
composer require weidner/goutte
Пакеты weidner/goutte а также fabpot/goutte сегодня официально сняты с производства. Они по-прежнему работают, но для нового проекта рекомендуется заменить их со стороны Symfony является symfony/browser-kit, в сочетании с symfony/http-client а также symfony/dom-crawler. Приведенный ниже код будет работать, если ты используешь weidner/goutte, который просто инкапсулирует Goutte за Laravel.
Шаг 2: Создать заказ «Artisan»
Создает запрос, который будет содержать твою логику скрапинга с помощью php artisan :
php artisan make:command ScrapeData
Файл создается здесь : app/Console/Commands/ScrapeData.php. Именно в этой класс что ты будешь составлять HTTP-запрос и извлекать данные. Класс ScrapeData распространяется Команда, и метод public function handle() содержит всю логику скрапинга.
Шаг 3: Напишите код скрепера
В сгенерированном запросе тебе предстоит объединить три основных элемента:
- А HTTP-запрос чтобы извлечь HTML-содержимое страницы.
- Принадлежащий Селекторы CSS перешли в DomCrawler для фильтрации данных с помощью
filter(). - А петля для просмотра элементов и отображения результатов.
Вот пример полного кода для сбора данных с названия статей из блога:
info('Сбор данных: {$url}");
// 1) HTTP-запрос для получения HTML-кода
$crawler = Goutte::request("GET', $url);
// 2) Использование CSS-селекторов с DomCrawler
$nodes = $crawler->filter('h2 a');
// 3) Цикл по элементам и вывод
$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.
- А вакансия, это задача, которую ты хочешь выполнить в фоновом режиме.
- А хвост (очередь) — это место, где эти задания помещаются для последовательного выполнения, не блокируя остальные процессы.
Вот как инкапсулировать логику скрапинга в задание:
// app/Jobs/ScrapePageJob.php
<?php
namespace App\Jobs;
use Goutte\Client; // Ou Guzzle/Http, selon ta stack
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
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 Client();
$crawler = $client->request('GET', $this->url);
// Простой пример: извлечение всех <h1>
$titles = $crawler->filter('h1')->each(function ($node) {
return $node->text();
});
// Постоянство / журналы / события...
foreach ($titles as $title) {
\Log::info("[Scraping] {$this->url} - H1: {$title}");
}
}
}
// app/Http/Controllers/ScraperController.php
onQueue('scraping'); // если нужна отдельная очередь
}
return response()->json(['status' => 'Сбор данных запущен в фоновом режиме']);
}
}
Чтобы запустить этот контроллер, объявите дорога в твоём файле routes/web.php Где routes/api.php, например Route::get('/scrape', [ScraperController::class, 'start']). Ты также можешь создать специальный контроллер с помощью php artisan make:controller ScraperController.
Laravel предлагает несколько систем для управления этой очередью. Две наиболее распространённые из них:
- Файл с базой данных : задания хранятся в виде строк в таблице SQL, а затем поочередно выполняются рабочим процессом.
- Иди с Redis : задания помещаются в память в сверхбыструю очередь, идеально подходящую для обработки большого объема задач.
2. Автоматизация с помощью планировщика задач Laravel
Laravel интегрирует в себя планировщик задач (планировщик), который позволяет автоматизировать работу скрейперов, не задумываясь об этом. Таким образом, ты можешь запланировать выполнение команды через регулярные промежутки времени, например каждый час.
Вот как его настроить в app/Console/Kernel.php :
command('scraper:run')->hourly();
// Полезные примеры:
// $schedule->command('scraper:run')->everyFifteenMinutes();
// $schedule->command('scraper:run')->dailyAt('02:30')->timezone('Indian/Antananarivo');
}
/**
* Запись команд.
*/
protected function commands(): void
{
$this->load(__DIR__ . '/Commands');
}
}
3. Обход защиты от обдирания
Многие сайты используют средства защиты от скрейперов. Чтобы избежать блокировки:
- Изменить User-Agent : имитирует настоящий браузер вместо стандартного заголовка HTTP-клиента.
- Управление сроками : вставляет паузы (sleep, throttle) между запросами, чтобы не перегружать целевой сервер.
- Использование прокси-серверов : распредели запросы по нескольким IP-адресам.
4. Соблюдать требования файла robots.txt и законодательства
Обход мер защиты не означает, что можно делать что угодно. Скрапинг по-прежнему регулируется, и игнорирование этих правил может дорого тебе обойтись.
- Учитывает файл robots.txt : он указывает, какие страницы сайт разрешает или запрещает сканировать. Это первое правило вежливости, которого следует придерживаться.
- Ознакомьтесь с условиями использования : сайт может запретить скрапинг в соответствии со своими Условиями использования.
- Не забудь об Общем регламенте по защите данных (GDPR) : если ты собираешь персональные данные, вы должны соблюдать европейские правила, касающиеся их сбора и обработки.
Какие есть альтернативы веб-скрептингу с помощью Laravel?
Laravel по-прежнему удобен для интеграции скрапинга в PHP-приложение существующая. Однако в зависимости от твоего проекта иногда более подходящими оказываются другие решения. Ниже приведены две основные альтернативы с указанием их преимуществ и ограничений.
Веб-парсинг с помощью Python
Python является наиболее распространенным языком для скрапинга. Он опирается на проверенные библиотеки, такие как Scrapy а также BeautifulSoup.
- Преимущества : чрезвычайно богатая экосистема, встроенные средства управления сканированием в больших масштабах, огромное сообщество.
- Недостатки : нужно выйти из экосистемы Laravel. Это неудобно, если твой сайт и API уже работают на PHP.
Конкретно говоря, Python стоит выбрать, если скрапинг является основной частью проекта, а не просто одним из компонентов твоего приложения.
Бескодовые инструменты
Появляется всё больше инструментов, позволяющих заниматься скрейпингом без кодирования, иногда с помощью’ИА. Наиболее известные из них — Яркие данные, 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());
}
Является ли веб-скреппинг законным или незаконным?
La Законность веб-скреппинга зависит от целевого сайта и того, как ты используешь данные. Вот три момента, о которых стоит помнить:
- Право sui generis на базы данных сайт Европейская директива 96/9/ЕС защищает содержимое базы данных. Извлечение значительной части сайта может быть запрещено.
- Правила и условия использования : решение Ryanair против PR Aviation (СЕС, 2015) подтвердил, что веб-сайт может запретить скрапинг в своих условиях использования, даже если контент не защищен авторским правом.
- RGPD : как только ты соберешь персональные данные (электронные адреса, имена, профили) — в этом случае на вас распространяется действие европейского регламента. Будьте предельно осторожны.
На практике всегда соблюдайте формат файла robots.txt, ограничь частоту запросов и избегай сбора персональных данных без правового основания. У тебя есть вопрос или конкретный случай? Напиши об этом в комментариях.





