Скрапинг с Goutte (crawler). Парсинг сайтов с использованием библиотеки Goutte

Аватарка пользователя Prog-Time
Отредактировано

Показываем PHP-библиотеку для парсинга (скрапинга) сайтов. Вы сможете забирать любую информацию со стороннего сайта и отправлять формы.

3К открытий3К показов

В новой записи я вам покажу PHP библиотеку для парсинга (скрапинга) сайтов. С помощью данной библиотеки вы сможете забирать любую информацию со стороннего сайта, переходить по ссылкам, автоматически отправлять формы.

Превью видео ndQeeTfgkGA

Подключение библиотеки Goutte и создание запроса на сайт

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

			/* подключаем файлы полученные через Composer */
require __DIR__ . "/vendor/autoload.php";
use GoutteClient;
use SymfonyComponentHttpClientHttpClient;

/* создаём объект и делаем запрос на сайт Prog-Time */
$client = new Client();
$crawler = $client->request('GET', 'https://prog-time.ru/');
		

Получение текстовой информации с помощью Goutte

Используя метод filter вы можете указать селектор для выборки элементов. Так как на данной странице используется несколько элементов с классом home_heading_post мы будем использовать метод each.

			$crawler->filter('.bottom_list_last_posts .home_link_post .home_heading_post')->each(function ($node) {
var_dump($node->text());
});
		

Получение атрибута href ссылки

			$crawler->filter('.bottom_list_last_posts .home_link_post')->each(function ($node) {var_dump($node->attr("href"));});
		

Получение атрибута src изображения

			$crawler->filter('.bottom_list_last_posts .home_link_post img')->each(function ($node) {var_dump($node->attr("src"));});
		

Фильтрация выборки (выборка элементов через один)

Используйте метод reduce для указания функции для фильтрации выборки. В моём примере указана функция которая задаёт порядок «через 1» и “каждый десятый элемент”.

			$newListLinks = $crawler->filter('.home_link_post .home_heading_post') ->reduce(function ($node, $i) {return ($i % 2) == 0;
// return ($i % 10) == 0;
})->each(function ($node) {
var_dump($node->text());
});
		

Получение элемента указанного порядка

С помощью метода eq вы можете указать номер элемента. Нумерация идёт с 0, поэтому в моём примере и мы получим 4 элемент с классом “home_heading_post”.

			$itemPost = $crawler->filter('.home_link_post .home_heading_post')->eq(3);
var_dump($itemPost->text());
		

Получение первого и последнего элемента

first() — возвращаем первый элемент.
last() — возвращает последний элемент.

			$firstItem = $crawler->filter('.home_link_post .home_heading_post')->first();
$lastItem = $crawler->filter('.home_link_post .home_heading_post')->last();
var_dump(lastItem->text());
		

Получение соседнего элемента на уровне в дереве DOM

siblings() — возвращает соседние элементы в дереве DOM.

			siblingsItem->text());
		

Получение ссылки по тексту и нажатие на ссылку

С помощью метода selectLink() получаем ссылку, в качестве параметра передадим текст внутри ссылки.

С помощью метода link() переходим по ссылке и получаем новую страницу.

С помощью метода getUri() получаем URI ссылки.

			$linkPost = $crawler->selectLink('Парсинг на PHP с формированием данных в Excel');
$link = $linkPost->link();
var_dump($link);uri);
		

Получение объекта изображения

			$imagesPost = $crawler->selectImage('Парсинг на PHP с формированием данных в Excel');
$image = $imagesPost->image();
var_dump($image);
		

Получение дочерних элементов

			$childrenItems = $crawler->filter('.header_post_list')->children();
var_dump($childrenItems);
		

Отправка формы с помощью Goutte

			/* получаем страницу с формой */
$crawler = $client->request('GET', 'https://prog-time.ru/test_form.php');

/* находим кнопку для отправки формы */
$form = $crawler->selectButton('Отправить')->form();

/* передаём параметры формы и отправляем запрос */
form, ['name' => 'Илья','phone' => '+7(999)999-99-99',]);
		
Следите за новыми постами
Следите за новыми постами по любимым темам
3К открытий3К показов