Страницы

Поиск по вопросам

воскресенье, 31 марта 2019 г.

cURL не работает

Пытаюсь сделать парсер, но не хочет работать, пишет
Object Moved This object may be found here.
Гуглил, но решения не удалось найти. Что за метод защиты стоит, что запрещает парсить данные с данного сайта ?
$url = 'http://elibrary.ru/titles.asp';
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.6 (KHTML, like Gecko) Chrome/16.0.897.0 Safari/535.6'); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); curl_setopt($ch, CURLOPT_REFERER, $url); $content = curl_exec($ch); curl_close($ch); echo $content;


Ответ

Суть проблемы в следующем: целевой сайт выставляет cookie для идентификации пользователя и отдает код 302 Moved Temporarily + заголовок Location. Это что-то вроде защиты от простеньких парсеров, не способных работать с cookie.
Если говорить о вашем коде, то опция CURLOPT_FOLLOWLOCATION выставленная в false (или 0), запрещает переходы по ссылкам из Location. Поэтому вы видите в ответе:
Object moved
Выставление CURLOPT_FOLLOWLOCATION в true (или 1) не помогает в вашем случае потому, что curl по умолчанию все еще не работает с cookie. А чтобы работал, достаточно указать:
curl_setopt($ch, CURLOPT_COOKIEFILE, '');
Пустая строка в качестве значения, указывает curl, что cookie должны быть использованы, однако без сохранения в файловую систему (см. http://php.net/manual/ru/function.curl-setopt.php).
Таким образом, работающий код может выглядеть так:
$url = 'http://elibrary.ru/titles.asp';
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.6 (KHTML, like Gecko) Chrome/16.0.897.0 Safari/535.6');. curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_REFERER, $url); curl_setopt($ch, CURLOPT_COOKIEFILE, ''); $content = curl_exec($ch); curl_close($ch);
echo($content);

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

Отправить комментарий