Как использовать Laravel для веб-скреппинга?

Автор:

Реакция

Комментарий

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

В этом руководстве по веб-парсингу рассказывается, как это сделать на практике, с помощью код PHP готовый к использованию.

Интерфейс Laravel с PHP для проекта по веб-парсингу
Laravel использует PHP, чтобы обеспечить чёткую структуру и инструменты, упрощающие веб-парсинг. ©Christina для Alucare.fr

Необходимые условия для скрапбукинга с помощью 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-&gt;request('GET', $this-&gt;url);

        // Простой пример: извлечение всех <h1>
        $titles = $crawler-&gt;filter('h1')-&gt;each(function ($node) {
            return $node-&gt;text();
        });

        // Постоянство / журналы / события...
        foreach ($titles as $title) {
            \Log::info("[Scraping] {$this-&gt;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.

Интерфейс Bright Data, позволяющий собирать данные из Интернета без написания кода.
Bright Data по-прежнему остаётся надёжной альтернативой, если ты хочешь заниматься скрапингом, не занимаясь написанием кода. ©Christina для Alucare.fr

Часто задаваемые вопросы

Как с помощью Laravel отсканировать сайт, защищенный логином?

Принцип прост: сначала имитируешь вход в систему, а затем используешь эту сессию для доступа к защищённым страницам. Конкретно, тебе нужно:

  1. Смоделируйте соединение с помощью запроса POST, который отправляет адрес электронной почты и пароль в форму.
  2. Сохранить файлы 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-селектор, а затем завершать его, пока он существует. Вот в чём заключается логика:

  1. Соскребите первую страницу и извлечь нужные данные.
  2. Обнаружить ссылку “Далее” с помощью селектора CSS.
  3. Застегнуть пока не закончатся следующие страницы.
$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-структуру или прервать соединение. Чтобы скрапер работал надежно, нужно предусмотреть такие ситуации:

  1. Инкапсулировать каждый запрос в try/catch.
  2. Проверить коды 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, ограничь частоту запросов и избегай сбора персональных данных без правового основания. У тебя есть вопрос или конкретный случай? Напиши об этом в комментариях.

👍Ваше мнение
Статья информативна
Статья объективна
Статья отвечает на мой вопрос
Содержание актуально
🔍 Нашли ошибки? Скажите нам, где!

Понравилось? Поделитесь!

Это содержание изначально На французском (См. редактор чуть ниже). Он был переведен и вычитан на разных языках с помощью Deepl и/или Google Translate API, чтобы предложить помощь как можно большему числу стран. Этот перевод обходится нам в несколько тысяч евро в месяц. Если он не является 100 % идеальным, оставьте нам комментарий, чтобы мы могли его исправить. Если вы заинтересованы в вычитке и улучшении качества переведенных статей, пожалуйста, напишите нам, используя контактную форму!
Мы ценим ваши отзывы, чтобы улучшить наш контент. Если вы хотите предложить улучшения, пожалуйста, воспользуйтесь нашей контактной формой или оставьте комментарий ниже. Ваши комментарии всегда помогают нам улучшать качество нашего сайта Alucare.fr


Alucare является независимым СМИ. Поддержите нас, добавив в избранное Google News:

Опубликовать комментарий на дискуссионном форуме