PHP Curl после перенаправления

Я пытаюсь быть немного хитрым и в рамках учебного процесса пытаюсь улучшить свои навыки парсинга страниц.

Одна вещь, с которой я столкнулся, которую мне еще предстоит решить, заключается в том, что некоторые сайты будут использовать внутреннюю ссылку, которая затем перенаправляет на внешнюю ссылку.

Что я хочу сделать, так это изменить некоторый код curl, чтобы следовать перенаправлениям до тех пор, пока они не остановятся, а затем получить окончательный URL-адрес места отдыха.

Кто-нибудь порекомендует мне код?

У меня есть это на данный момент, но в данный момент он не следует перенаправлениям должным образом.

        $opts = array(CURLOPT_URL => $url,
                      CURLOPT_RETURNTRANSFER => true,
                      CURLOPT_HEADER => true,
                      CURLOPT_FOLLOWLOCATION => true);      

        $curl = curl_init(); 
        curl_setopt_array($curl, $opts);  
        $str = curl_exec($curl);  
        curl_close($curl);  

person David    schedule 23.04.2012    source источник
comment
Что вы подразумеваете под внутренней ссылкой, которая перенаправляет на внешнюю ссылку? Curl должен перенаправлять с 30 * заголовками, если followlocation включен   -  person Explosion Pills    schedule 24.04.2012


Ответы (2)


Если вы не можете использовать CURLOPT_FOLLOWLOCATION, я предлагаю вам использовать рекурсивный метод, подобный этому:

function getUrl($url, $count) {

    // max number of redirects
    if ($count > 5) {
        return false;
    }

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $data = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);

    if (!$data) {
        return false;
    }

    $dataArray = explode("\r\n\r\n", $data, 2);

    if (count($dataArray) != 2) {
        return false;
    }

    list($header, $body) = $dataArray;
    if ($httpCode == 301 || $httpCode == 302) {
        $matches = array();
        preg_match('/Location:(.*?)\n/', $header, $matches);

        if (isset($matches[1])) {
            return getUrl(trim($matches[1]), $count + 1);
        }
    } else {
        return $body;
    }
}
person Tchoupi    schedule 23.04.2012

person    schedule
comment
Я только что использовал это, и это сработало, как мечта! большое спасибо, что поделились со мной - person David; 24.04.2012
comment
@manish Более простое curl_getinfo($curl, CURLINFO_REDIRECT_URL) по какой-то причине невозможно? - person Svish; 05.01.2016