使用PHP和Curl获取网页的不同结果

时间:2015-04-24 15:10:38

标签: php curl

如果我使用此代码获取网页 -

$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。

卷曲代码有什么问题,或者如果没有什么明显的,我该怎么调试呢?

3 个答案:

答案 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版本。