關於curl跳轉抓取


今天在公司碰到了一個bug,就是以前一直用curl下載的MP3錄音文件為空了,但是瀏覽器去get請求是有文件的,並且大小還不是0kb,但是我用curl下載下來就是0K,百思不得其解。終於功夫不負有心人,得到了方法,原來我一直要去第三方的接口拿到錄音數據,但是今天的錄音數據中地址跳轉了,也就是第一次請求的地址返回的是302,

這是以前的代碼

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
// curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); $info = curl_exec($ch);

也就是說curl在第一次請求額時候,服務器返回302,其實是要跳轉的,但是curl是默認沒有跳轉的,所以$info一直就是空的

改進之后

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); $info = curl_exec($ch);

這次是多了 CURLOPT_FOLLOWLOCATION,表示允許curl去跳轉。$info數據有了!

ps:關於資料

curl_setopt($ch, CURLOPT_MAXREDIRS,20); curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
CURLOPT_FOLLOWLOCATION即表示自動進行跳轉抓取,CURLOPT_MAXREDIRS表示最多允許跳轉多少次。
不過在使用時需要注意:CURLOPT_FOLLOWLOCATION需要在安全模式關閉未設置open_basedir的情況下才能使用。open_basedir是php.ini中的一項設置,功能是將用戶可操作的文件限制在某目錄下。
如果開戶了安全模式,或者設置了open_basedir,則無法使用自動跳轉抓取,此時可以采用連續抓取的辦法來抓取最終頁面。為加快速度和減少不必要的開銷,可以在中間非目標頁面的抓取過程中使用
curl_setopt($rch, CURLOPT_HEADER, TRUE); curl_setopt($rch, CURLOPT_NOBODY, TRUE);
只抓取頭信息,不抓取頁面內容,對header信息的狀態碼(301,302)進行判斷。如需跳轉,則從Location中獲取到跳轉的地址,再次進行抓取,直至狀態碼為200狀態。最后再對目標頁面進行抓取


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM