0

我编写了一个简单的 PHP 脚本来使用 CURL 获取网站的源代码:

function file_get_contents_curl($url)
{
$ch = curl_init();

curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_CAINFO, dirname(__FILE__)."/curl/cacert.pem");

$data = curl_exec($ch);
$url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if($data === false)
    return false;
return array("content" => $data, "url" => $url, "httpcode" => $httpcode);
}

$data = file_get_contents_curl("https://www.facebook.com");

print_r($data);

在此示例中,我正在获取 facebook 源,但它获取与不受支持的浏览器相关的页面。事实上,重定向后的最终 URL 是这样的:http: //www.facebook.com/unsupportedbrowser

有什么问题?

4

2 回答 2

17

您必须使用 cURL 设置用户代理,以便 Facebook 识别它,如下所示:

$ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.16 (KHTML, like Gecko) \ 
Chrome/24.0.1304.0 Safari/537.16'
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
于 2012-11-01T20:54:24.877 回答
2

问题是卷曲。

即使您通过浏览器运行脚本,服务器也会发出 cURL 请求,这意味着向目标站点发出的请求是原始的,没有任何客户端信息。

我建议你在谷歌上搜索一些关于如何让你的 curl 伪装成人类的信息,但实际上你应该从发送一个正确的 User-Agent 标头信息以及你的请求开始。

于 2012-11-01T20:54:38.223 回答