#php #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;
Ответы
Ответ 1
Суть проблемы в следующем: целевой сайт выставляет 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);Ответ 2
Хорошее решение, долго не мог решить эту проблему. Для некоторых сайтов обязательно не только cookie, но и строка user-agent: 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'); после чего все заработало.
Комментариев нет:
Отправить комментарий