Загрузка страницы aliexpress

255
28 октября 2017, 17:39

Питаюсь парсить карточку товаров aliexpress сначала думал буду парсить через Simple HTML DOM но перейдя на мобильную версию, вижу что все ответы получают через ajax:

но выдернуть через curl у меня что то не получается.

function file_get_contents_curl($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}
print_r(file_get_contents_curl('https://m.ru.aliexpress.com/ajaxapi/product/ajaxDetail.do?productId=32832914406'));  

Тут я думаю либо дело в куках либо в заголовках. Даже если так то откуда их брать и как правильно их отправить?

Answer 1

На будущее: можно в хроме нажать правой кнопкой на запрос => Copy => Copy as cUlr и в буфере появится curl команда целиком. Осталось просто вставить в консоль и смотреть результат.

Методом постепенного вычищения лишних заголовков пришел в минимальному виду запроса. На самом деле достаточно добавить заголовок:

CURLOPT_HTTPHEADER => [
    'referer: https://m.ru.aliexpress.com/',
]

Тогда алиекспресс отдаст Вам все, что нужно.

Вот команда для проверки:

curl 'https://m.ru.aliexpress.com/ajaxapi/product/ajaxDetail.do?productId=32679283205' -H 'referer: https://m.ru.aliexpress.com/' --compressed
Answer 2

Не забываем про https.
Как уже сказали выше полный код будет выглядеть так, работает:

function file_get_contents_curl($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_REFERER, 'https://m.ru.aliexpress.com/');
    curl_setopt($ch, CURLOPT_URL, $url);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}
echo file_get_contents_curl('https://m.ru.aliexpress.com/ajaxapi/product/ajaxDetail.do?productId=32832914406');

Вставил в командную строку и получил что то не понятное

Не туда вставляете.

Answer 3

Как вы правильно заметили, дело в куках и заголовках и возможно в передаче данных через POST-запрос:

    $options = array(
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HEADER => true,
        CURLOPT_HTTPHEADER=>array('Content-Type: ...', 'Cookie: ...'),
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => http_build_query($post_fields),
        CURLOPT_CONNECTTIMEOUT => 20,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_TIMEOUT => 20,
        CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'
    );
    $curl = curl_init();
    curl_setopt_array($curl, $options);
    $data = curl_exec($curl);
    curl_close($curl);

В CURLOPT_HTTPHEADER передаете все заголовки (в т.ч. cookies, т.к. последние с точки зрения сервера как раз и являются заголовками), в CURLOPT_USERAGENT передаете заголовок User Agent'а (желательно тот, под которым и были получены cookies).

READ ALSO
Посылка сообщения в другое приложение

Посылка сообщения в другое приложение

Имеются 2 независимых приложения с почти идентичным кодомВ одном из них генерируем сообщение (нажав на мышку) и вместе с сообщением высылается...

336
Умножение длинных чисел

Умножение длинных чисел

Интересует не столько решение, сколько причина по которой программа выводит неверный результат

289
Безопасное сравнение указателей

Безопасное сравнение указателей

Безопасен ли данный код

300
Как заставить Visual Studio работать со свойствами в C++?

Как заставить Visual Studio работать со свойствами в C++?

Visual Studio 2010 на попытку создать свойство у класса пишет:

313