Полное руководство по веб-скреппингу с помощью PHP

Автор:

Реакция

Комментарий

PHP служит не только для создания динамических сайтов. Он также может стать помощником в собирать данные в режиме онлайн.

Благодаря специализированным библиотекам вы можете легко установите скребок эффективно. Давайте рассмотрим, как это сделать.

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

Необходимые условия для выполнения скраппинга с помощью PHP

Перед началом работы убедитесь, что :

  • ✅ Иметь основы программирования на PHP.
  • ✅ Иметь знание HTML и CSS для выбора целевых данных для извлечения.
  • ✅ Знайте, как использовать Наберите. Это инструмент для управления зависимостями PHP, необходимый для установки библиотек для скрапинга, таких как Guzzle, Symfony DomCrawler или Goutte.
  • ✅ Иметь локальный веб-сервер для запуска вашего кода (XAMPP, WAMP или MAMP).
  • ✅ Иметь редактор кода для написания PHP-скриптов.

Какие инструменты необходимы для веб-скраппинга с помощью PHP?

Одного PHP недостаточно. Вот библиотеки которые делают скраппинг быстрым и эффективным.

1. Guzzle : HTTP-клиент

Guzzle является наиболее широко используемой библиотекой для отправлять HTTP-запросы. Чтобы установить его с помощью Наберитеоткройте терминал, перейдите в папку с проектом и введите команду :

composer require guzzlehttp/guzzle

Composer загружает библиотеку и делает ее пригодной для использования непосредственно в вашем коде.

Вот пример простого кода для извлечь содержимое URL-адреса :

request('GET', $url);

    // Получение HTTP-кода
    $statusCode = $response->getStatusCode();

    // Получение содержимого страницы
    $content = $response->getBody()->getContents();

    echo "Код HTTP : " . $statusCode . PHP_EOL;
    echo "Содержание страницы:" . PHP_EOL;
    echo $content;

} catch (\Exception $e) {
    echo "Ошибка: " . $e->getMessage();
}

2. Symfony DomCrawler и Goutte: извлечение данных

Для просмотра и анализа HTML широко используются две библиотеки:

  • Symfony DomCrawler который позволяет перемещаться по HTML с помощью селекторов CSS и нацеливаться на определенные элементы.
  • Капля который является оберткой для Guzzle и DomCrawler, значительно упрощает процесс скраппинга.

Пример с Symfony DomCrawler :

request('GET', 'https://exemple.com');

$html = $response->getBody()->getContents();
$crawler = new Crawler($html);

// Выборка по классу
$crawler->filter('.my-class')->each(function ($node) {
    echo $node->text() . PHP_EOL;
});

// Выборка по ID
$crawler->filter('#mon-id')->each(function ($node) {
    echo $node->text() . PHP_EOL;
});

// Выборка по тегам
$crawler->filter('h1')->each(function ($node) {
    echo $node->text() . PHP_EOL;
});

Пример с Goutte

request('GET', 'https://exemple.com');

// Выборка по классу
$crawler->filter('.ma-class')->each(function ($node) {
    echo $node->text() . PHP_EOL;
});

// Выборка по ID
$crawler->filter('#mon-id')->each(function ($node) {
    echo $node->text() . PHP_EOL;
});

// Выборка по тегам
$crawler->filter('p')->each(function ($node) {
    echo $node->text() . PHP_EOL;
});

3. Другие библиотеки и инструменты

Чтобы пойти дальше, вот другие варианты:

  • 🔥 PHP-Scraper : это библиотека PHP, которая упрощает извлечение информации из веб-страниц, управляя сложностями HTML и селекторов. Она широко используется разработчиками в их проектах через Composer.
Установка # с помощью Composer
compose require fabpot/goutte
  

request('GET', 'https://example.com');
$title = $crawler->filter('title')->text();

echo "Заголовок страницы: " . $title;
  
  • 🔥 Яркие данные : это профессиональная платформа для сбора данных в больших объемах со встроенными прокси-серверами.
Bright Data: самый полный инструмент для сбора информации с веб-сайтов.
Bright Data: самый полный инструмент для веб-парсинга. ©Christina для Alucare.fr
  • 🔥 ScraperAPI : это облачный сервис веб-парсинга, доступный через API. Вместо того, чтобы использовать локальные библиотеки для выполнения всей работы, вы отправляете простой запрос в API ScraperAPI, указав URL-адрес страницы, которую нужно парсить.

Как создать простой веб-скребок на PHP?

Вот руководство по созданию функционального скребка на PHP:

Шаг 1: Установка зависимостей

Используйте Наберите установить Капля благодаря :


compose require fabpot/goutte

Шаг 2: Извлечение содержимого страницы

Делать HTTP GET запрос и рпросмотреть содержимое HTML страницы с помощью Goutte с командой :

request('GET', $url);

// Получение необработанного HTML, если требуется
$html = $crawler->html();
echo substr($html, 0, 500) . '...'; // предварительный просмотр

Шаг 3: Извлечение данных

После того, как вы получили HTML-содержимое страницы, цель состоит в том, чтобы извлечь определенные данные.

👉 Вот пример PHP-кода для собирать заголовки со страницы блог с Гоуттом, используя CSS-селектор для нацеливания на <h2> в элементах <article>.

request('GET', $url); // Выберите элементы <h2> в <article> с помощью селектора CSS $titres = [];

$crawler-&gt;filter('article h2')-&gt;each(function ($node) use (&amp;$titres) { // Получить текст заголовка $titres[] = trim($node-&gt;text()); });

// Отобразить извлеченные заголовки print_r($titres); ?&gt;

В данном примере :

  • Мы используем селектор CSS элемент h2 теги для целевых заголовков статей в <h2> внутри тегов <article>.
  • Текст для каждого заголовка извлекается с помощью text(), и добавляем его в таблицу 1TP65Названия.
  • Затем отображаются заголовки с print_r($itles);.

Les Селекторы CSS (или XPath) также можно использовать для извлечь атрибуты элементов HTML. Например, если каждый заголовок блога является ссылкой в теге <a>, мы можем извлечь атрибут href чтобы получить URL-адреса статей.

👉 Вот пример с Goutte для извлечь ссылки статьи :

request('GET', $url);

// Выберите ссылки в заголовках
$itles = [];

$crawler->filter('article h2 a')->each(function ($node) use (&$itles) {
    $itle = trim($node->text());
    $link = $node->attr('href'); // Извлечение атрибута href

    // Добавьте заголовок и URL в таблицу
    $itles[] = [
        title' => $itle,
        url' => $lien,
    ];
});

// Отображение результатов
print_r($itles);
?>

В данном примере :

  • Мы выбираем ссылки, содержащиеся в <a> внутри тегов <h2> в элементах <article>.
  • Мы извлекаем атрибут href каждого звена с attr('href').
  • Названия и их URL-адреса добавляются в таблицу 1TP65Названиязатем отображается с print_r($itles);.

👉 Картина 1TP65Названия будет содержать элементы с обоими название и связь каждого элемента. Вот пример формата возвращаемых данных:

Массив
(
    [0] => Array ()
        (
            [title] => Заголовок статьи 1
            [url] => /article1
        )

    [1] => Array ( [1] => Array )
        (
            [title] => Заголовок статьи 2
            [url] => /article2
        )
)

В данном примере :

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

Этап 4: структурирование и хранение данных

После того как данные извлечены, важно правильно их организовать. Для этого мы структурируем их в формате Таблица PHPзатем экспортируйте их в структурированный формат, например JSON Где CSV.

request('GET', $url);

// Извлеките заголовки и URL в структурированную таблицу
$data = [];
$crawler->filter('article h2 a')->each(function ($node) use (&$data) {
    $data[] = [
        title' => trim($node->text()), // Извлечь заголовок
        url' => $node->attr('href'), // Извлечение атрибута href (URL)
    ];
});

// Отображение извлеченных данных
print_r($data);
?>

После упорядочивания данных вы можете экспортировать их в формате JSONчто полезно для API или для использования в веб-приложениях:

<?php
// Exporter les données en JSON
file_put_contents('export.json', json_encode($data, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE));

echo "Les données ont été exportées en JSON dans 'export.json'.";
?>

Файл export.json будет создан в удобочитаемом формате, который может выглядеть следующим образом:

[
    {
        "title": "Заголовок статьи 1",
        "url": "/article1"
    },
    {
        "title": "Заголовок статьи 2",
        "url": "/article2"
    }
]

Если вы хотите экспортировать данные в таблицу CSV, вы можете использовать fputcsv чтобы записать данные в файл CSV:

<?php
// Exporter les données en CSV
$fp = fopen('export.csv', 'w');

// Ajouter l'en-tête (titres des colonnes)
fputcsv($fp, ['title', 'url']);

// Ajouter chaque ligne de données
foreach ($data as $row) {
    fputcsv($fp, [$row['title'], $row['url']]);
}

// Fermer le fichier
fclose($fp);

echo "Les données ont été exportées en CSV dans 'export.csv'.";
?>

Файл export.csv будет выглядеть следующим образом:

название,url
Заголовок статьи 1,/article1
Заголовок статьи 2,/article2

Как справиться с распространенными проблемами веб-скреппинга в PHP?

Во время операции Веб-скреппинг в PHPОднако проблемы могут возникнуть. Вот решения самых распространенных из них.

1. Управление ошибками

  • Ошибки подключения

Иногда запрос даже не доходит до сервера. Вы можете столкнуться с «Нет сети», «Неверный URL-адрес», «Сервер недоступен»и т.д. В этом случае попытка/захват чтобы ваш скрипт не прервался внезапно.

👉 Вот пример использования Guzzle:

request('GET', 'https://example.com/api/data');
        
        // Проверьте, был ли запрос успешным
        if ($response->getStatusCode() === 200) {
            // Обрабатываем ответ в случае успеха
            $body = $response->getBody();
            echo "Данные получены: " . $body;
        }
        
    } catch (RequestException $e) {
        // Перехватываем ошибки соединения и запроса
        if ($e->hasResponse()) {
            // Выводим код ошибки, если он доступен
            echo "Ошибка запроса: " . $e->getResponse()->getStatusCode();
        } else {
            // Если соединение не удалось (например, сервер недоступен)
            echo "Ошибка соединения: " . $e->getMessage();
        }
    }
}

// Вызов функции
make_request_with_guzzle();
?>
  • Коды состояния HTTP

Даже если соединение работает, сервер может ответить ошибкой (404 = страница не найдена, 500 = ошибка интернетаи т.д.). Вы можете проверить код состояния с помощью getStatusCode().

request('GET', 'https://example.com/api/data');
        
        // Проверьте код состояния ответа
        $status_code = $response->getStatusCode();
        
        // Проверьте, был ли запрос успешным
        if ($status_code === 200) {
            // Обрабатываем ответ в случае успеха
            $body = $response->getBody();
            echo "Ответ успешный с кодом: " . $status_code . "
";
            echo "Данные получены: " . $body;
        } elseif ($status_code === 404) {
            echo "Ошибка 404: Страница не найдена
";
        } elseif ($status_code === 500) {
            echo "Ошибка 500 : Внутренняя ошибка сервера
";
        } else {
            echo "Код статуса: " . $status_code . "
";
        }
        
    } catch (RequestException $e) {
        // Перехватываем ошибки соединения и запроса
        if ($e->hasResponse()) {
            // Выводим код ошибки HTTP, если он доступен
            echo "Ошибка HTTP: " . $e->getResponse()->getStatusCode() . "
";
        } else {
            // В случае обрыва соединения (например, сервер недоступен)
            echo "Ошибка соединения: " . $e->getMessage();
        }
    }
}

// Вызов функции
make_request_with_guzzle();
?>
  • Ошибки парсинга 

Парсинг — это анализ HTML вашим скрейпером. Если страница имеет неправильный формат, DomCrawler или Goutte могут зависнуть или не вернуть никаких результатов.

Чтобы справиться с подобными ошибками, всегда проверяйте наличие контента перед попыткой его извлечения. Используйте условия (count(), filter()...) , чтобы убедиться, что целевой элемент действительно присутствует. Затем оберните разбор в попытка/захват чтобы предотвратить аварийное завершение работы скрипта.

request('GET', 'https://example.com');

        // Проверьте, существует ли целевой элемент, прежде чем пытаться его извлечь
        $elements = $crawler->filter('div.target-element');
        
        if ($elements->count() > 0) {
            // Элемент присутствует, мы можем извлечь его
            $content = $elements->first()->text();
            echo "Извлеченный контент: " . $content;
        } else {
            // Элемент не найден
            echo "Целевой элемент не найден на странице;
        }
        
    } catch (Exception $e) {
        // Вылавливаем ошибки парсинга
        echo "Ошибка при разборе страницы: " . $e->getMessage();
    }
}

// Вызов функции
функция scrape_website();
?>

2. Обход ограничений

Некоторые сайты используют защитные меры, чтобы затруднить скраппинг.

  • ❗ Блокировка по IP Вы можете использовать прокси-серверы, например, на платформе Bright Data.
  • JavaScript по умолчанию PHP не может запустить JavaScript. Для этого необходимо использовать браузер без интерфейса (headless browser).
  • Robots.txt Перед утилизацией важно проверить этот файл, чтобы действовать законно и ответственно.

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

Законен ли веб-скрепинг?

📌 The Законность веб-скреппинга является сложной темой. Во Франции, как и в других странах, все зависит от законодательной базы, собранных данных и способа их использования.

В чем разница между веб-скребком и веб-кроулингом?

  • в скраппинг — это извлечение точных данных с веб-сайта.
  • в просмотр веб-страниц это просмотр страниц с целью их индексации.
Веб-ползание подразумевает автоматический поиск и обнаружение нескольких веб-сайтов, в то время как веб-скраппинг направлен на извлечение точных данных из конкретного объекта с помощью специализированного программного обеспечения.
Веб-краулинг заключается в автоматическом сканировании и обнаружении нескольких веб-сайтов, в то время как веб-скрапинг сосредоточен на извлечении конкретных данных из определенного источника с помощью специального программного обеспечения. ©Christina для Alucare.fr

Как соскрести сайт, требующий аутентификации (входа)?

Чтобы соскоблить сайт, требующий аутентификации, вам нужно имитировать соединение. В PHP наиболее распространенным решением является Guzzle.

Вы отправляете идентификаторы с помощью POST-запроса, а затем сохраняете сессию открытой, чтобы получить защищенные страницы.

Как вы управляете скраппингом сайтов с динамическими страницами, загружаемыми в AJAX?

⚠ Напоминаем, что PHP не может выполнять код JavaScript на стороне клиента.

Чтобы соскрести этот тип страницы с помощью PHP, вы можете использовать BrowserShotбиблиотека, которая использует настоящий браузер в фоновом режиме (Headless Chrome/Chromium) для загрузки страницы и выполнения JavaScript.

Другое решение заключается в том, чтобы интегрировать PHP с инструментами на базе Node.jsнапример, Puppeteer для генерации HTML и последующего получения данных из PHP.

Для всех типов веб-скрапинга с динамическими страницами можно использовать специализированные инструменты, называемые безголовые браузеры.

Есть ли альтернативы PHP для веб-скреппинга?

Да, несколько языков пользуются популярностью:

  • Python с его мощными библиотеками, такими как BeautifulSoup и Scrapy.
  • Node.js который очень эффективен для создания динамических веб-сайтов с помощью таких библиотек, как Puppeteer или Cheerio.
Веб-скраппинг на Python осуществляется с помощью таких библиотек, как BeautifulSoup или Scrapy, для просмотра веб-страниц и автоматического извлечения нужных данных.
Веб-скраппинг с помощью Python - это использование библиотек, таких как BeautifulSoup или Scrapy, для просмотра веб-страниц и автоматического извлечения нужных данных. Кристина для Alucare.fr

Как программировать «скребок» этично и ответственно?

Чтобы скрести по этическим соображениям, вам нужно :

  1. ✔ Проверьте файл robots.txt чтобы узнать правила.
  2. Ограничьте частоту ваших запросов чтобы не перегружать сервер сайта.
  3. Соблюдайте условия использования сайта.
  4. Не собирайте личные данные без разрешения.

✅ В итоге скраппинг это мощная практика, но использовать ее нужно методично и ответственно.

👉 А вы, вы когда-нибудь создавали скребок в PHP или другой язык? Поделитесь своим опытом в разделе комментариев.

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

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


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

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