Как соскоблить «https://shopee.co.id/search?ключевое слово=телефон» с библиотекой goutte в laravel?

#javascript #php #laravel #goutte

Вопрос:

Я хочу получить значение из приведенного ниже кода, но результат пуст.

 namespace AppHttpControllers;

use IlluminateHttpRequest;
use GoutteClient;

class ScrapeController extends Controller
{
    private $results = array();

    public function scraper(){
        $client = new Client();
        $raw = $client->request('GET', 'https://shopee.co.id/search?keyword=phone');
        $raw->filter('.col-xs-2-4')->each(function ($item) {
            $this->results[$item->filter('._1nHzH4')->text()] = $item->filter('_32hnQt')->text();
            
        });
        return $this->results;
    }
}
 

этот код не может работать. Кто-нибудь может подсказать мне решение?

Комментарии:

1. возвращаемый HTML https://shopee.co.id/search?keyword=phone — код не содержит элементов с таким именем класса — элементы создаются динамически (с использованием javascript, загруженного в этот html — документ) — ваш код оценивает и запускает javascript-если нет, то вы не можете так легко отказаться от этого сайта

2. @JaromandaX оке, я вижу. но если это динамический элемент, как я могу получить реальный элемент?

3. Я не говорил, что ЭТО динамический элемент (что бы ЭТО ни было) … Я сказал, что те элементы, которые вы ищете, создаются динамически, они «реальны», просто их нет в HTML-документе, который вы получаете

4. @JaromandaX да, я это знаю. я просто хочу получить цену и название продукта, но я не могу найти, где класс или идентификатор, который я могу использовать в качестве объекта фильтра.

5. потому что его там нет, как я уже дважды говорил

Ответ №1:

Используйте HTTP-клиент Guzzle для выполнения исходящего запроса из приложения Laravel.

 private $results = array();

public function scraper(){
    $client = new Client();
    $guzzleClient = new GuzzleClient(array());
    $client->setClient($guzzleClient);
    //then make request
    $raw = $client->request('GET', 'https://shopee.co.id/search?keyword=phone');
    $raw->filter('.col-xs-2-4')->each(function ($item) {
        $this->results[$item->filter('._1nHzH4')->text()] = $item->filter('_32hnQt')->text();
        
    });
    return $this->results;
}
 

Ответ №2:

Это происходит, потому что содержимое страницы загружается через JavaScript, если вы хотите скрести страницы вам необходимо выполнить JavaScript сначала с инструментом помощи PhantomJS или использовать PHP-библиотеку https://github.com/jonnnnyw/php-phantomjs.
так что в вашем случае действия будут:
1: запустить JavaScript с помощью помощи PhantomJS и получить необработанный HTML
2: передать HTML в гут, а затем фильтровать данные

Комментарии:

1. извините, phantomjs должен использовать laravel 5 или 6 ? потому что, когда я всегда получаю ошибку при установке фантома с композитором

2. Я точно не знаю, но v6 или 7 должны быть в порядке

3. могу я получить какой-нибудь источник для чтения? потому что я пытался, но когда я пытаюсь ввести composer require «jonnyw/php-phantomjs:4.*» в терминале, я всегда получаю ошибку «Ваши требования не могут быть разрешены для устанавливаемого набора пакетов».