2012-09-13 11 views
0

URL의 배열을 입력으로받는 함수가 있습니다. URL의 정확성을 확인했으며 완벽하게 반복 할 수 있습니다. Curl이 올바른 페이지를 다운로드하고 있음을 curl_getinfo를 사용하여 확인했습니다. 그러나 curl (html)의 출력은 모든 페이지에서 동일합니다.PHP Curl 다운로드 문제

다음과
  $urls = array(); 
    $urls = getpages($mainpage); 
    print_r($urls); 
    foreach($urls as $link) { 
     echo $link. '<br><br><br>'; 
     $circdl = my_curl($link); 
     echo $circdl. '<br><br><br>'; 
     $circdl = NULL; 
    } 

URL의의 출력 배열 될 때 :

Array ([0] => http://www.site.com/savings/viewcircular?promotionId=81498&sneakpeek=&currentPageNumber=1 [1] => http://www.site.com/savings/viewcircular?promotionId=81498&sneakpeek=&currentPageNumber=2 

$ 링크도 curl_getinfo에서 컬처럼 적절하게 출력 여기 내 코드입니다. 나는이 루프를 통해 URL의 다른 배열을 실행하고 그들은 잘 작동하지만 여기에 문제가 URL (앰퍼샌드) 형식으로 의심된다. 나는 정말로이 페이지들이 예상대로 다운로드되지 않는 이유를 잘 모르겠다.

function my_curl($url) 
{ 
$timeout=10; 
$error_report=TRUE; 
$curl = curl_init(); 
$cookiepath = drupal_get_path('module','mymodule'). '/cookies.txt'; 

// HEADERS AND OPTIONS APPEAR TO BE A FIREFOX BROWSER REFERRED BY GOOGLE 
$header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
$header[] = "Cache-Control: max-age=0"; 
$header[] = "Connection: keep-alive"; 
$header[] = "Keep-Alive: 300"; 
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"; 
$header[] = "Accept-Language: en-us,en;q=0.5"; 
$header[] = "Pragma: "; // BROWSERS USUALLY LEAVE BLANK 

// SET THE CURL OPTIONS - SEE http://php.net/manual/en/function.curl-setopt.php 
curl_setopt($curl, CURLOPT_URL,   $url ); 
curl_setopt($curl, CURLOPT_USERAGENT,  'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6' ); 
curl_setopt($curl, CURLOPT_HTTPHEADER,  $header ); 
curl_setopt($curl, CURLOPT_REFERER,  'http://www.google.com' ); 
curl_setopt($curl, CURLOPT_ENCODING,  'gzip,deflate' ); 
curl_setopt($curl, CURLOPT_AUTOREFERER, TRUE ); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE ); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE ); 
curl_setopt($curl, CURLOPT_COOKIEFILE,  $cookiepath); 
curl_setopt($curl, CURLOPT_COOKIEJAR,  $cookiepath); 
curl_setopt($curl, CURLOPT_TIMEOUT,  $timeout ); 

// RUN THE CURL REQUEST AND GET THE RESULTS 
$htm = curl_exec($curl); 

// Check for page request 

//$info = curl_getinfo($curl); 
//echo 'Took ' . $info['total_time'] . ' seconds to send a request to ' . $info['url']; 

// ON FAILURE HANDLE ERROR MESSAGE 
if ($htm === FALSE) 
{ 
    if ($error_report) 
    { 
     $err = curl_errno($curl); 
     $inf = curl_getinfo($curl); 
     echo "CURL FAIL: $url TIMEOUT=$timeout, CURL_ERRNO=$err"; 
     var_dump($inf); 
    } 
    curl_close($curl); 
    return FALSE; 
} 

// ON SUCCESS RETURN XML/HTML STRING 
curl_close($curl); 
return $htm; 

}

무엇 매우 흥미로운 것은 내가 실행하는 경우이 있다는 것입니다 : 여기

는 my_curl 기능의

echo my_curl('http://www.site.com/savings/viewcircular?promotionId=81498&sneakpeek=&currentPageNumber=2') 

출력이 정확한지 !! ?? :(

도움을 주셔서 감사합니다.

+0

'my_curl()'메소드의 코드를 관련 코드가있는 함수처럼 보이게 게시 할 수 있습니까? – newfurniturey

+0

방금 ​​두 페이지로 배열을 생성하고 루프를 통해 실행하고 괜찮 았어. 볼 수있는 유일한 차이점은이 $ http://www.site.com 대신 http://www.site.com/savings/viewcircular?promotionId=81498&sneakpeek=¤tPageNumber=1을 보여주는 $ link 변수입니다./savings/viewcircular? promotionId = 81498 & sneakpeek = & currentPageNumber = 1. 나는 이것이 인코딩 문제라고 생각한다. –

답변

0

문제는 URL의 인코딩이 내 기능으로 전달됨을 알았습니다. 실수로 인코딩을 제거하고 "사람이 읽을 수있는"끝을 URL에 추가했습니다. 이로 인해 페이지가 호스트에서 제대로 인식되지 않습니다. 이 문제를 해결하는 방법은 더 나은 판단을 무시하고 인코딩 만 남겨 두는 것입니다. 배열이 전달되면 페이지가 올바르게로드됩니다. 이 사진을 주신 모든 분들께 감사드립니다. 그것은 정말로 나를 곤란하게했다!

여기에 대한 설명은 내 코드의 조각이다 :

function getpages($url) { 
global $host; 
$circdl = my_curl($url); 
$circqp = htmlqp($circdl,'body'); 
//Extract last page number 
$lastpagenumber = $circqp->branch()->find('li[class="last-page"]')->text(); 
$lastpagenumberurl = $circqp->branch()->find('li[class="last-page"]')->children('a')->attr('href'); 
//Extract page link root 
$pagelinkroot = substr_replace($lastpagenumberurl,"",-2); 
$currentpage = "=";    
$lpn = intval($lastpagenumber); 

//Move through the remaining pages 
$pagelinks = array(); 
    for ($i = 1; $i <= $lpn; ++$i) { 
    $pagelinks[] = join(array($host,$pagelinkroot,$currentpage,$i)); 
    } 
    return $pagelinks; 
} 

Substr_replace가 ecoding을 STIP하기 위해 사용되었다. 나는 이것을 20에서 2로 변경하여 끝 부분을 떼어 내고 링크를 통해 반복 한 후에 추가합니다.