Простой PHP парсер не запускается

Рейтинг: 0Ответов: 0Опубликовано: 04.03.2023

Пытаюсь написать простой 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;
}

Ответы

Ответов пока нет.