[英]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=¤tPageNumber=1 [1] => http://www.site.com/savings/viewcircular?promotionId=81498&sneakpeek=¤tPageNumber=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=¤tPageNumber=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.