Питаюсь парсить карточку товаров 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'));
Тут я думаю либо дело в куках либо в заголовках. Даже если так то откуда их брать и как правильно их отправить?
На будущее: можно в хроме нажать правой кнопкой на запрос => 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
Не забываем про 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');
Вставил в командную строку и получил что то не понятное
Не туда вставляете.
Как вы правильно заметили, дело в куках и заголовках и возможно в передаче данных через 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).
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Имеются 2 независимых приложения с почти идентичным кодомВ одном из них генерируем сообщение (нажав на мышку) и вместе с сообщением высылается...
Интересует не столько решение, сколько причина по которой программа выводит неверный результат
Visual Studio 2010 на попытку создать свойство у класса пишет: