如果我使用此代码获取网页 -
$url="http://sourceforge.net/projects/freetype/files/";
$html = @file_get_contents($url) or die("Could not access file: $url");
然后使用 -
搜索页面$dom = new DOMDocument;
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query("//a[contains(@href,'download?source=files')]");
foreach($nodes as $href) {
if (fnmatch("*.tar.xz", $href->getAttribute('href'))) {
echo $href->getAttribute('href'), PHP_EOL;
} elseif (fnmatch("*.tar.bz2", $href->getAttribute('href'))) {
echo $href->getAttribute('href'), PHP_EOL;
} elseif (fnmatch("*.tar.gz", $href->getAttribute('href'))) {
echo $href->getAttribute('href'), PHP_EOL;
} elseif (fnmatch("*.tgz", $href->getAttribute('href'))) {
echo $href->getAttribute('href'), PHP_EOL;
} elseif (fnmatch("*.zip", $href->getAttribute('href'))) {
echo $href->getAttribute('href'), PHP_EOL;
} else {
echo $href->getAttribute('title'), PHP_EOL;
}
}
我得到了结果:
/freetype2/2.5.5/freetype-2.5.5.tar.bz2: released on 2014-12-30 21:42:44 UTC
这是正确的。
如果我使用此卷曲代码来获取相同的页面 -
function getPage($url, $proxy) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.6) Gecko/ 2009011913 Firefox/3.0.6');
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
// $result contains the output string
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
然后使用与上面相同的DOM代码搜索页面,我得到 -
/freetype2/2.5.5/ft255.zip: released on 2014-12-30 21:42:56 UTC
这是不正确的。页面上没有ft255.zip的实例(使用浏览器中的“查看页面源”),结果中的时差表明curl检索到了不同的页面,或者可能只是更多的html。
卷曲代码有什么问题,或者如果没有什么明显的,我该怎么调试呢?
答案 0 :(得分:0)
什么是浏览器类型? .zip适合个人电脑。 .gz适合linux / mac。
你可以假装成你想要的http://osxdaily.com/2011/07/16/change-user-agent-with-curl/
答案 1 :(得分:0)
Sourceforge根据提供的UserAgent为您的操作系统提供最适合的存档类型:
使用Windows UA,您将获得.zip:
$ curl -s -A "Mozilla/5.0 ;Windows NT 6.3; WOW64; Trident/7.0; rv:11.0; like Gecko" http://sourceforge.net/projects/freetype/files/ | grep "/freetype2/2.5.5/"
<a href="/projects/freetype/files/latest/download?source=files" title="/freetype2/2.5.5/ft255.zip: released on 2014-12-30 21:42:56 UTC">
使用Linux UA,你得到一个.tar.bz2:
$ curl -s -A "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36" http://sourceforge.net/projects/freetype/files/ | grep "/freetype2/2.5.5/"
<a href="/projects/freetype/files/latest/download?source=files" title="/freetype2/2.5.5/freetype-2.5.5.tar.bz2: released on 2014-12-30 21:42:44 UTC">
所以两个结果都是正确的,但是你得到了zip,因为你在CURLOPT_USERAGENT
中提供了一个Windows UserAgent。
答案 2 :(得分:0)
感谢您的回答。 USERAGENT确实是个问题。如你所说, 我把它改成了 -
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/37.0 (X11; U; Linux 3.19.3 i686, en) Gecko/20150410 Firefox/37.0.2');
现在我得到了tar.gz版本。