2010-08-30 157 views
1

我想通過curl_exec得到幾個頁面,第一頁是正常來的,但所有其他 - 302 header,什麼原因?php多捲曲問題

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, ROOT_URL); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
$content = curl_exec($curl); // here good content 
curl_close($curl); 

preg_match_all('/href="(\/users\/[^"]+)"[^>]+>\s*/i', $content, $p); 

for ($j=0; $j<count($p[1]); $j++){ 
    $new_curl = curl_init(); 
    curl_setopt($new_curl, CURLOPT_URL, NEW_URL.$p[1][$j]); 
    curl_setopt($new_curl, CURLOPT_RETURNTRANSFER, 0); 
    $content = curl_exec($new_curl); // here 302  
    curl_close($new_curl); 

preg_match('/[^@][email protected][^"]+/i', $content, $p2); 

}

水木清華這樣

+2

一些代碼,幫助我們 – 2010-08-30 12:32:48

+0

如果手動打你從你的preg_match_all數據生成的URL會發生什麼在瀏覽器中?那些嘗試是否也重定向?您是否驗證過您構建的網址是有效的? – 2010-08-30 13:44:24

回答

1

你可能需要提供你的代碼的樣本,所以我們可以看到,如果你忽略的東西。

302響應代碼通常表示服務器將您重定向到其他位置(在Location響應標頭中找到)。根據您使用的標誌,CURL可以自動檢索,也可以觀察302響應並自行檢索。

這裏是你怎麼能夠讓CURL遵循重定向(其中$ CH是手柄的捲曲連接):

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// allow redirects 
+0

您可能也有興趣CURLOPT_MAXREDIRS和CURLOPT_AUTOREFERER – VolkerK 2010-08-30 12:36:16

+0

我可以得到頁面內容(無重定向)如果我將在我的腳本中做一個curl_exec調用,所以問題不在重定向。也許這是網站(我想解析)限制... – hippout 2010-08-30 12:39:15

+0

@hippout:「所以問題不在重定向」 - 302/303是相當明確的。是的,也許這是對遠程站點的限制。也許您一次不能獲取多個文檔。讓curl遵循重定向,然後看_this_文檔,然後包含一條錯誤消息。 – VolkerK 2010-08-30 13:17:36

-1

您可以使用捲曲多,其速度更快,可以從得到的數據全部網址是平行的。 您可以使用它像這樣

//Initialize 
$curlOptions = array(CURLOPT_RETURNTRANSFER => 1);//Add whatever u additionally want. 
$curlHandl1 = curl_init($url1); 
curl_setopt_array($curlHandl1, $curlOptions); 

$curlHandl2 = curl_init($url2); 
curl_setopt_array($curlHandl2, $curlOptions); 

$multi = curl_multi_init(); 
curl_multi_add_handle($multi, $curlHandle1); 
curl_multi_add_handle($multi, $curlHandle2); 

//Run Handles 
$running = null; 
do { 
    $status = curl_multi_exec($mh, $running); 
} while ($mrc == CURLM_CALL_MULTI_PERFORM); 

while ($running && $status == CURLM_OK) { 
    if (curl_multi_select($mh) != -1) { 
    do { 
     $status = curl_multi_exec($mh, $running); 
    } while ($status == CURLM_CALL_MULTI_PERFORM); 
    } 
} 

//Retrieve Results 
$response1 = curl_multi_getcontent($curlHandle1); 
$status1 = curl_getinfo($curlHandle1); 

$response1 = curl_multi_getcontent($curlHandle1); 
$status1 = curl_getinfo($curlHandle1); 

您可以在這裏找到http://www.php.net/manual/en/function.curl-multi-exec.php 結帳更多信息示例1