Простой PHP парсер не запускается
Пытаюсь написать простой PHP парсер для wildberries. По задумке, он должен парсить названия и цены товаров с выбранной категории и выдавать в консоль. Аналогичный парсер у меня работал на более простом сайте, я писал его точно также, но здесь он не работает. UPD: консоль пустая. Я подумал, что ему не нравится url с кириллицей и закодировал его, но результат аналогичный.
<?php
# scraping goods: https://www.wildberries.ru/
require 'vendor/autoload.php';
$httpClient = new \Goutte\Client();
//code url https://www.wildberries.ru/catalog/0/search.aspx?search=корректор%осанки/
$response = $httpClient->request('GET', 'https://www.wildberries.ru/catalog/0/search.aspx?search=%D0%BA%D0%BE%D1%80%D1%80%D0%B5%D0%BA%D1%82%D0%BE%D1%80%25%D0%BE%D1%81%D0%B0%D0%BD%D0%BA%D0%B8/');
// get prices into an array
$prices = [];
$response->filter('div.catalog-page div.catalog-page__main div.catalog-page__content div.product-card-overflow div.product-card-list div div a div.product-card__brand div.product-card__price span ins')
->each(function ($node) use (&$prices) {
$prices[] = $node->text();
});
// echo titles and prices
$priceIndex = 0;
$response->filter('div.catalog-page div.catalog-page__main div.catalog-page__content div.product-card-overflow div.product-card-list div div a div.product-card__brand p span.brand-name')
->each(function ($node) use ($prices, &$priceIndex) {
echo $node->text() . ' @ ' . $prices[$priceIndex] .PHP_EOL;
$priceIndex++;
});
Я пробовал указать адрес не через CSS-селекторы, а через XPath :
$titles = $response->evaluate('div[@class="catalog-page"]//div[@class="catalog-page__main"]//div[@class="catalog-page__content"]//div[@class="product-card-overflow"]//div[@class="product-card-list"]////div//div//a//div[@class="product-card__brand"]//p/span[@class"=brand-name"]');
$prices = $response->evaluate('div[@class="catalog-page"]//div[@class="catalog-page__main"]//div[@class="catalog-page__content"]//div[@class="product-card-overflow"]//div[@class="product-card-list"]//div//div//a//div[@class="product-card__brand"]//div[@class="product-card__price"]//span/ins');
Но и это не дало результата. Однако появились ошибки типа 'warning'
composer.json :
"minimum-stability": "dev",
"prefer-stable": true,
"require": {
"php": ">=7.4",
"guzzlehttp/guzzle": "^7.5",
"fabpot/goutte": "^4.0",
"simplehtmldom/simplehtmldom": "^2.0@RC"
}
Спасибо за внимание, буду признателен за ваши советы.
Ниже аналогичный, но рабочий код с более простого сайта:
<?php
# scraping books to scrape: https://books.toscrape.com/
require 'vendor/autoload.php';
$httpClient = new \Goutte\Client();
$response = $httpClient->request('GET', 'https://books.toscrape.com/');
$titles = $response->evaluate('//ol[@class="row"]//li//article//h3/a');
$prices = $response->evaluate('//ol[@class="row"]//li//article//div[@class="product_price"]//p[@class="price_color"]');
// we can store the prices into an array
$priceArray = [];
foreach ($prices as $key => $price) {
$priceArray[] = $price->textContent;
}
// we extract the titles and display to the terminal together with the prices
foreach ($titles as $key => $title) {
echo $title->textContent . ' @ '. $priceArray[$key] . PHP_EOL;
}
Источник: Stack Overflow на русском