Собрался я пропарсить одну страничку, которая требует наличия куки (т.е. сначала нужно залогинится) и столкнулся с проблемой
CURLOPT_FOLLOWLOCATION.
Как известно, на большинстве серверов
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); не работает, т.к. FOLLOWLOCATION считается потенциально небезопасной штукой. А как быть, если страничка, которую нужно вытянуть через cURL, доступна только через пару редиректов по 301 или 302.
Вот люди и придумали workaround: скрипты, которые сами последовательно пробегают по всем редиректам. Например такой:
function curl_flollow_exec($ch, $redirects = 0) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
$data = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (($http_code == 301 || $http_code == 302) && ++$redirects < 10) {
preg_match('/(Location:|URI:)(.*?)\n/', $data, $matches);
if (isset($matches[2])) {
$redirect_url = trim($matches[2]);
if ($redirect_url !== '') {
curl_setopt($ch, CURLOPT_URL, $redirect_url);
return curl_flollow_exec($ch, $redirects);
}
}
}
return $data;
}
function curl_post($url, $data, $set_cookie) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux i686; rv:16.0) Gecko/20100101 Firefox/16.0 Iceweasel/16.0');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS);
$result = curl_flollow_exec($ch);
curl_close($ch);
return $result;
}
В 99 случаях из 100, этот метод прекрасно работает, но, к сожалению, не в моем. Скрипт нормально передает параметры login/password через POST. Сайт их прекрасно проглатывает и ставит нужную куку. Все бы вроде хорошо, но после последнего редиректа на нужную страницу, сервер вместо ее содержимого сообщает что, адрес неверный и того, что я ищу, там нет. Хотя с адресом все в порядке - если вбить его руками, то все нормально. Проблема возникает именно
после редиректа через этот скрипт. Сессия, кстати, при этом тоже не отваливается (скрипт остается авторизованным).
Не могу понять, чего такого не хватает в вышеприведенном скрипте, что отличает результат его работы от обычного cURL с включенным CURLOPT_FOLLOWLOCATION (
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true))? Т.е, по идее, в обоих случаях результат должен быть одинаковым. А-н нет! cURL c
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true) срабатывает правильно и сервер выдает то, что нужно, а скрипт,
эмулирующий FOLLOWLOCATION выдает 404.
Может кто знает, в чем может быть дело? Я себе уже все волосы на всех местах повыдергивал
Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
|
Сообщение отредактировал CyberSEO - 4.11.2013, 18:13