@Rab1d

Пытаюсь парсить товары с магазина ДНС, но почему получаю всё время array(0) PHP?

Сайты которые не особо такие известные и простые парсятся легко, а днс и ситилинк не хотят.
В общем, пишу код(который снизу напишу) и при запросе не могу получить хотя бы ссылку на товар. Путь указываю правильно и классы тоже, и теги, но постоянно при выводе пишет array(0) { }
Есть же наверное какие-то способы обойти эту защиту? Использую библиотеку phpQuery по совету ютубера:)
На скрине я пытаюсь хотя бы ссылки на товары вытянуть, но их он не отдаёт. Ситилинк отдавал ссылки, но не отдавал название и цену, а днс вообще всё зажопил.
Фреймворки пока не использую, хотелось бы научиться сначала так делать чтобы знать как это всё работает. Мне ещё подсказали, что можно как-то с их API работать, но я не знаю как это сделать. Такой код разве не должен сработать? Если в кратце что я хочу, то я хочу спарсить просто все товары оттуда(цену, ссылку и название), но столкнулся с проблемой
Код:
<?php 

require_once __DIR__.'/Librarys/phpQuery-onefile.php';

function Parsing($url){
    $url = curl_init($url);
    curl_setopt($url, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($url, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($url, CURLOPT_HEADER, false);
    $result = curl_exec($url);
    curl_close($url);

    return $result;
}

$result = Parsing('https://www.dns-shop.ru/search/?q=%D1%81%D0%BC%D0%B0%D1%80%D1%82%D1%84%D0%BE%D0%BD%D1%8B+%D1%81%D0%B0%D0%BC%D1%81%D1%83%D0%BD%D0%B3&category=17a8a01d16404e77');
$lib_pq = phpQuery::newDocument($result);

$arrDataCards = array();
$listLinks = $lib_pq->find('.catalog-product .catalog-product__name a');
foreach($listLinks as $link){
    $arrDataCards[] = pq($link)->attr('href');
}

var_dump($arrDataCards);
  • Вопрос задан
  • 176 просмотров
Пригласить эксперта
Ответы на вопрос 4
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Каждая защита отличается. Собственно иначе ее бы парсили кому не лень. По этому и подход всегда будет разный. Для начала надо смотреть не результат парсинга, а результат запроса, собственно что получено от сервера, включая код ответа.
Далее уже думать, смотреть что отдает браузер и что он при этом передает в заголовках.
И так до полного просветления.
Ответ написан
Комментировать
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Rab1d, просто проверьте содержимое переменной $result внутри функции Parsing($url), найдите в ней хоть один товар, и может быть сразу всё поймёте.
Ответ написан
Комментировать
@zkrvndm
Софт для автоматизации
Во первых, список товаров сервер ДНС отдает отдельным JSON-ом. Сами по себе эти данные отсутствуют в теле страницы, чтобы понять откуда они берутся надо смотреть вкладку Network браузера и изучать POST / GET запросы, чтобы найти среди них нужный, после чего уже можно повторить такой запрос на PHP.

Во вторых... вы как запрос делаете? Кто же так делает! Надо сначала куки получить, только затем спрашивать сервер, при этом обязательно с передачей тех же заголовков, что обычный браузер передает! И использовать прокси!!!
Ответ написан
Комментировать
firedragon
@firedragon
Senior .NET developer
Возможно они не хотят что бы их парсили?
Ваш выход выводить тело ответа и разбираться что вам пришло.
Это вообще универсальный совет для всего дампинга.
Возможно вам поможет selenium или безголовый браузер
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы