#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.*» в терминале, я всегда получаю ошибку «Ваши требования не могут быть разрешены для устанавливаемого набора пакетов».