Пытаюсь загрузить/спарсить страницу с помощью fopen(); но часто возвращается ответ 301 Moved Permanently Помогите пожалуйста как сделать так что бы скрипт узнавал если такой ответ приходит и загружал уже новый адрес. Спасибо за помощь заранее.
igordata мне не переход нужен а новый URL помоги пожалуйста, мне надо спарсить по новому урлу если была 302 ошибка
вам же ответили уже. в курле действительно есть опция отвечающая за следование редиректам которые приходят в ответ. если она отключена - курл завершится неудачей но в информации о сессии будет указан соответствующий новый адрес. когда опция включена то автоматом будет получен ресурс по новому адресу. если вам нужен именно новый адрес - разбирайте ответ курла при отключенном фоловинге редиректов если нужено содержимое с нового адреса - включите соответствующую опцию и наслаждайтесь
Ganzal, я не разбираюсь вообще в Курл, мне просто срочно очень нужно решить проблему с 301 ошибкой. Помогите пожалуйста кодом. Заранее спасибо!
регистр с точностью до наоборот - cURL срочно за деньги. пробуйте сами и поможем отредактировать код. там три строки в простом случае. чего вы боитесь-то?
угрожаете?)))) пишите, там три действия всего. слабо себе представляю трудности))) ну разве что библиотека не включена)))
Нет не угрожаю) Откопал тут такую штуку Код (Text): $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $site); curl_setopt($ch, CURLOPT_TIMEOUT, 10); // Сколько сек. ждать ответ сервреа $site = curl_redir_exec($ch); $site = curl_exec($ch); curl_close($ch); function curl_redir_exec($ch) { static $curl_loops = 0; static $curl_max_loops = 20; if ($curl_loops >= $curl_max_loops) { $curl_loops = 0; return false; } curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $data = curl_exec($ch); list($header, $data) = explode("\n\n", $data, 2); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($http_code == 301 || $http_code == 302) { $matches = array(); preg_match('/Location:(.*?)\n/', $header, $matches); $url = @parse_url(trim(array_pop($matches))); if (!$url) { $curl_loops = 0; return $data; } $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)); if (!$url['scheme']) $url['scheme'] = $last_url['scheme']; if (!$url['host']) $url['host'] = $last_url['host']; if (!$url['path']) $url['path'] = $last_url['path']; $new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:''); //echo 'Пожалуйста, укажите следующий URL для правильного отображения контенте - '.$new_url; curl_setopt($ch, CURLOPT_URL, $new_url); return curl_redir_exec($ch); } else { $curl_loops = 0; return $data; } } Только не пойму где тут что, не зная команд сложно разобраться, но все таки усиленно копаюсь Добавлено спустя 11 минут 43 секунды: Ganzal, я правильно понял так надо да? $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $site); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); // Сколько сек. ждать ответ сервреа $page = curl_exec($ch); $matches = array(); preg_match('/Location.*?)\n/', $header, $matches); $url = @parse_url(trim(array_pop($matches))); $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)); if (!$url['scheme']) $url['scheme'] = $last_url['scheme']; if (!$url['host']) $url['host'] = $last_url['host']; if (!$url['path']) $url['path'] = $last_url['path']; $new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:''); echo $new_url; curl_close($ch); Добавлено спустя 1 минуту 19 секунд: Не работает..
Ganzal, а что такого я откопал? Стойте не подсказывайте, я почти докопался до истины Добавлено спустя 5 минут 1 секунду: Ура заработало!!!! Теперь я получаю html код страницы (углубленного?) редиректа )))))))!!!!
я не знаю автора но он зачем-то очень сильно усложнил алгоритм. у меня даже нет идей зачем нужно было так делать. очень многое из написанного решается другими функциями. видимо, человек участвовал в конкурсе не применения стандартных методик )))) $ch = curl_init(); // действие раз. объявили ресурс curl_setopt_array( $ch, array( // действие два. установили опции. CURLOPT_FOLLOWLOCATION => true, // следовать перенаправлениям... CURLOPT_MAXREDIRS => 10, // ... но не более 10 раз CURLOPT_RETURNTRANSFER => true, // смешная третья опция CURLOPT_TIMEOUT => 10, // Сколько сек. ждать ответ сервреа (комментарий взят из вашего сообщения, порядок букв сохранен) CURLOPT_URL => $site // вот этой строки можно избегать инициализируя сразу с адресом. но вам проще иметь ее тут. )); // конец второго действия $page = curl_exec($ch); // действие третье и последнее. выполняем запрос и подзапросы (если необходимо) единожды вернув содержимое запрошенного ресурса в случае успеха. Добавлено спустя 1 минуту 57 секунд: ну вот эта конструкция выписала диагноз листингу =) Код (Text): $site = curl_redir_exec($ch); $site = curl_exec($ch);
да в мане php и читайте. ничего особенного в функциональном применении этой библиотеки не нужно знать - все само за себя говорит. вот консольное применение это минное поле в своем роде))) удачи!)
Ну почитаем тогда Добавлено спустя 2 минуты 26 секунд: Не подскажите как решить проблему с иероглифами? У меня скрипт в UTF-8 а загружаемая страница в windows-1251, как перекодировать? пробую iconv но не помогает Добавлено спустя 8 минут 43 секунды: Все разобрался сам )))) Код (Text): if($charset['2']!='' and $charset['2']!='utf-8') { $html=iconv($charset['2'], 'utf-8', $html); echo 'Конвертировано из '.$charset['2'].' в utf-8'; }