簡體   English   中英

PHP Curl下載問題

[英]PHP Curl Download Issues

我有一個函數,將URL數組作為輸入。 我已經驗證了網址的正確性,並且可以完美地遍歷它們。 我還使用curl_getinfo驗證了curl正在下載正確的頁面。 但是,每個頁面的curl(html)輸出都是相同的。 這是我的代碼:

          $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

$ link和curl_getinfo中的curl一樣,也會適當地輸出。 我已經通過該循環運行了另一個URL數組,它們可以正常工作,但是我懷疑這里的問題在於URL的格式(“&”號)。 我真的很困惑為什么這些頁面沒有按預期下載。

這是my_curl函數:

 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;

}

很有意思的是,如果我運行以下命令:

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

輸出是正確的!! ?? :(

謝謝你的幫助!

我發現問題出在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用於指定編碼。 我將其從20更改為2,以剝去末端,然后在通過鏈接的循環之后附加它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM