scraper-apis / yandex-parser
PHP client library for scraping Yandex data (places, reviews, market products) using Apify actors
dev-master
2026-02-20 01:48 UTC
Requires
- php: ^8.3
- guzzlehttp/guzzle: ^7.0
Requires (Dev)
- laravel/pint: ^1.0
- pestphp/pest: ^4.0
- phpstan/phpstan: ^1.0
This package is auto-updated.
Last update: 2026-02-20 01:48:12 UTC
README
English | Русский
PHP-библиотека для парсинга данных Яндекса: организации и места (Яндекс Карты), отзывы (Яндекс Карты), товары (Яндекс Маркет), недвижимость (Яндекс Недвижимость).
Работает через Apify API — запускает акторы и возвращает типизированные DTO.
Установка
composer require scraper-apis/yandex-parser
Быстрый старт
use YandexParser\Client; $client = new Client('apify_api_ваш_токен'); // Поиск ресторанов в Москве $places = $client->scrapePlaces( query: ['ресторан'], location: 'Москва', maxResults: 50, ); foreach ($places as $place) { echo "{$place->title} — {$place->address}" . PHP_EOL; echo "Рейтинг: {$place->rating}, отзывов: {$place->reviewCount}" . PHP_EOL; if ($place->hasContactInfo()) { echo "Тел: {$place->getFirstPhone()}" . PHP_EOL; } }
Методы
Организации (Яндекс Карты)
use YandexParser\Language; $places = $client->scrapePlaces( query: ['стоматология', 'клиника'], location: 'Санкт-Петербург', maxResults: 200, language: Language::Russian, options: [ 'filterRating' => 4.5, 'filterOpenNow' => true, 'filterCardPayment' => true, 'maxPhotos' => 5, ], );
Отзывы (Яндекс Карты)
use YandexParser\ReviewSort; $reviews = $client->scrapeReviews( startUrls: ['https://yandex.ru/maps/org/pushkin/1124715036/'], maxReviewsPerPlace: 100, reviewSort: ReviewSort::Newest, minRating: 1, maxRating: 3, ); foreach ($reviews as $review) { echo "{$review->authorName}: {$review->rating}/5" . PHP_EOL; if ($review->hasBusinessReply()) { echo "Ответ: {$review->getBusinessReplyText()}" . PHP_EOL; } }
Товары (Яндекс Маркет)
use YandexParser\MarketSort; use YandexParser\MarketRegion; $products = $client->scrapeProducts( query: 'ноутбук ASUS', maxItems: 50, region: MarketRegion::Moscow, sort: MarketSort::PriceAsc, options: [ 'priceFrom' => 30000, 'priceTo' => 80000, ], ); foreach ($products as $product) { echo "{$product->title} — {$product->getPriceFormatted()}" . PHP_EOL; echo "Продавец: {$product->sellerName}, рейтинг: {$product->rating}" . PHP_EOL; $discount = $product->getYaBankDiscount(); if ($discount !== null) { echo "Скидка по Я.Банку: {$discount}%" . PHP_EOL; } }
Недвижимость (Яндекс Недвижимость)
use YandexParser\DealType; use YandexParser\PropertyCategory; use YandexParser\RealtySort; $listings = $client->scrapeListings( location: 'Москва', dealType: DealType::Sell, category: PropertyCategory::Apartment, maxItems: 50, sort: RealtySort::PriceAsc, roomsTotal: ['1', '2'], options: [ 'priceMin' => 5000000, 'priceMax' => 15000000, ], ); foreach ($listings as $listing) { echo "{$listing->getAddress()} — {$listing->getPriceValue()} ₽" . PHP_EOL; echo "Площадь: {$listing->getAreaValue()} м², этаж: {$listing->floorsOffered[0] ?? '?'}/{$listing->floorsTotal}" . PHP_EOL; if ($listing->hasPhones()) { echo "Тел: {$listing->getFirstPhone()}" . PHP_EOL; } if (!$listing->isFromOwner()) { echo "Агентство: {$listing->getSellerName()}" . PHP_EOL; } }
Перечисления
| Enum | Значения |
|---|---|
Language |
Auto, Russian, English, Turkish, Ukrainian, Kazakh |
ReviewSort |
Relevance, Newest, Highest, Lowest |
MarketSort |
Default, Popular, PriceAsc, PriceDesc, Rating |
MarketRegion |
Moscow, SaintPetersburg, Yekaterinburg, Kazan, Novosibirsk, NizhnyNovgorod, Samara, RostovOnDon, Krasnodar, Chelyabinsk, Ufa, Perm, Voronezh, Volgograd, Krasnoyarsk, Omsk |
DealType |
Sell, Rent |
PropertyCategory |
Apartment, Rooms, House, Lot, Commercial, Garage |
RealtySort |
Relevance, Newest, PriceAsc, PriceDesc, AreaAsc, AreaDesc, CommissioningDate |
Конфигурация
use YandexParser\Client; use YandexParser\Config; // Изменить таймаут или базовый URL $client = new Client('токен', new Config( apiToken: 'токен', timeout: 600, ));
Обработка ошибок
use YandexParser\Exception\ApiException; use YandexParser\Exception\RateLimitException; try { $places = $client->scrapePlaces(query: ['кафе'], location: 'Казань'); } catch (RateLimitException $e) { sleep($e->retryAfter); // повторить запрос } catch (ApiException $e) { echo "Ошибка API: {$e->getMessage()}" . PHP_EOL; }
Требования
- PHP 8.3+
- Токен Apify API
См. также
- 2GIS Parser PHP — парсинг 2ГИС (организации и отзывы, недвижимость, вакансии)
Лицензия
MIT