темный логотип proxyscrape

Веб-скраппинг с помощью языка программирования PHP

Путеводители, Как сделать, Скрапинг, Дек-25-20245 минут чтения

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

Если вы любитель PHP, Goutte - это фантастическая библиотека, которую стоит рассмотреть для ваших потребностей в веб-скреппинге. Goutte легкая, удобная и мощная, сочетающая в себе возможности HTTP-клиента Guzzle и DomCrawler от Symfony для плавного и эффективного веб-скраппинга.

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

Почему стоит выбрать Goutte для веб-скрапинга?

Goutte завоевала популярность среди разработчиков по ряду причин, что делает ее одной из самых популярных библиотек для скраппинга на PHP:

  • Простой и понятный API: Goutte предоставляет чистый и интуитивно понятный интерфейс, который легко освоить даже новичкам.
  • Бесшовная интеграция: Он объединяет HTTP-запросы с разбором HTML, устраняя необходимость в отдельных библиотеках.
  • Мощные возможности: Goutte поддерживает такие расширенные функции, как обработка сессий, управление cookies и программная отправка форм.
  • Удобный для начинающих, но при этом надежный: В нем есть все необходимое для начала работы: от простейших задач по скрапбукингу до более сложных проектов.

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

Установка Goutte

Прежде чем приступать к кодированию, убедитесь, что для этого есть все необходимые условия:

  • PHP установлен: Убедитесь, что в вашей среде разработки установлен PHP 7.3 или выше. Загрузите PHP напрямую по этой ссылке.
  • Установлен Composer: Composer необходим для управления зависимостями и установки Goutte.

Чтобы установить Goutte, просто выполните следующую команду в терминале:

composer require fabpot/goutte

После установки убедитесь, что библиотека доступна, потребовав автозагрузку Composer в вашем проекте:

require 'vendor/autoload.php';

Теперь вы готовы приступить к скрапбукингу!

Ваш первый скрипт для веб-скрапинга с помощью Goutte

Давайте начнем с простого примера. С помощью Goutte мы выберем заголовок веб-страницы. Ниже приведен базовый скрипт:

Получение и отображение заголовка страницы

<?php
require 'vendor/autoload.php';

use Goutte\Client;

// Initialize Goutte Client
$client = new Client();

// Send a GET request to the target URL
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract the title of the page
$title = $crawler->filter('title')->text();
echo "Page Title: $title\n";

// Extract the titles of the first 5 books
echo "First 5 Book Titles:\n";
$crawler->filter('.product_pod h3 a')->slice(0, 5)->each(function ($node) {
    echo "- " . $node->attr('title') . "\n";
});
?>

Выход:

Название страницы: Все товары | Книги для скрапбукинга - Песочница
Первые 5 названий книг:
- Свет на чердаке
- Tipping the Velvet
- Soumission
- Острые предметы
- Sapiens: Краткая история человечества

Это так просто! С помощью всего нескольких строк кода вы можете получить и отобразить названиетег любой веб-страницы.

Извлечение данных из веб-страниц

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

Extracting All Links (`<a>` Tags)

Следующий скрипт извлекает href атрибуты всех <a> теги на веб-странице:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract all <a> tags
$links = $crawler->filter('a')->each(function ($node) {
    return $node->attr('href');
});

// Print all extracted links
foreach ($links as $link) {
    echo $link . "\n";
}

Это вернет все гиперссылки, присутствующие на странице.

Извлечение содержимого по классу или идентификатору

Goutte позволяет легко извлекать или анализировать данные из HTML с помощью класс или ID селекторы. В этом примере мы будем использовать Книги для соскабливания сайта. В частности, мы будем собирать информацию о каждой книге, поскольку все они имеют один и тот же класс, подставка для продуктов. Вот как это выглядит на сайте:

Вот пример того, как этого можно добиться с помощью Goutte:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract all <a> tags
$links = $crawler->filter('a')->each(function ($node) {
    return $node->attr('href');
});

// Print all extracted links
foreach ($links as $link) {
    echo $link . "\n";
}

// Extract elements with class 'product_pod'
$products = $crawler->filter('.product_pod')->each(function ($node) {
    return $node->text();
});

// Print all extracted product details
foreach ($products as $product) {
    echo $product . "\n";
}

Навигация между страницами

Теперь давайте рассмотрим, как осуществлять навигацию или пагинацию между страницами. На странице примера, которую мы используем, есть кнопка "Далее", которая позволяет перейти к следующей странице. Мы воспользуемся этой кнопкой для реализации постраничной навигации.

Сначала мы определим местоположение кнопки с помощью ее класс атрибут, имеющий значение следующий . Внутри этого элемента есть <a> тег, содержащий URL следующей страницы. Извлекая этот URL, мы можем использовать его для отправки нового запроса и плавного перехода на следующую страницу.Вот внешний вид и структура HTML следующий Кнопка на странице.

Вот как выглядит код, с помощью которого это достигается:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Handle pagination using the 'next' button
while ($crawler->filter('li.next a')->count() > 0) {
    $nextLink = $crawler->filter('li.next a')->attr('href');
    $crawler = $client->request('GET', 'https://books.toscrape.com/catalogue/' . $nextLink);
    
    // Extract and print the current page URL
    echo "Currently on: " . $crawler->getUri() . "\n";
}

При таком подходе можно автоматизировать переход между страницами и продолжать собирать данные.

Работа с формами с помощью Goutte

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

Вот как выглядит код для отправки этой формы:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://www.scrapethissite.com/pages/forms/');

// Submit the search form with a query
$form = $crawler->selectButton('Search')->form();
$form['q'] = 'Canada';

$crawler = $client->submit($form);

// Extract and print the results
$results = $crawler->filter('.team')->each(function ($node) {
    return $node->text();
});

foreach ($results as $result) {
    echo $result . "\n";
}

Этот скрипт заполняет поле формы с именем q со значением скраппинг и отправляет его. Отсюда можно извлекать содержимое страницы с результатами поиска, как в предыдущих примерах.

Обработка ошибок и лучшие практики

Обработка сетевых ошибок

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

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();

try {
    $crawler = $client->request('GET', 'https://invalid-url-example.com');
    echo "Page title: " . $crawler->filter('title')->text();
} catch (Exception $e) {
    echo "An error occurred: " . $e->getMessage();
}
}

Соблюдение Robots.txt

Веб-скраппинг всегда должен выполняться этично и ответственно. Файл `robots.txt`- это простой текстовый файл, используемый веб-сайтами для связи с веб-краулерами, в котором указывается, к каким частям сайта можно или нельзя получить доступ. Прежде чем приступать к скраппингу, важно проверить файл `robots.txt`, чтобы убедиться, что вы следуете правилам сайта и соблюдаете его условия. Игнорирование этих рекомендаций может привести к юридическим и этическим проблемам, поэтому всегда уделяйте этому шагу первостепенное внимание в процессе скраппинга.

Подробнее о robots.txt здесь.

Ограничение скорости

Будьте вежливы и не отправляйте слишком много запросов за короткий промежуток времени, так как это может перегрузить сервер и нарушить его работу для других пользователей. Рекомендуется делать небольшую задержку между каждым запросом, чтобы минимизировать нагрузку на сервер и обеспечить эффективную обработку трафика. Выполнение этих шагов не только помогает поддерживать стабильность работы сервера, но и демонстрирует ответственное и внимательное отношение к использованию общих ресурсов.

sleep(1); // Подождите 1 секунду между запросами

Распространенные подводные камни

  • Многие современные веб-сайты используют JavaScript для загрузки контента, а это значит, что традиционные инструменты для соскабливания могут не собрать все необходимые данные. Такие инструменты, как Puppeteer или Selenium, могут имитировать взаимодействие с пользователем и загружать контент так, как это делает браузер.
  • Во избежание ошибок убедитесь, что конечные точки HTTPS, с которых производится поиск, имеют действующие сертификаты. Недействительные или просроченные сертификаты могут привести к сбою в работе скрепера или вызвать проблемы с безопасностью. Всегда проверяйте статус сертификата перед скраппингом и используйте библиотеки, которые легко справляются с этими проблемами.

Заключение

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